mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-31 20:43:59 +00:00 
			
		
		
		
	 9344f09215
			
		
	
	
		9344f09215
		
	
	
	
	
		
			
			https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
		
			
				
	
	
		
			685 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			685 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   The USB Function Protocol provides an I/O abstraction for a USB Controller
 | |
|   operating in Function mode (also commonly referred to as Device, Peripheral,
 | |
|   or Target mode) and the mechanisms by which the USB Function can communicate
 | |
|   with the USB Host. It is used by other UEFI drivers or applications to
 | |
|   perform data transactions and basic USB controller management over a USB
 | |
|   Function port.
 | |
| 
 | |
|   This simple protocol only supports USB 2.0 bulk transfers on systems with a
 | |
|   single configuration and a single interface. It does not support isochronous
 | |
|   or interrupt transfers, alternate interfaces, or USB 3.0 functionality.
 | |
|   Future revisions of this protocol may support these or additional features.
 | |
| 
 | |
|   Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
|   @par Revision Reference:
 | |
|   This Protocol was introduced in UEFI Specification 2.5.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #ifndef __USB_FUNCTION_IO_H__
 | |
| #define __USB_FUNCTION_IO_H__
 | |
| 
 | |
| #include <Protocol/UsbIo.h>
 | |
| 
 | |
| #define EFI_USBFN_IO_PROTOCOL_GUID \
 | |
|     { \
 | |
|       0x32d2963a, 0xfe5d, 0x4f30, {0xb6, 0x33, 0x6e, 0x5d, 0xc5, 0x58, 0x3, 0xcc} \
 | |
|     }
 | |
| 
 | |
| typedef struct _EFI_USBFN_IO_PROTOCOL  EFI_USBFN_IO_PROTOCOL;
 | |
| 
 | |
| #define EFI_USBFN_IO_PROTOCOL_REVISION 0x00010001
 | |
| 
 | |
| typedef enum _EFI_USBFN_PORT_TYPE {
 | |
|   EfiUsbUnknownPort = 0,
 | |
|   EfiUsbStandardDownstreamPort,
 | |
|   EfiUsbChargingDownstreamPort,
 | |
|   EfiUsbDedicatedChargingPort,
 | |
|   EfiUsbInvalidDedicatedChargingPort
 | |
| } EFI_USBFN_PORT_TYPE;
 | |
| 
 | |
| typedef struct {
 | |
|   EFI_USB_INTERFACE_DESCRIPTOR         *InterfaceDescriptor;
 | |
|   EFI_USB_ENDPOINT_DESCRIPTOR          **EndpointDescriptorTable;
 | |
| } EFI_USB_INTERFACE_INFO;
 | |
| 
 | |
| typedef struct {
 | |
|   EFI_USB_CONFIG_DESCRIPTOR            *ConfigDescriptor;
 | |
|   EFI_USB_INTERFACE_INFO               **InterfaceInfoTable;
 | |
| } EFI_USB_CONFIG_INFO;
 | |
| 
 | |
| typedef struct {
 | |
|   EFI_USB_DEVICE_DESCRIPTOR            *DeviceDescriptor;
 | |
|   EFI_USB_CONFIG_INFO                  **ConfigInfoTable;
 | |
| } EFI_USB_DEVICE_INFO;
 | |
| 
 | |
| typedef enum _EFI_USB_ENDPOINT_TYPE {
 | |
|   UsbEndpointControl = 0x00,
 | |
|   //UsbEndpointIsochronous = 0x01,
 | |
|   UsbEndpointBulk = 0x02,
 | |
|   //UsbEndpointInterrupt = 0x03
 | |
| } EFI_USB_ENDPOINT_TYPE;
 | |
| 
 | |
| typedef enum _EFI_USBFN_DEVICE_INFO_ID {
 | |
|   EfiUsbDeviceInfoUnknown = 0,
 | |
|   EfiUsbDeviceInfoSerialNumber,
 | |
|   EfiUsbDeviceInfoManufacturerName,
 | |
|   EfiUsbDeviceInfoProductName
 | |
| } EFI_USBFN_DEVICE_INFO_ID;
 | |
| 
 | |
| typedef enum _EFI_USBFN_ENDPOINT_DIRECTION {
 | |
|   EfiUsbEndpointDirectionHostOut = 0,
 | |
|   EfiUsbEndpointDirectionHostIn,
 | |
|   EfiUsbEndpointDirectionDeviceTx = EfiUsbEndpointDirectionHostIn,
 | |
|   EfiUsbEndpointDirectionDeviceRx = EfiUsbEndpointDirectionHostOut
 | |
| } EFI_USBFN_ENDPOINT_DIRECTION;
 | |
| 
 | |
| typedef enum _EFI_USBFN_MESSAGE {
 | |
|   //
 | |
|   // Nothing
 | |
|   //
 | |
|   EfiUsbMsgNone = 0,
 | |
|   //
 | |
|   // SETUP packet is received, returned Buffer contains
 | |
|   // EFI_USB_DEVICE_REQUEST struct
 | |
|   //
 | |
|   EfiUsbMsgSetupPacket,
 | |
|   //
 | |
|   // Indicates that some of the requested data has been received from the
 | |
|   // host. It is the responsibility of the class driver to determine if it
 | |
|   // needs to wait for any remaining data. Returned Buffer contains
 | |
|   // EFI_USBFN_TRANSFER_RESULT struct containing endpoint number, transfer
 | |
|   // status and count of bytes received.
 | |
|   //
 | |
|   EfiUsbMsgEndpointStatusChangedRx,
 | |
|   //
 | |
|   // Indicates that some of the requested data has been transmitted to the
 | |
|   // host. It is the responsibility of the class driver to determine if any
 | |
|   // remaining data needs to be resent. Returned Buffer contains
 | |
|   // EFI_USBFN_TRANSFER_RESULT struct containing endpoint number, transfer
 | |
|   // status and count of bytes sent.
 | |
|   //
 | |
|   EfiUsbMsgEndpointStatusChangedTx,
 | |
|   //
 | |
|   // DETACH bus event signaled
 | |
|   //
 | |
|   EfiUsbMsgBusEventDetach,
 | |
|   //
 | |
|   // ATTACH bus event signaled
 | |
|   //
 | |
|   EfiUsbMsgBusEventAttach,
 | |
|   //
 | |
|   // RESET bus event signaled
 | |
|   //
 | |
|   EfiUsbMsgBusEventReset,
 | |
|   //
 | |
|   // SUSPEND bus event signaled
 | |
|   //
 | |
|   EfiUsbMsgBusEventSuspend,
 | |
|   //
 | |
|   // RESUME bus event signaled
 | |
|   //
 | |
|   EfiUsbMsgBusEventResume,
 | |
|   //
 | |
|   // Bus speed updated, returned buffer indicated bus speed using
 | |
|   // following enumeration named EFI_USB_BUS_SPEED
 | |
|   //
 | |
|   EfiUsbMsgBusEventSpeed
 | |
| } EFI_USBFN_MESSAGE;
 | |
| 
 | |
| typedef enum _EFI_USBFN_TRANSFER_STATUS {
 | |
|   UsbTransferStatusUnknown = 0,
 | |
|   UsbTransferStatusComplete,
 | |
|   UsbTransferStatusAborted,
 | |
|   UsbTransferStatusActive,
 | |
|   UsbTransferStatusNone
 | |
| } EFI_USBFN_TRANSFER_STATUS;
 | |
| 
 | |
| typedef struct _EFI_USBFN_TRANSFER_RESULT {
 | |
|   UINTN                         BytesTransferred;
 | |
|   EFI_USBFN_TRANSFER_STATUS     TransferStatus;
 | |
|   UINT8                         EndpointIndex;
 | |
|   EFI_USBFN_ENDPOINT_DIRECTION  Direction;
 | |
|   VOID                          *Buffer;
 | |
| } EFI_USBFN_TRANSFER_RESULT;
 | |
| 
 | |
| typedef enum _EFI_USB_BUS_SPEED {
 | |
|   UsbBusSpeedUnknown = 0,
 | |
|   UsbBusSpeedLow,
 | |
|   UsbBusSpeedFull,
 | |
|   UsbBusSpeedHigh,
 | |
|   UsbBusSpeedSuper,
 | |
|   UsbBusSpeedMaximum = UsbBusSpeedSuper
 | |
| } EFI_USB_BUS_SPEED;
 | |
| 
 | |
| typedef union _EFI_USBFN_MESSAGE_PAYLOAD {
 | |
|   EFI_USB_DEVICE_REQUEST       udr;
 | |
|   EFI_USBFN_TRANSFER_RESULT    utr;
 | |
|   EFI_USB_BUS_SPEED            ubs;
 | |
| } EFI_USBFN_MESSAGE_PAYLOAD;
 | |
| 
 | |
| typedef enum _EFI_USBFN_POLICY_TYPE {
 | |
|   EfiUsbPolicyUndefined = 0,
 | |
|   EfiUsbPolicyMaxTransactionSize,
 | |
|   EfiUsbPolicyZeroLengthTerminationSupport,
 | |
|   EfiUsbPolicyZeroLengthTermination
 | |
| } EFI_USBFN_POLICY_TYPE;
 | |
| 
 | |
| /**
 | |
|   Returns information about what USB port type was attached.
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
|   @param[out] PortType          Returns the USB port type.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_DEVICE_ERROR      The physical device reported an error.
 | |
|   @retval EFI_NOT_READY         The physical device is busy or not ready to
 | |
|                                 process this request or there is no USB port
 | |
|                                 attached to the device.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_DETECT_PORT) (
 | |
|   IN     EFI_USBFN_IO_PROTOCOL         *This,
 | |
|      OUT EFI_USBFN_PORT_TYPE           *PortType
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Configures endpoints based on supplied device and configuration descriptors.
 | |
| 
 | |
|   Assuming that the hardware has already been initialized, this function configures
 | |
|   the endpoints using the device information supplied by DeviceInfo, activates the
 | |
|   port, and starts receiving USB events.
 | |
| 
 | |
|   This function must ignore the bMaxPacketSize0field of the Standard Device Descriptor
 | |
|   and the wMaxPacketSize field of the Standard Endpoint Descriptor that are made
 | |
|   available through DeviceInfo.
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
|   @param[out] DeviceInfo        A pointer to EFI_USBFN_DEVICE_INFO instance.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_DEVICE_ERROR      The physical device reported an error.
 | |
|   @retval EFI_NOT_READY         The physical device is busy or not ready to process
 | |
|                                 this request.
 | |
|   @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to lack of
 | |
|                                 resources.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_CONFIGURE_ENABLE_ENDPOINTS) (
 | |
|   IN     EFI_USBFN_IO_PROTOCOL         *This,
 | |
|      OUT EFI_USB_DEVICE_INFO           *DeviceInfo
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Returns the maximum packet size of the specified endpoint type for the supplied
 | |
|   bus speed.
 | |
| 
 | |
|   If the BusSpeed is UsbBusSpeedUnknown, the maximum speed the underlying controller
 | |
|   supports is assumed.
 | |
| 
 | |
|   This protocol currently does not support isochronous or interrupt transfers. Future
 | |
|   revisions of this protocol may eventually support it.
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOLinstance.
 | |
|   @param[in]  EndpointType      Endpoint type as defined as EFI_USB_ENDPOINT_TYPE.
 | |
|   @param[in]  BusSpeed          Bus speed as defined as EFI_USB_BUS_SPEED.
 | |
|   @param[out] MaxPacketSize     The maximum packet size, in bytes, of the specified
 | |
|                                 endpoint type.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_DEVICE_ERROR      The physical device reported an error.
 | |
|   @retval EFI_NOT_READY         The physical device is busy or not ready to process
 | |
|                                 this request.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_GET_ENDPOINT_MAXPACKET_SIZE) (
 | |
|   IN     EFI_USBFN_IO_PROTOCOL         *This,
 | |
|   IN     EFI_USB_ENDPOINT_TYPE         EndpointType,
 | |
|   IN     EFI_USB_BUS_SPEED             BusSpeed,
 | |
|      OUT UINT16                        *MaxPacketSize
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Returns device specific information based on the supplied identifier as a Unicode string.
 | |
| 
 | |
|   If the supplied Buffer isn't large enough, or is NULL, the method fails with
 | |
|   EFI_BUFFER_TOO_SMALL and the required size is returned through BufferSize. All returned
 | |
|   strings are in Unicode format.
 | |
| 
 | |
|   An Id of EfiUsbDeviceInfoUnknown is treated as an invalid parameter.
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOLinstance.
 | |
|   @param[in]  Id                The requested information id.
 | |
| 
 | |
| 
 | |
|   @param[in]  BufferSize        On input, the size of the Buffer in bytes. On output, the
 | |
|                                 amount of data returned in Buffer in bytes.
 | |
|   @param[out] Buffer            A pointer to a buffer to returnthe requested information
 | |
|                                 as a Unicode string.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
 | |
|                                 BufferSize is NULL.
 | |
|                                 *BufferSize is not 0 and Buffer is NULL.
 | |
|                                 Id in invalid.
 | |
|   @retval EFI_DEVICE_ERROR      The physical device reported an error.
 | |
|   @retval EFI_BUFFER_TOO_SMALL  The buffer is too small to hold the buffer.
 | |
|                                 *BufferSize has been updated with the size needed to hold the request string.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_GET_DEVICE_INFO) (
 | |
|   IN     EFI_USBFN_IO_PROTOCOL         *This,
 | |
|   IN     EFI_USBFN_DEVICE_INFO_ID      Id,
 | |
|   IN OUT UINTN                         *BufferSize,
 | |
|      OUT VOID                          *Buffer OPTIONAL
 | |
| );
 | |
| 
 | |
| /**
 | |
|   Returns the vendor-id and product-id of the device.
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
|   @param[out] Vid               Returned vendor-id of the device.
 | |
|   @param[out] Pid               Returned product-id of the device.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_NOT_FOUND         Unable to return the vendor-id or the product-id.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_GET_VENDOR_ID_PRODUCT_ID) (
 | |
|   IN     EFI_USBFN_IO_PROTOCOL         *This,
 | |
|      OUT UINT16                        *Vid,
 | |
|      OUT UINT16                        *Pid
 | |
| );
 | |
| 
 | |
| /**
 | |
|   Aborts the transfer on the specified endpoint.
 | |
| 
 | |
|   This function should fail with EFI_INVALID_PARAMETER if the specified direction
 | |
|   is incorrect for the endpoint.
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
|   @param[in]  EndpointIndex     Indicates the endpoint on which the ongoing transfer
 | |
|                                 needs to be canceled.
 | |
|   @param[in]  Direction         Direction of the endpoint.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_DEVICE_ERROR      The physical device reported an error.
 | |
|   @retval EFI_NOT_READY         The physical device is busy or not ready to process
 | |
|                                 this request.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_ABORT_TRANSFER) (
 | |
|   IN  EFI_USBFN_IO_PROTOCOL            *This,
 | |
|   IN  UINT8                            EndpointIndex,
 | |
|   IN  EFI_USBFN_ENDPOINT_DIRECTION     Direction
 | |
| );
 | |
| 
 | |
| /**
 | |
|   Returns the stall state on the specified endpoint.
 | |
| 
 | |
|   This function should fail with EFI_INVALID_PARAMETER if the specified direction
 | |
|   is incorrect for the endpoint.
 | |
| 
 | |
|   @param[in]      This          A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
|   @param[in]      EndpointIndex Indicates the endpoint.
 | |
|   @param[in]      Direction     Direction of the endpoint.
 | |
|   @param[in, out] State         Boolean, true value indicates that the endpoint
 | |
|                                 is in a stalled state, false otherwise.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_DEVICE_ERROR      The physical device reported an error.
 | |
|   @retval EFI_NOT_READY         The physical device is busy or not ready to process
 | |
|                                 this request.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_GET_ENDPOINT_STALL_STATE) (
 | |
|   IN     EFI_USBFN_IO_PROTOCOL         *This,
 | |
|   IN     UINT8                         EndpointIndex,
 | |
|   IN     EFI_USBFN_ENDPOINT_DIRECTION  Direction,
 | |
|   IN OUT BOOLEAN                       *State
 | |
| );
 | |
| 
 | |
| /**
 | |
|   Sets or clears the stall state on the specified endpoint.
 | |
| 
 | |
|   This function should fail with EFI_INVALID_PARAMETER if the specified direction
 | |
|   is incorrect for the endpoint.
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
|   @param[in]  EndpointIndex     Indicates the endpoint.
 | |
|   @param[in]  Direction         Direction of the endpoint.
 | |
|   @param[in]  State             Requested stall state on the specified endpoint.
 | |
|                                 True value causes the endpoint to stall; false
 | |
|                                 value clears an existing stall.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_DEVICE_ERROR      The physical device reported an error.
 | |
|   @retval EFI_NOT_READY         The physical device is busy or not ready to process
 | |
|                                 this request.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_SET_ENDPOINT_STALL_STATE) (
 | |
|   IN     EFI_USBFN_IO_PROTOCOL         *This,
 | |
|   IN     UINT8                         EndpointIndex,
 | |
|   IN     EFI_USBFN_ENDPOINT_DIRECTION  Direction,
 | |
|   IN OUT BOOLEAN                       *State
 | |
| );
 | |
| 
 | |
| /**
 | |
|   This function is called repeatedly to get information on USB bus states,
 | |
|   receive-completion and transmit-completion events on the endpoints, and
 | |
|   notification on setup packet on endpoint 0.
 | |
| 
 | |
|   A class driver must call EFI_USBFN_IO_PROTOCOL.EventHandler()repeatedly
 | |
|   to receive updates on the transfer status and number of bytes transferred
 | |
|   on various endpoints.
 | |
| 
 | |
|   @param[in]      This          A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
|   @param[out]     Message       Indicates the event that initiated this notification.
 | |
|   @param[in, out] PayloadSize   On input, the size of the memory pointed by
 | |
|                                 Payload. On output, the amount ofdata returned
 | |
|                                 in Payload.
 | |
|   @param[out]     Payload       A pointer to EFI_USBFN_MESSAGE_PAYLOAD instance
 | |
|                                 to return additional payload for current message.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_DEVICE_ERROR      The physical device reported an error.
 | |
|   @retval EFI_NOT_READY         The physical device is busy or not ready to process
 | |
|                                 this request.
 | |
|   @retval EFI_BUFFER_TOO_SMALL  The Supplied buffer is not large enough to hold
 | |
|                                 the message payload.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_EVENTHANDLER) (
 | |
|   IN     EFI_USBFN_IO_PROTOCOL         *This,
 | |
|      OUT EFI_USBFN_MESSAGE             *Message,
 | |
|   IN OUT UINTN                         *PayloadSize,
 | |
|      OUT EFI_USBFN_MESSAGE_PAYLOAD     *Payload
 | |
| );
 | |
| 
 | |
| /**
 | |
|   This function handles transferring data to or from the host on the specified
 | |
|   endpoint, depending on the direction specified.
 | |
| 
 | |
|   A class driver must call EFI_USBFN_IO_PROTOCOL.EventHandler() repeatedly to
 | |
|   receive updates on the transfer status and the number of bytes transferred on
 | |
|   various endpoints. Upon an update of the transfer status, the Buffer field of
 | |
|   the EFI_USBFN_TRANSFER_RESULT structure (as described in the function description
 | |
|   for EFI_USBFN_IO_PROTOCOL.EventHandler()) must be initialized with the Buffer
 | |
|   pointer that was supplied to this method.
 | |
| 
 | |
|   The overview of the call sequence is illustrated in the Figure 54.
 | |
| 
 | |
|   This function should fail with EFI_INVALID_PARAMETER if the specified direction
 | |
|   is incorrect for the endpoint.
 | |
| 
 | |
|   @param[in]      This          A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
|   @param[in]      EndpointIndex Indicates the endpoint on which TX or RX transfer
 | |
|                                 needs to take place.
 | |
|   @param[in]      Direction     Direction of the endpoint.
 | |
|   @param[in, out] BufferSize    If Direction is EfiUsbEndpointDirectionDeviceRx:
 | |
|                                   On input, the size of the Bufferin bytes.
 | |
|                                   On output, the amount of data returned in Buffer
 | |
|                                   in bytes.
 | |
|                                 If Direction is EfiUsbEndpointDirectionDeviceTx:
 | |
|                                   On input, the size of the Bufferin bytes.
 | |
|                                   On output, the amount of data transmitted in bytes.
 | |
|   @param[in, out] Buffer        If Direction is EfiUsbEndpointDirectionDeviceRx:
 | |
|                                   The Buffer to return the received data.
 | |
|                                 If Directionis EfiUsbEndpointDirectionDeviceTx:
 | |
|                                   The Buffer that contains the data to be transmitted.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_DEVICE_ERROR      The physical device reported an error.
 | |
|   @retval EFI_NOT_READY         The physical device is busy or not ready to process
 | |
|                                 this request.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_TRANSFER) (
 | |
|   IN     EFI_USBFN_IO_PROTOCOL         *This,
 | |
|   IN     UINT8                         EndpointIndex,
 | |
|   IN     EFI_USBFN_ENDPOINT_DIRECTION  Direction,
 | |
|   IN OUT UINTN                         *BufferSize,
 | |
|   IN OUT VOID                          *Buffer
 | |
| );
 | |
| 
 | |
| /**
 | |
|   Returns the maximum supported transfer size.
 | |
| 
 | |
|   Returns the maximum number of bytes that the underlying controller can accommodate
 | |
|   in a single transfer.
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
|   @param[out] MaxTransferSize   The maximum supported transfer size, in bytes.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_DEVICE_ERROR      The physical device reported an error.
 | |
|   @retval EFI_NOT_READY         The physical device is busy or not ready to process
 | |
|                                 this request.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_GET_MAXTRANSFER_SIZE) (
 | |
|   IN     EFI_USBFN_IO_PROTOCOL         *This,
 | |
|      OUT UINTN                         *MaxTransferSize
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Allocates a transfer buffer of the specified sizethat satisfies the controller
 | |
|   requirements.
 | |
| 
 | |
|   The AllocateTransferBuffer() function allocates a memory region of Size bytes and
 | |
|   returns the address of the allocated memory that satisfies the underlying controller
 | |
|   requirements in the location referenced by Buffer.
 | |
| 
 | |
|   The allocated transfer buffer must be freed using a matching call to
 | |
|   EFI_USBFN_IO_PROTOCOL.FreeTransferBuffer()function.
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
|   @param[in]  Size              The number of bytes to allocate for the transfer buffer.
 | |
|   @param[out] Buffer            A pointer to a pointer to the allocated buffer if the
 | |
|                                 call succeeds; undefined otherwise.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_OUT_OF_RESOURCES  The requested transfer buffer could not be allocated.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_ALLOCATE_TRANSFER_BUFFER) (
 | |
|   IN     EFI_USBFN_IO_PROTOCOL         *This,
 | |
|   IN     UINTN                         Size,
 | |
|      OUT VOID                          **Buffer
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Deallocates the memory allocated for the transfer buffer by the
 | |
|   EFI_USBFN_IO_PROTOCOL.AllocateTransferBuffer() function.
 | |
| 
 | |
|   The EFI_USBFN_IO_PROTOCOL.FreeTransferBuffer() function deallocates the
 | |
|   memory specified by Buffer. The Buffer that is freed must have been allocated
 | |
|   by EFI_USBFN_IO_PROTOCOL.AllocateTransferBuffer().
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
|   @param[in]  Buffer            A pointer to the transfer buffer to deallocate.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_FREE_TRANSFER_BUFFER) (
 | |
|   IN  EFI_USBFN_IO_PROTOCOL         *This,
 | |
|   IN  VOID                          *Buffer
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function supplies power to the USB controller if needed and initializes
 | |
|   the hardware and the internal data structures. The port must not be activated
 | |
|   by this function.
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_DEVICE_ERROR      The physical device reported an error.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_START_CONTROLLER) (
 | |
|   IN  EFI_USBFN_IO_PROTOCOL         *This
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function stops the USB hardware device.
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_DEVICE_ERROR      The physical device reported an error.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_STOP_CONTROLLER) (
 | |
|   IN  EFI_USBFN_IO_PROTOCOL         *This
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function sets the configuration policy for the specified non-control
 | |
|   endpoint.
 | |
| 
 | |
|   This function can only be called before EFI_USBFN_IO_PROTOCOL.StartController()
 | |
|   or after EFI_USBFN_IO_PROTOCOL.StopController() has been called.
 | |
| 
 | |
|   @param[in]  This              A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
|   @param[in]  EndpointIndex     Indicates the non-control endpoint for which the
 | |
|                                 policy needs to be set.
 | |
|   @param[in]  Direction         Direction of the endpoint.
 | |
|   @param[in]  PolicyType        Policy type the user is trying to set for the
 | |
|                                 specified non-control endpoint.
 | |
|   @param[in]  BufferSize        The size of the Bufferin bytes.
 | |
|   @param[in]  Buffer            The new value for the policy parameter that
 | |
|                                 PolicyType specifies.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_DEVICE_ERROR      The physical device reported an error.
 | |
|   @retval EFI_UNSUPPORTED       Changing this policy value is not supported.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_SET_ENDPOINT_POLICY) (
 | |
|   IN  EFI_USBFN_IO_PROTOCOL         *This,
 | |
|   IN  UINT8                         EndpointIndex,
 | |
|   IN  EFI_USBFN_ENDPOINT_DIRECTION  Direction,
 | |
|   IN  EFI_USBFN_POLICY_TYPE         PolicyType,
 | |
|   IN  UINTN                         BufferSize,
 | |
|   IN  VOID                          *Buffer
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   This function sets the configuration policy for the specified non-control
 | |
|   endpoint.
 | |
| 
 | |
|   This function can only be called before EFI_USBFN_IO_PROTOCOL.StartController()
 | |
|   or after EFI_USBFN_IO_PROTOCOL.StopController() has been called.
 | |
| 
 | |
|   @param[in]      This          A pointer to the EFI_USBFN_IO_PROTOCOL instance.
 | |
|   @param[in]      EndpointIndex Indicates the non-control endpoint for which the
 | |
|                                 policy needs to be set.
 | |
|   @param[in]      Direction     Direction of the endpoint.
 | |
|   @param[in]      PolicyType    Policy type the user is trying to retrieve for
 | |
|                                 the specified non-control endpoint.
 | |
|   @param[in, out] BufferSize    On input, the size of Bufferin bytes. On output,
 | |
|                                 the amount of data returned in Bufferin bytes.
 | |
|   @param[in, out] Buffer        A pointer to a buffer to return requested endpoint
 | |
|                                 policy value.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The function returned successfully.
 | |
|   @retval EFI_INVALID_PARAMETER A parameter is invalid.
 | |
|   @retval EFI_DEVICE_ERROR      The specified policy value is not supported.
 | |
|   @retval EFI_BUFFER_TOO_SMALL  Supplied buffer is not large enough to hold requested
 | |
|                                 policy value.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_USBFN_IO_GET_ENDPOINT_POLICY) (
 | |
|   IN     EFI_USBFN_IO_PROTOCOL         *This,
 | |
|   IN     UINT8                         EndpointIndex,
 | |
|   IN     EFI_USBFN_ENDPOINT_DIRECTION  Direction,
 | |
|   IN     EFI_USBFN_POLICY_TYPE         PolicyType,
 | |
|   IN OUT UINTN                         *BufferSize,
 | |
|   IN OUT VOID                          *Buffer
 | |
|   );
 | |
| 
 | |
| ///
 | |
| /// The EFI_USBFN_IO_PROTOCOL provides basic data transactions and basic USB
 | |
| /// controller management for a USB Function port.
 | |
| ///
 | |
| struct _EFI_USBFN_IO_PROTOCOL {
 | |
|   UINT32                                    Revision;
 | |
|   EFI_USBFN_IO_DETECT_PORT                  DetectPort;
 | |
|   EFI_USBFN_IO_CONFIGURE_ENABLE_ENDPOINTS   ConfigureEnableEndpoints;
 | |
|   EFI_USBFN_IO_GET_ENDPOINT_MAXPACKET_SIZE  GetEndpointMaxPacketSize;
 | |
|   EFI_USBFN_IO_GET_DEVICE_INFO              GetDeviceInfo;
 | |
|   EFI_USBFN_IO_GET_VENDOR_ID_PRODUCT_ID     GetVendorIdProductId;
 | |
|   EFI_USBFN_IO_ABORT_TRANSFER               AbortTransfer;
 | |
|   EFI_USBFN_IO_GET_ENDPOINT_STALL_STATE     GetEndpointStallState;
 | |
|   EFI_USBFN_IO_SET_ENDPOINT_STALL_STATE     SetEndpointStallState;
 | |
|   EFI_USBFN_IO_EVENTHANDLER                 EventHandler;
 | |
|   EFI_USBFN_IO_TRANSFER                     Transfer;
 | |
|   EFI_USBFN_IO_GET_MAXTRANSFER_SIZE         GetMaxTransferSize;
 | |
|   EFI_USBFN_IO_ALLOCATE_TRANSFER_BUFFER     AllocateTransferBuffer;
 | |
|   EFI_USBFN_IO_FREE_TRANSFER_BUFFER         FreeTransferBuffer;
 | |
|   EFI_USBFN_IO_START_CONTROLLER             StartController;
 | |
|   EFI_USBFN_IO_STOP_CONTROLLER              StopController;
 | |
|   EFI_USBFN_IO_SET_ENDPOINT_POLICY          SetEndpointPolicy;
 | |
|   EFI_USBFN_IO_GET_ENDPOINT_POLICY          GetEndpointPolicy;
 | |
| };
 | |
| 
 | |
| extern EFI_GUID gEfiUsbFunctionIoProtocolGuid;
 | |
| 
 | |
| #endif
 | |
| 
 |