/** @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
