/** @file | |
Provides some data structure definitions used by the XHCI host controller driver. | |
(C) Copyright 2023 Hewlett Packard Enterprise Development LP<BR> | |
Copyright (c) 2011 - 2017, Intel Corporation. All rights reserved.<BR> | |
Copyright (c) Microsoft Corporation.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef _EFI_XHCI_H_ | |
#define _EFI_XHCI_H_ | |
#include <Uefi.h> | |
#include <Protocol/Usb2HostController.h> | |
#include <Protocol/PciIo.h> | |
#include <Guid/EventGroup.h> | |
#include <Library/BaseLib.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/UefiDriverEntryPoint.h> | |
#include <Library/UefiBootServicesTableLib.h> | |
#include <Library/MemoryAllocationLib.h> | |
#include <Library/UefiLib.h> | |
#include <Library/DebugLib.h> | |
#include <Library/ReportStatusCodeLib.h> | |
#include <Library/TimerLib.h> | |
#include <Library/PcdLib.h> | |
#include <IndustryStandard/Pci.h> | |
typedef struct _USB_XHCI_INSTANCE USB_XHCI_INSTANCE; | |
typedef struct _USB_DEV_CONTEXT USB_DEV_CONTEXT; | |
#include "XhciReg.h" | |
#include "XhciSched.h" | |
#include "ComponentName.h" | |
#include "UsbHcMem.h" | |
// | |
// Converts a count from microseconds to nanoseconds | |
// | |
#define XHC_MICROSECOND_TO_NANOSECOND(Time) (MultU64x32((Time), 1000)) | |
// | |
// The unit is microsecond, setting it as 1us. | |
// | |
#define XHC_1_MICROSECOND (1) | |
// | |
// The unit is microsecond, setting it as 1ms. | |
// | |
#define XHC_1_MILLISECOND (1000) | |
// | |
// XHC generic timeout experience values. | |
// The unit is millisecond, setting it as 10s. | |
// | |
#define XHC_GENERIC_TIMEOUT (10 * 1000) | |
// | |
// XHC reset timeout experience values. | |
// The unit is millisecond, setting it as 1s. | |
// | |
#define XHC_RESET_TIMEOUT (1000) | |
// | |
// TRSTRCY delay requirement in usb 2.0 spec chapter 7.1.7.5. | |
// The unit is microsecond, setting it as 10ms. | |
// | |
#define XHC_RESET_RECOVERY_DELAY (10 * 1000) | |
// | |
// XHC async transfer timer interval, set by experience. | |
// The unit is 100us, takes 1ms as interval. | |
// | |
#define XHC_ASYNC_TIMER_INTERVAL EFI_TIMER_PERIOD_MILLISECONDS(1) | |
// | |
// XHC raises TPL to TPL_NOTIFY to serialize all its operations | |
// to protect shared data structures. | |
// | |
#define XHC_TPL TPL_NOTIFY | |
#define CMD_RING_TRB_NUMBER 0x100 | |
#define TR_RING_TRB_NUMBER 0x100 | |
#define ERST_NUMBER 0x01 | |
#define EVENT_RING_TRB_NUMBER 0x200 | |
#define CMD_INTER 0 | |
#define CTRL_INTER 1 | |
#define BULK_INTER 2 | |
#define INT_INTER 3 | |
#define INT_INTER_ASYNC 4 | |
#define EFI_LIST_CONTAINER(Entry, Type, Field) BASE_CR(Entry, Type, Field) | |
#define XHC_LOW_32BIT(Addr64) ((UINT32)(((UINTN)(Addr64)) & 0xFFFFFFFF)) | |
#define XHC_HIGH_32BIT(Addr64) ((UINT32)(RShiftU64((UINT64)(UINTN)(Addr64), 32) & 0xFFFFFFFF)) | |
#define XHC_BIT_IS_SET(Data, Bit) ((BOOLEAN)(((Data) & (Bit)) == (Bit))) | |
#define XHC_REG_BIT_IS_SET(Xhc, Offset, Bit) \ | |
(XHC_BIT_IS_SET(XhcReadOpReg ((Xhc), (Offset)), (Bit))) | |
#define XHCI_IS_DATAIN(EndpointAddr) XHC_BIT_IS_SET((EndpointAddr), 0x80) | |
#define XHCI_INSTANCE_SIG SIGNATURE_32 ('x', 'h', 'c', 'i') | |
#define XHC_FROM_THIS(a) CR(a, USB_XHCI_INSTANCE, Usb2Hc, XHCI_INSTANCE_SIG) | |
#define USB_DESC_TYPE_HUB 0x29 | |
#define USB_DESC_TYPE_HUB_SUPER_SPEED 0x2a | |
// | |
// The RequestType in EFI_USB_DEVICE_REQUEST is composed of | |
// three fields: One bit direction, 2 bit type, and 5 bit | |
// target. | |
// | |
#define USB_REQUEST_TYPE(Dir, Type, Target) \ | |
((UINT8)((((Dir) == EfiUsbDataIn ? 0x01 : 0) << 7) | (Type) | (Target))) | |
// | |
// Xhci Data and Ctrl Structures | |
// | |
#pragma pack(1) | |
typedef struct { | |
UINT8 ProgInterface; | |
UINT8 SubClassCode; | |
UINT8 BaseCode; | |
} USB_CLASSC; | |
typedef struct { | |
UINT8 Length; | |
UINT8 DescType; | |
UINT8 NumPorts; | |
UINT16 HubCharacter; | |
UINT8 PwrOn2PwrGood; | |
UINT8 HubContrCurrent; | |
UINT8 Filler[16]; | |
} EFI_USB_HUB_DESCRIPTOR; | |
#pragma pack() | |
struct _USB_DEV_CONTEXT { | |
// | |
// Whether this entry in UsbDevContext array is used or not. | |
// | |
BOOLEAN Enabled; | |
// | |
// The slot id assigned to the new device through XHCI's Enable_Slot cmd. | |
// | |
UINT8 SlotId; | |
// | |
// The route string presented an attached usb device. | |
// | |
USB_DEV_ROUTE RouteString; | |
// | |
// The route string of parent device if it exists. Otherwise it's zero. | |
// | |
USB_DEV_ROUTE ParentRouteString; | |
// | |
// The actual device address assigned by XHCI through Address_Device command. | |
// | |
UINT8 XhciDevAddr; | |
// | |
// The requested device address from UsbBus driver through Set_Address standard usb request. | |
// As XHCI spec replaces this request with Address_Device command, we have to record the | |
// requested device address and establish a mapping relationship with the actual device address. | |
// Then UsbBus driver just need to be aware of the requested device address to access usb device | |
// through EFI_USB2_HC_PROTOCOL. Xhci driver would be responsible for translating it to actual | |
// device address and access the actual device. | |
// | |
UINT8 BusDevAddr; | |
// | |
// The pointer to the input device context. | |
// | |
VOID *InputContext; | |
// | |
// The pointer to the output device context. | |
// | |
VOID *OutputContext; | |
// | |
// The transfer queue for every endpoint. | |
// | |
VOID *EndpointTransferRing[31]; | |
// | |
// The device descriptor which is stored to support XHCI's Evaluate_Context cmd. | |
// | |
EFI_USB_DEVICE_DESCRIPTOR DevDesc; | |
// | |
// As a usb device may include multiple configuration descriptors, we dynamically allocate an array | |
// to store them. | |
// Note that every configuration descriptor stored here includes those lower level descriptors, | |
// such as Interface descriptor, Endpoint descriptor, and so on. | |
// These information is used to support XHCI's Config_Endpoint cmd. | |
// | |
EFI_USB_CONFIG_DESCRIPTOR **ConfDesc; | |
// | |
// A device has an active Configuration. | |
// | |
UINT8 ActiveConfiguration; | |
// | |
// Every interface has an active AlternateSetting. | |
// | |
UINT8 *ActiveAlternateSetting; | |
}; | |
struct _USB_XHCI_INSTANCE { | |
UINT32 Signature; | |
EFI_PCI_IO_PROTOCOL *PciIo; | |
UINT64 OriginalPciAttributes; | |
USBHC_MEM_POOL *MemPool; | |
EFI_USB2_HC_PROTOCOL Usb2Hc; | |
EFI_DEVICE_PATH_PROTOCOL *DevicePath; | |
// | |
// ExitBootServicesEvent is used to set OS semaphore and | |
// stop the XHC DMA operation after exit boot service. | |
// | |
EFI_EVENT ExitBootServiceEvent; | |
EFI_EVENT PollTimer; | |
LIST_ENTRY AsyncIntTransfers; | |
UINT8 CapLength; ///< Capability Register Length | |
XHC_HCSPARAMS1 HcSParams1; ///< Structural Parameters 1 | |
XHC_HCSPARAMS2 HcSParams2; ///< Structural Parameters 2 | |
XHC_HCCPARAMS HcCParams; ///< Capability Parameters | |
UINT32 DBOff; ///< Doorbell Offset | |
UINT32 RTSOff; ///< Runtime Register Space Offset | |
UINT16 MaxInterrupt; | |
UINT32 PageSize; | |
UINT64 *ScratchBuf; | |
VOID *ScratchMap; | |
UINT32 MaxScratchpadBufs; | |
UINT64 *ScratchEntry; | |
UINTN *ScratchEntryMap; | |
UINT32 ExtCapRegBase; | |
UINT32 UsbLegSupOffset; | |
UINT32 DebugCapSupOffset; | |
UINT32 Usb2SupOffset; | |
UINT32 Usb3SupOffset; | |
UINT64 *DCBAA; | |
VOID *DCBAAMap; | |
UINT32 MaxSlotsEn; | |
URB *PendingUrb; | |
// | |
// Cmd Transfer Ring | |
// | |
TRANSFER_RING CmdRing; | |
// | |
// EventRing | |
// | |
EVENT_RING EventRing; | |
// | |
// Misc | |
// | |
EFI_UNICODE_STRING_TABLE *ControllerNameTable; | |
// | |
// Store device contexts managed by XHCI instance | |
// The array supports up to 255 devices, entry 0 is reserved and should not be used. | |
// | |
USB_DEV_CONTEXT UsbDevContext[256]; | |
BOOLEAN Support64BitDma; // Whether 64 bit DMA may be used with this device | |
}; | |
extern EFI_DRIVER_BINDING_PROTOCOL gXhciDriverBinding; | |
extern EFI_COMPONENT_NAME_PROTOCOL gXhciComponentName; | |
extern EFI_COMPONENT_NAME2_PROTOCOL gXhciComponentName2; | |
/** | |
Test to see if this driver supports ControllerHandle. Any | |
ControllerHandle that has Usb2HcProtocol installed will | |
be supported. | |
@param This Protocol instance pointer. | |
@param Controller Handle of device to test. | |
@param RemainingDevicePath Not used. | |
@return EFI_SUCCESS This driver supports this device. | |
@return EFI_UNSUPPORTED This driver does not support this device. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcDriverBindingSupported ( | |
IN EFI_DRIVER_BINDING_PROTOCOL *This, | |
IN EFI_HANDLE Controller, | |
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath | |
); | |
/** | |
Starting the Usb XHCI Driver. | |
@param This Protocol instance pointer. | |
@param Controller Handle of device to test. | |
@param RemainingDevicePath Not used. | |
@return EFI_SUCCESS supports this device. | |
@return EFI_UNSUPPORTED do not support this device. | |
@return EFI_DEVICE_ERROR cannot be started due to device Error. | |
@return EFI_OUT_OF_RESOURCES cannot allocate resources. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcDriverBindingStart ( | |
IN EFI_DRIVER_BINDING_PROTOCOL *This, | |
IN EFI_HANDLE Controller, | |
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath | |
); | |
/** | |
Stop this driver on ControllerHandle. Support stopping any child handles | |
created by this driver. | |
@param This Protocol instance pointer. | |
@param Controller Handle of device to stop driver on. | |
@param NumberOfChildren Number of Children in the ChildHandleBuffer. | |
@param ChildHandleBuffer List of handles for the children we need to stop. | |
@return EFI_SUCCESS Success. | |
@return EFI_DEVICE_ERROR Fail. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcDriverBindingStop ( | |
IN EFI_DRIVER_BINDING_PROTOCOL *This, | |
IN EFI_HANDLE Controller, | |
IN UINTN NumberOfChildren, | |
IN EFI_HANDLE *ChildHandleBuffer | |
); | |
/** | |
Retrieves the capability of root hub ports. | |
@param This The EFI_USB2_HC_PROTOCOL instance. | |
@param MaxSpeed Max speed supported by the controller. | |
@param PortNumber Number of the root hub ports. | |
@param Is64BitCapable Whether the controller supports 64-bit memory | |
addressing. | |
@retval EFI_SUCCESS Host controller capability were retrieved successfully. | |
@retval EFI_INVALID_PARAMETER Either of the three capability pointer is NULL. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcGetCapability ( | |
IN EFI_USB2_HC_PROTOCOL *This, | |
OUT UINT8 *MaxSpeed, | |
OUT UINT8 *PortNumber, | |
OUT UINT8 *Is64BitCapable | |
); | |
/** | |
Provides software reset for the USB host controller. | |
@param This This EFI_USB2_HC_PROTOCOL instance. | |
@param Attributes A bit mask of the reset operation to perform. | |
@retval EFI_SUCCESS The reset operation succeeded. | |
@retval EFI_INVALID_PARAMETER Attributes is not valid. | |
@retval EFI_UNSUPPOURTED The type of reset specified by Attributes is | |
not currently supported by the host controller. | |
@retval EFI_DEVICE_ERROR Host controller isn't halted to reset. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcReset ( | |
IN EFI_USB2_HC_PROTOCOL *This, | |
IN UINT16 Attributes | |
); | |
/** | |
Retrieve the current state of the USB host controller. | |
@param This This EFI_USB2_HC_PROTOCOL instance. | |
@param State Variable to return the current host controller | |
state. | |
@retval EFI_SUCCESS Host controller state was returned in State. | |
@retval EFI_INVALID_PARAMETER State is NULL. | |
@retval EFI_DEVICE_ERROR An error was encountered while attempting to | |
retrieve the host controller's current state. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcGetState ( | |
IN EFI_USB2_HC_PROTOCOL *This, | |
OUT EFI_USB_HC_STATE *State | |
); | |
/** | |
Sets the USB host controller to a specific state. | |
@param This This EFI_USB2_HC_PROTOCOL instance. | |
@param State The state of the host controller that will be set. | |
@retval EFI_SUCCESS The USB host controller was successfully placed | |
in the state specified by State. | |
@retval EFI_INVALID_PARAMETER State is invalid. | |
@retval EFI_DEVICE_ERROR Failed to set the state due to device error. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcSetState ( | |
IN EFI_USB2_HC_PROTOCOL *This, | |
IN EFI_USB_HC_STATE State | |
); | |
/** | |
Retrieves the current status of a USB root hub port. | |
@param This This EFI_USB2_HC_PROTOCOL instance. | |
@param PortNumber The root hub port to retrieve the state from. | |
This value is zero-based. | |
@param PortStatus Variable to receive the port state. | |
@retval EFI_SUCCESS The status of the USB root hub port specified. | |
by PortNumber was returned in PortStatus. | |
@retval EFI_INVALID_PARAMETER PortNumber is invalid. | |
@retval EFI_DEVICE_ERROR Can't read register. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcGetRootHubPortStatus ( | |
IN EFI_USB2_HC_PROTOCOL *This, | |
IN UINT8 PortNumber, | |
OUT EFI_USB_PORT_STATUS *PortStatus | |
); | |
/** | |
Sets a feature for the specified root hub port. | |
@param This This EFI_USB2_HC_PROTOCOL instance. | |
@param PortNumber Root hub port to set. | |
@param PortFeature Feature to set. | |
@retval EFI_SUCCESS The feature specified by PortFeature was set. | |
@retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid. | |
@retval EFI_DEVICE_ERROR Can't read register. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcSetRootHubPortFeature ( | |
IN EFI_USB2_HC_PROTOCOL *This, | |
IN UINT8 PortNumber, | |
IN EFI_USB_PORT_FEATURE PortFeature | |
); | |
/** | |
Clears a feature for the specified root hub port. | |
@param This A pointer to the EFI_USB2_HC_PROTOCOL instance. | |
@param PortNumber Specifies the root hub port whose feature is | |
requested to be cleared. | |
@param PortFeature Indicates the feature selector associated with the | |
feature clear request. | |
@retval EFI_SUCCESS The feature specified by PortFeature was cleared | |
for the USB root hub port specified by PortNumber. | |
@retval EFI_INVALID_PARAMETER PortNumber is invalid or PortFeature is invalid. | |
@retval EFI_DEVICE_ERROR Can't read register. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcClearRootHubPortFeature ( | |
IN EFI_USB2_HC_PROTOCOL *This, | |
IN UINT8 PortNumber, | |
IN EFI_USB_PORT_FEATURE PortFeature | |
); | |
/** | |
Submits control transfer to a target USB device. | |
@param This This EFI_USB2_HC_PROTOCOL instance. | |
@param DeviceAddress The target device address. | |
@param DeviceSpeed Target device speed. | |
@param MaximumPacketLength Maximum packet size the default control transfer | |
endpoint is capable of sending or receiving. | |
@param Request USB device request to send. | |
@param TransferDirection Specifies the data direction for the data stage | |
@param Data Data buffer to be transmitted or received from USB | |
device. | |
@param DataLength The size (in bytes) of the data buffer. | |
@param Timeout Indicates the maximum timeout, in millisecond. | |
@param Translator Transaction translator to be used by this device. | |
@param TransferResult Return the result of this control transfer. | |
@retval EFI_SUCCESS Transfer was completed successfully. | |
@retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resources. | |
@retval EFI_INVALID_PARAMETER Some parameters are invalid. | |
@retval EFI_TIMEOUT Transfer failed due to timeout. | |
@retval EFI_DEVICE_ERROR Transfer failed due to host controller or device error. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcControlTransfer ( | |
IN EFI_USB2_HC_PROTOCOL *This, | |
IN UINT8 DeviceAddress, | |
IN UINT8 DeviceSpeed, | |
IN UINTN MaximumPacketLength, | |
IN EFI_USB_DEVICE_REQUEST *Request, | |
IN EFI_USB_DATA_DIRECTION TransferDirection, | |
IN OUT VOID *Data, | |
IN OUT UINTN *DataLength, | |
IN UINTN Timeout, | |
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator, | |
OUT UINT32 *TransferResult | |
); | |
/** | |
Submits bulk transfer to a bulk endpoint of a USB device. | |
@param This This EFI_USB2_HC_PROTOCOL instance. | |
@param DeviceAddress Target device address. | |
@param EndPointAddress Endpoint number and its direction in bit 7. | |
@param DeviceSpeed Device speed, Low speed device doesn't support bulk | |
transfer. | |
@param MaximumPacketLength Maximum packet size the endpoint is capable of | |
sending or receiving. | |
@param DataBuffersNumber Number of data buffers prepared for the transfer. | |
@param Data Array of pointers to the buffers of data to transmit | |
from or receive into. | |
@param DataLength The lenght of the data buffer. | |
@param DataToggle On input, the initial data toggle for the transfer; | |
On output, it is updated to to next data toggle to | |
use of the subsequent bulk transfer. | |
@param Timeout Indicates the maximum time, in millisecond, which | |
the transfer is allowed to complete. | |
@param Translator A pointr to the transaction translator data. | |
@param TransferResult A pointer to the detailed result information of the | |
bulk transfer. | |
@retval EFI_SUCCESS The transfer was completed successfully. | |
@retval EFI_OUT_OF_RESOURCES The transfer failed due to lack of resource. | |
@retval EFI_INVALID_PARAMETER Some parameters are invalid. | |
@retval EFI_TIMEOUT The transfer failed due to timeout. | |
@retval EFI_DEVICE_ERROR The transfer failed due to host controller error. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcBulkTransfer ( | |
IN EFI_USB2_HC_PROTOCOL *This, | |
IN UINT8 DeviceAddress, | |
IN UINT8 EndPointAddress, | |
IN UINT8 DeviceSpeed, | |
IN UINTN MaximumPacketLength, | |
IN UINT8 DataBuffersNumber, | |
IN OUT VOID *Data[EFI_USB_MAX_BULK_BUFFER_NUM], | |
IN OUT UINTN *DataLength, | |
IN OUT UINT8 *DataToggle, | |
IN UINTN Timeout, | |
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator, | |
OUT UINT32 *TransferResult | |
); | |
/** | |
Submits an asynchronous interrupt transfer to an | |
interrupt endpoint of a USB device. | |
@param This This EFI_USB2_HC_PROTOCOL instance. | |
@param DeviceAddress Target device address. | |
@param EndPointAddress Endpoint number and its direction encoded in bit 7 | |
@param DeviceSpeed Indicates device speed. | |
@param MaximumPacketLength Maximum packet size the target endpoint is capable | |
@param IsNewTransfer If TRUE, to submit an new asynchronous interrupt | |
transfer If FALSE, to remove the specified | |
asynchronous interrupt. | |
@param DataToggle On input, the initial data toggle to use; on output, | |
it is updated to indicate the next data toggle. | |
@param PollingInterval The he interval, in milliseconds, that the transfer | |
is polled. | |
@param DataLength The length of data to receive at the rate specified | |
by PollingInterval. | |
@param Translator Transaction translator to use. | |
@param CallBackFunction Function to call at the rate specified by | |
PollingInterval. | |
@param Context Context to CallBackFunction. | |
@retval EFI_SUCCESS The request has been successfully submitted or canceled. | |
@retval EFI_INVALID_PARAMETER Some parameters are invalid. | |
@retval EFI_OUT_OF_RESOURCES The request failed due to a lack of resources. | |
@retval EFI_DEVICE_ERROR The transfer failed due to host controller error. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcAsyncInterruptTransfer ( | |
IN EFI_USB2_HC_PROTOCOL *This, | |
IN UINT8 DeviceAddress, | |
IN UINT8 EndPointAddress, | |
IN UINT8 DeviceSpeed, | |
IN UINTN MaximumPacketLength, | |
IN BOOLEAN IsNewTransfer, | |
IN OUT UINT8 *DataToggle, | |
IN UINTN PollingInterval, | |
IN UINTN DataLength, | |
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator, | |
IN EFI_ASYNC_USB_TRANSFER_CALLBACK CallBackFunction, | |
IN VOID *Context OPTIONAL | |
); | |
/** | |
Submits synchronous interrupt transfer to an interrupt endpoint | |
of a USB device. | |
@param This This EFI_USB2_HC_PROTOCOL instance. | |
@param DeviceAddress Target device address. | |
@param EndPointAddress Endpoint number and its direction encoded in bit 7 | |
@param DeviceSpeed Indicates device speed. | |
@param MaximumPacketLength Maximum packet size the target endpoint is capable | |
of sending or receiving. | |
@param Data Buffer of data that will be transmitted to USB | |
device or received from USB device. | |
@param DataLength On input, the size, in bytes, of the data buffer; On | |
output, the number of bytes transferred. | |
@param DataToggle On input, the initial data toggle to use; on output, | |
it is updated to indicate the next data toggle. | |
@param Timeout Maximum time, in second, to complete. | |
@param Translator Transaction translator to use. | |
@param TransferResult Variable to receive the transfer result. | |
@return EFI_SUCCESS The transfer was completed successfully. | |
@return EFI_OUT_OF_RESOURCES The transfer failed due to lack of resource. | |
@return EFI_INVALID_PARAMETER Some parameters are invalid. | |
@return EFI_TIMEOUT The transfer failed due to timeout. | |
@return EFI_DEVICE_ERROR The failed due to host controller or device error | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcSyncInterruptTransfer ( | |
IN EFI_USB2_HC_PROTOCOL *This, | |
IN UINT8 DeviceAddress, | |
IN UINT8 EndPointAddress, | |
IN UINT8 DeviceSpeed, | |
IN UINTN MaximumPacketLength, | |
IN OUT VOID *Data, | |
IN OUT UINTN *DataLength, | |
IN OUT UINT8 *DataToggle, | |
IN UINTN Timeout, | |
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator, | |
OUT UINT32 *TransferResult | |
); | |
/** | |
Submits isochronous transfer to a target USB device. | |
@param This This EFI_USB2_HC_PROTOCOL instance. | |
@param DeviceAddress Target device address. | |
@param EndPointAddress End point address with its direction. | |
@param DeviceSpeed Device speed, Low speed device doesn't support this | |
type. | |
@param MaximumPacketLength Maximum packet size that the endpoint is capable of | |
sending or receiving. | |
@param DataBuffersNumber Number of data buffers prepared for the transfer. | |
@param Data Array of pointers to the buffers of data that will | |
be transmitted to USB device or received from USB | |
device. | |
@param DataLength The size, in bytes, of the data buffer. | |
@param Translator Transaction translator to use. | |
@param TransferResult Variable to receive the transfer result. | |
@return EFI_UNSUPPORTED Isochronous transfer is unsupported. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcIsochronousTransfer ( | |
IN EFI_USB2_HC_PROTOCOL *This, | |
IN UINT8 DeviceAddress, | |
IN UINT8 EndPointAddress, | |
IN UINT8 DeviceSpeed, | |
IN UINTN MaximumPacketLength, | |
IN UINT8 DataBuffersNumber, | |
IN OUT VOID *Data[EFI_USB_MAX_ISO_BUFFER_NUM], | |
IN UINTN DataLength, | |
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator, | |
OUT UINT32 *TransferResult | |
); | |
/** | |
Submits Async isochronous transfer to a target USB device. | |
@param This This EFI_USB2_HC_PROTOCOL instance. | |
@param DeviceAddress Target device address. | |
@param EndPointAddress End point address with its direction. | |
@param DeviceSpeed Device speed, Low speed device doesn't support this | |
type. | |
@param MaximumPacketLength Maximum packet size that the endpoint is capable of | |
sending or receiving. | |
@param DataBuffersNumber Number of data buffers prepared for the transfer. | |
@param Data Array of pointers to the buffers of data that will | |
be transmitted to USB device or received from USB | |
device. | |
@param DataLength The size, in bytes, of the data buffer. | |
@param Translator Transaction translator to use. | |
@param IsochronousCallBack Function to be called when the transfer complete. | |
@param Context Context passed to the call back function as | |
parameter. | |
@return EFI_UNSUPPORTED Isochronous transfer isn't supported. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
XhcAsyncIsochronousTransfer ( | |
IN EFI_USB2_HC_PROTOCOL *This, | |
IN UINT8 DeviceAddress, | |
IN UINT8 EndPointAddress, | |
IN UINT8 DeviceSpeed, | |
IN UINTN MaximumPacketLength, | |
IN UINT8 DataBuffersNumber, | |
IN OUT VOID *Data[EFI_USB_MAX_ISO_BUFFER_NUM], | |
IN UINTN DataLength, | |
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Translator, | |
IN EFI_ASYNC_USB_TRANSFER_CALLBACK IsochronousCallBack, | |
IN VOID *Context | |
); | |
/** | |
Converts a time in nanoseconds to a performance counter tick count. | |
@param Time The time in nanoseconds to be converted to performance counter ticks. | |
@return Time in nanoseconds converted to ticks. | |
**/ | |
UINT64 | |
XhcConvertTimeToTicks ( | |
UINT64 Time | |
); | |
/** | |
Computes and returns the elapsed ticks since PreviousTick. The | |
value of PreviousTick is overwritten with the current performance | |
counter value. | |
@param PreviousTick Pointer to PreviousTick count. | |
@return The elapsed ticks since PreviousCount. PreviousCount is | |
overwritten with the current performance counter value. | |
**/ | |
UINT64 | |
XhcGetElapsedTicks ( | |
IN OUT UINT64 *PreviousTick | |
); | |
#endif |