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
 | 
						|
 |