blob: 250de0b591106cbb9c536da1012138bdcad9c167 [file] [log] [blame]
/** @file
Header file contains code for USB Ethernet Protocol
definitions
Copyright (c) 2023, American Megatrends International LLC. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef USB_ETHERNET_PROTOCOL_H_
#define USB_ETHERNET_PROTOCOL_H_
#define EDKII_USB_ETHERNET_PROTOCOL_GUID \
{0x8d8969cc, 0xfeb0, 0x4303, {0xb2, 0x1a, 0x1f, 0x11, 0x6f, 0x38, 0x56, 0x43}}
typedef struct _EDKII_USB_ETHERNET_PROTOCOL EDKII_USB_ETHERNET_PROTOCOL;
#define USB_CDC_CLASS 0x02
#define USB_CDC_ACM_SUBCLASS 0x02
#define USB_CDC_ECM_SUBCLASS 0x06
#define USB_CDC_NCM_SUBCLASS 0x0D
#define USB_CDC_DATA_CLASS 0x0A
#define USB_CDC_DATA_SUBCLASS 0x00
#define USB_NO_CLASS_PROTOCOL 0x00
#define USB_NCM_NTB_PROTOCOL 0x01
#define USB_VENDOR_PROTOCOL 0xFF
#define USB_MISC_CLASS 0xEF
#define USB_RNDIS_SUBCLASS 0x04
#define USB_RNDIS_ETHERNET_PROTOCOL 0x01
// Type Values for the DescriptorType Field
#define CS_INTERFACE 0x24
#define CS_ENDPOINT 0x25
// Descriptor SubType in Functional Descriptors
#define HEADER_FUN_DESCRIPTOR 0x00
#define UNION_FUN_DESCRIPTOR 0x06
#define ETHERNET_FUN_DESCRIPTOR 0x0F
#define MAX_LAN_INTERFACE 0x10
// Table 20: Class-Specific Notification Codes
#define USB_CDC_NETWORK_CONNECTION 0x00
// 6.3.1 NetworkConnection
#define NETWORK_CONNECTED 0x01
#define NETWORK_DISCONNECT 0x00
#define MAC_FILTERS_MASK 0x7FFF
// USB Header functional Descriptor
typedef struct {
UINT8 FunctionLength;
UINT8 DescriptorType;
UINT8 DescriptorSubtype;
UINT16 BcdCdc;
} USB_HEADER_FUN_DESCRIPTOR;
// USB Union Functional Descriptor
typedef struct {
UINT8 FunctionLength;
UINT8 DescriptorType;
UINT8 DescriptorSubtype;
UINT8 MasterInterface;
UINT8 SlaveInterface;
} USB_UNION_FUN_DESCRIPTOR;
// USB Ethernet Functional Descriptor
typedef struct {
UINT8 FunctionLength;
UINT8 DescriptorType;
UINT8 DescriptorSubtype;
UINT8 MacAddress;
UINT32 EthernetStatistics;
UINT16 MaxSegmentSize;
UINT16 NumberMcFilters;
UINT8 NumberPowerFilters;
} USB_ETHERNET_FUN_DESCRIPTOR;
typedef struct {
UINT32 UsBitRate;
UINT32 DsBitRate;
} USB_CONNECT_SPEED_CHANGE;
// Request Type Codes for USB Ethernet
#define USB_ETHERNET_GET_REQ_TYPE 0xA1
#define USB_ETHERNET_SET_REQ_TYPE 0x21
// Class-Specific Request Codes for Ethernet subclass
// USB ECM 1.2 specification, Section 6.2
#define SET_ETH_MULTICAST_FILTERS_REQ 0x40
#define SET_ETH_POWER_MANAGEMENT_PATTERN_FILTER_REQ 0x41
#define GET_ETH_POWER_MANAGEMENT_PATTERN_FILTER_REQ 0x42
#define SET_ETH_PACKET_FILTER_REQ 0x43
#define GET_ETH_STATISTIC_REQ 0x44
// USB ECM command request length
#define USB_ETH_POWER_FILTER_LENGTH 2 // Section 6.2.3
#define USB_ETH_PACKET_FILTER_LENGTH 0 // Section 6.2.4
#define USB_ETH_STATISTIC 4 // Section 6.2.5
// USB Ethernet Packet Filter Bitmap
// USB ECM 1.2 specification, Section 6.2.4
#define USB_ETH_PACKET_TYPE_PROMISCUOUS BIT0
#define USB_ETH_PACKET_TYPE_ALL_MULTICAST BIT1
#define USB_ETH_PACKET_TYPE_DIRECTED BIT2
#define USB_ETH_PACKET_TYPE_BROADCAST BIT3
#define USB_ETH_PACKET_TYPE_MULTICAST BIT4
// USB Ethernet Statistics Feature Selector Codes
// USB ECM 1.2 specification, Section 6.2.5
#define USB_ETH_XMIT_OK 0x01
#define USB_ETH_RCV_OK 0x02
#define USB_ETH_XMIT_ERROR 0x03
#define USB_ETH_RCV_ERROR 0x04
#define USB_ETH_RCV_NO_BUFFER 0x05
#define USB_ETH_DIRECTED_BYTES_XMIT 0x06
#define USB_ETH_DIRECTED_FRAMES_XMIT 0x07
#define USB_ETH_MULTICAST_BYTES_XMIT 0x08
#define USB_ETH_MULTICAST_FRAMES_XMIT 0x09
#define USB_ETH_BROADCAST_BYTES_XMIT 0x0A
#define USB_ETH_BROADCAST_FRAMES_XMIT 0x0B
#define USB_ETH_DIRECTED_BYTES_RCV 0x0C
#define USB_ETH_DIRECTED_FRAMES_RCV 0x0D
#define USB_ETH_MULTICAST_BYTES_RCV 0x0E
#define USB_ETH_MULTICAST_FRAMES_RCV 0x0F
#define USB_ETH_BROADCAST_BYTES_RCV 0x10
#define USB_ETH_BROADCAST_FRAMES_RCV 0x11
#define USB_ETH_RCV_CRC_ERROR 0x12
#define USB_ETH_TRANSMIT_QUEUE_LENGTH 0x13
#define USB_ETH_RCV_ERROR_ALIGNMENT 0x14
#define USB_ETH_XMIT_ONE_COLLISION 0x15
#define USB_ETH_XMIT_MORE_COLLISIONS 0x16
#define USB_ETH_XMIT_DEFERRED 0x17
#define USB_ETH_XMIT_MAX_COLLISIONS 0x18
#define USB_ETH_RCV_OVERRUN 0x19
#define USB_ETH_XMIT_UNDERRUN 0x1A
#define USB_ETH_XMIT_HEARTBEAT_FAILURE 0x1B
#define USB_ETH_XMIT_TIMES_CRS_LOST 0x1C
#define USB_ETH_XMIT_LATE_COLLISIONS 0x1D
// NIC Information
typedef struct {
UINT32 Signature;
EDKII_USB_ETHERNET_PROTOCOL *UsbEth;
UINT16 InterrupOpFlag;
UINT64 MappedAddr;
PXE_MAC_ADDR McastList[MAX_MCAST_ADDRESS_CNT];
UINT8 McastCount;
UINT64 MediaHeader[MAX_XMIT_BUFFERS];
UINT8 TxBufferCount;
UINT16 State;
BOOLEAN CanTransmit;
UINT16 ReceiveStatus;
UINT8 RxFilter;
UINT32 RxFrame;
UINT32 TxFrame;
UINT16 NetworkConnect;
UINT8 CableDetect;
UINT16 MaxSegmentSize;
EFI_MAC_ADDRESS MacAddr;
PXE_CPB_START_31 PxeStart;
PXE_CPB_INITIALIZE PxeInit;
UINT8 PermNodeAddress[PXE_MAC_LENGTH];
UINT8 CurrentNodeAddress[PXE_MAC_LENGTH];
UINT8 BroadcastNodeAddress[PXE_MAC_LENGTH];
EFI_USB_DEVICE_REQUEST Request;
EFI_EVENT RateLimiter;
UINT32 RateLimitingCredit;
UINT32 RateLimitingCreditCount;
UINT32 RateLimitingPollTimer;
BOOLEAN RateLimitingEnable;
} NIC_DATA;
#define NIC_DATA_SIGNATURE SIGNATURE_32('n', 'i', 'c', 'd')
#define NIC_DATA_FROM_EDKII_USB_ETHERNET_PROTOCOL(a) CR (a, NIC_DATA, UsbEth, NIC_DATA_SIGNATURE)
/**
This command is used to determine the operational state of the UNDI.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_GET_STATE)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
This command is used to change the UNDI operational state from stopped to started.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_START)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
This command is used to change the UNDI operational state from started to stopped.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_STOP)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
This command is used to retrieve initialization information that is
needed by drivers and applications to initialized UNDI.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_GET_INIT_INFO)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
This command is used to retrieve configuration information about
the NIC being controlled by the UNDI.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_GET_CONFIG_INFO)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
This command resets the network adapter and initializes UNDI using
the parameters supplied in the CPB.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_INITIALIZE)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
This command resets the network adapter and reinitializes the UNDI
with the same parameters provided in the Initialize command.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_RESET)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
The Shutdown command resets the network adapter and leaves it in a
safe state for another driver to initialize.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_SHUTDOWN)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
The Interrupt Enables command can be used to read and/or change
the current external interrupt enable settings.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_INTERRUPT_ENABLE)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
This command is used to read and change receive filters and,
if supported, read and change the multicast MAC address filter list.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_RECEIVE_FILTER)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
This command is used to get current station and broadcast MAC addresses
and, if supported, to change the current station MAC address.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_STATION_ADDRESS)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
This command is used to read and clear the NIC traffic statistics.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_STATISTICS)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
Translate a multicast IPv4 or IPv6 address to a multicast MAC address.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_MCAST_IPTOMAC)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
This command is used to read and write (if supported by NIC H/W)
nonvolatile storage on the NIC.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_NV_DATA)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
This command returns the current interrupt status and/or the
transmitted buffer addresses and the current media status.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_GET_STATUS)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
This command is used to fill the media header(s) in transmit packet(s).
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_FILL_HEADER)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
The Transmit command is used to place a packet into the transmit queue.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_TRANSMIT)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
When the network adapter has received a frame, this command is used
to copy the frame into driver/application storage.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_UNDI_RECEIVE)(
IN PXE_CDB *Cdb,
IN NIC_DATA *Nic
);
/**
This command resets the network adapter and initializes UNDI using
the parameters supplied in the CPB.
@param[in] Cdb A pointer to the command descriptor block.
@param[in, out] Nic A pointer to the Network interface controller data.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_INITIALIZE)(
IN PXE_CDB *Cdb,
IN OUT NIC_DATA *Nic
);
/**
This command is used to read and clear the NIC traffic statistics.
@param[in] Nic A pointer to the Network interface controller data.
@param[in] DbAddr Data Block Address.
@param[in] DbSize Data Block Size.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_STATISTICS)(
IN NIC_DATA *Nic,
IN UINT64 DbAddr,
IN UINT16 DbSize
);
/**
This function is used to manage a USB device with the bulk transfer pipe. The endpoint is Bulk in.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] This A pointer to the EDKII_USB_ETHERNET_PROTOCOL instance.
@param[in, out] Packet A pointer to the buffer of data that will be transmitted to USB
device or received from USB device.
@param[in, out] PacketLength A pointer to the PacketLength.
@retval EFI_SUCCESS The bulk transfer has been successfully executed.
@retval EFI_DEVICE_ERROR The transfer failed. The transfer status is returned in status.
@retval EFI_INVALID_PARAMETER One or more parameters are invalid.
@retval EFI_OUT_OF_RESOURCES The request could not be submitted due to a lack of resources.
@retval EFI_TIMEOUT The control transfer fails due to timeout.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_RECEIVE)(
IN PXE_CDB *Cdb,
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN OUT VOID *Packet,
IN OUT UINTN *PacketLength
);
/**
This function is used to manage a USB device with the bulk transfer pipe. The endpoint is Bulk out.
@param[in] Cdb A pointer to the command descriptor block.
@param[in] This A pointer to the EDKII_USB_ETHERNET_PROTOCOL instance.
@param[in, out] Packet A pointer to the buffer of data that will be transmitted to USB
device or received from USB device.
@param[in, out] PacketLength A pointer to the PacketLength.
@retval EFI_SUCCESS The bulk transfer has been successfully executed.
@retval EFI_DEVICE_ERROR The transfer failed. The transfer status is returned in status.
@retval EFI_INVALID_PARAMETER One or more parameters are invalid.
@retval EFI_OUT_OF_RESOURCES The request could not be submitted due to a lack of resources.
@retval EFI_TIMEOUT The control transfer fails due to timeout.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_TRANSMIT)(
IN PXE_CDB *Cdb,
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN OUT VOID *Packet,
IN OUT UINTN *PacketLength
);
/**
This function is used to manage a USB device with an interrupt transfer pipe.
@param[in] This A pointer to the EDKII_USB_ETHERNET_PROTOCOL instance.
@param[in] IsNewTransfer If TRUE, a new transfer will be submitted to USB controller. If
FALSE, the interrupt transfer is deleted from the device's interrupt
transfer queue.
@param[in] PollingInterval Indicates the periodic rate, in milliseconds, that the transfer is to be
executed.This parameter is required when IsNewTransfer is TRUE. The
value must be between 1 to 255, otherwise EFI_INVALID_PARAMETER is returned.
The units are in milliseconds.
@param[in] Request A pointer to the EFI_USB_DEVICE_REQUEST data.
@retval EFI_SUCCESS The asynchronous USB transfer request transfer has been successfully executed.
@retval EFI_DEVICE_ERROR The asynchronous USB transfer request failed.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_INTERRUPT)(
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN BOOLEAN IsNewTransfer,
IN UINTN PollingInterval,
IN EFI_USB_DEVICE_REQUEST *Request
);
/**
Retrieves the USB Ethernet Mac Address.
@param[in] This A pointer to the EDKII_USB_ETHERNET_PROTOCOL instance.
@param[out] MacAddress A pointer to the caller allocated USB Ethernet Mac Address.
@retval EFI_SUCCESS The USB Header Functional descriptor was retrieved successfully.
@retval EFI_INVALID_PARAMETER UsbHeaderFunDescriptor is NULL.
@retval EFI_NOT_FOUND The USB Header Functional descriptor was not found.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_GET_ETH_MAC_ADDRESS)(
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT EFI_MAC_ADDRESS *MacAddress
);
/**
Retrieves the USB Ethernet Bulk transfer data size.
@param[in] This A pointer to the EDKII_USB_ETHERNET_PROTOCOL instance.
@param[out] BulkSize A pointer to the Bulk transfer data size.
@retval EFI_SUCCESS The USB Header Functional descriptor was retrieved successfully.
@retval EFI_INVALID_PARAMETER UsbHeaderFunDescriptor is NULL.
@retval EFI_NOT_FOUND The USB Header Functional descriptor was not found.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETH_MAX_BULK_SIZE)(
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT UINTN *BulkSize
);
/**
Retrieves the USB Header functional Descriptor.
@param[in] This A pointer to the EDKII_USB_ETHERNET_PROTOCOL instance.
@param[out] UsbHeaderFunDescriptor A pointer to the caller allocated USB Header Functional Descriptor.
@retval EFI_SUCCESS The USB Header Functional descriptor was retrieved successfully.
@retval EFI_INVALID_PARAMETER UsbHeaderFunDescriptor is NULL.
@retval EFI_NOT_FOUND The USB Header Functional descriptor was not found.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_HEADER_FUNCTIONAL_DESCRIPTOR)(
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT USB_HEADER_FUN_DESCRIPTOR *UsbHeaderFunDescriptor
);
/**
Retrieves the USB Union functional Descriptor.
@param[in] This A pointer to the EDKII_USB_ETHERNET_PROTOCOL instance.
@param[out] UsbUnionFunDescriptor A pointer to the caller allocated USB Union Functional Descriptor.
@retval EFI_SUCCESS The USB Union Functional descriptor was retrieved successfully.
@retval EFI_INVALID_PARAMETER UsbUnionFunDescriptor is NULL.
@retval EFI_NOT_FOUND The USB Union Functional descriptor was not found.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_UNION_FUNCTIONAL_DESCRIPTOR)(
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT USB_UNION_FUN_DESCRIPTOR *UsbUnionFunDescriptor
);
/**
Retrieves the USB Ethernet functional Descriptor.
@param[in] This A pointer to the EDKII_USB_ETHERNET_PROTOCOL instance.
@param[out] UsbEthFunDescriptor A pointer to the caller allocated USB Ethernet Functional Descriptor.
@retval EFI_SUCCESS The USB Ethernet Functional descriptor was retrieved successfully.
@retval EFI_INVALID_PARAMETER UsbEthFunDescriptor is NULL.
@retval EFI_NOT_FOUND The USB Ethernet Functional descriptor was not found.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_FUNCTIONAL_DESCRIPTOR)(
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT USB_ETHERNET_FUN_DESCRIPTOR *UsbEthFunDescriptor
);
/**
This request sets the Ethernet device multicast filters as specified in the
sequential list of 48 bit Ethernet multicast addresses.
@param[in] This A pointer to the EDKII_USB_ETHERNET_PROTOCOL instance.
@param[in] Value Number of filters.
@param[in] McastAddr A pointer to the value of the multicast addresses.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_SET_ETH_MULTICAST_FILTERS)(
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 Value,
IN VOID *McastAddr
);
/**
This request sets up the specified Ethernet power management pattern filter as
described in the data structure.
@param[in] This A pointer to the EDKII_USB_ETHERNET_PROTOCOL instance.
@param[in] Value Number of filters.
@param[in] Length Size of the power management pattern filter data.
@param[in] PatternFilter A pointer to the power management pattern filter structure.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_SET_ETH_POWER_MANAGE_PATTERN_FILTER)(
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 Value,
IN UINT16 Length,
IN VOID *PatternFilter
);
/**
This request retrieves the status of the specified Ethernet power management
pattern filter from the device.
@param[in] This A pointer to the EDKII_USB_ETHERNET_PROTOCOL instance.
@param[in] Value The filter number.
@param[out] PatternActive A pointer to the pattern active boolean.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_GET_ETH_POWER_MANAGE_PATTERN_FILTER)(
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 Value,
OUT BOOLEAN *PatternActive
);
/**
This request is used to configure device Ethernet packet filter settings.
@param[in] This A pointer to the EDKII_USB_ETHERNET_PROTOCOL instance.
@param[in] Value Packet Filter Bitmap.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_SET_ETH_PACKET_FILTER)(
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 Value
);
/**
This request is used to retrieve a statistic based on the feature selector.
@param[in] This A pointer to the EDKII_USB_ETHERNET_PROTOCOL instance.
@param[in] FeatureSelector Value of the feature selector.
@param[out] Statistic A pointer to the 32 bit unsigned integer.
@retval EFI_SUCCESS The request executed successfully.
@retval EFI_TIMEOUT A timeout occurred executing the request.
@retval EFI_DEVICE_ERROR The request failed due to a device error.
@retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
@retval EFI_UNSUPPORTED Not supported.
**/
typedef
EFI_STATUS
(EFIAPI *EDKII_USB_ETHERNET_GET_ETH_STATISTIC)(
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 FeatureSelector,
OUT VOID *Statistic
);
typedef struct {
EDKII_USB_ETHERNET_UNDI_GET_STATE UsbEthUndiGetState;
EDKII_USB_ETHERNET_UNDI_START UsbEthUndiStart;
EDKII_USB_ETHERNET_UNDI_STOP UsbEthUndiStop;
EDKII_USB_ETHERNET_UNDI_GET_INIT_INFO UsbEthUndiGetInitInfo;
EDKII_USB_ETHERNET_UNDI_GET_CONFIG_INFO UsbEthUndiGetConfigInfo;
EDKII_USB_ETHERNET_UNDI_INITIALIZE UsbEthUndiInitialize;
EDKII_USB_ETHERNET_UNDI_RESET UsbEthUndiReset;
EDKII_USB_ETHERNET_UNDI_SHUTDOWN UsbEthUndiShutdown;
EDKII_USB_ETHERNET_UNDI_INTERRUPT_ENABLE UsbEthUndiInterruptEnable;
EDKII_USB_ETHERNET_UNDI_RECEIVE_FILTER UsbEthUndiReceiveFilter;
EDKII_USB_ETHERNET_UNDI_STATION_ADDRESS UsbEthUndiStationAddress;
EDKII_USB_ETHERNET_UNDI_STATISTICS UsbEthUndiStatistics;
EDKII_USB_ETHERNET_UNDI_MCAST_IPTOMAC UsbEthUndiMcastIp2Mac;
EDKII_USB_ETHERNET_UNDI_NV_DATA UsbEthUndiNvData;
EDKII_USB_ETHERNET_UNDI_GET_STATUS UsbEthUndiGetStatus;
EDKII_USB_ETHERNET_UNDI_FILL_HEADER UsbEthUndiFillHeader;
EDKII_USB_ETHERNET_UNDI_TRANSMIT UsbEthUndiTransmit;
EDKII_USB_ETHERNET_UNDI_RECEIVE UsbEthUndiReceive;
} EDKII_USB_ETHERNET_UNDI;
// The EDKII_USB_ETHERNET_PROTOCOL provides some basic USB Ethernet device relevant
// descriptor and specific requests.
struct _EDKII_USB_ETHERNET_PROTOCOL {
EDKII_USB_ETHERNET_UNDI UsbEthUndi;
// for calling the UNDI child functions
EDKII_USB_ETHERNET_INITIALIZE UsbEthInitialize;
EDKII_USB_ETHERNET_STATISTICS UsbEthStatistics;
EDKII_USB_ETHERNET_RECEIVE UsbEthReceive;
EDKII_USB_ETHERNET_TRANSMIT UsbEthTransmit;
EDKII_USB_ETHERNET_INTERRUPT UsbEthInterrupt;
EDKII_USB_GET_ETH_MAC_ADDRESS UsbEthMacAddress;
EDKII_USB_ETH_MAX_BULK_SIZE UsbEthMaxBulkSize;
EDKII_USB_HEADER_FUNCTIONAL_DESCRIPTOR UsbHeaderFunDescriptor;
EDKII_USB_UNION_FUNCTIONAL_DESCRIPTOR UsbUnionFunDescriptor;
EDKII_USB_ETHERNET_FUNCTIONAL_DESCRIPTOR UsbEthFunDescriptor;
EDKII_USB_ETHERNET_SET_ETH_MULTICAST_FILTERS SetUsbEthMcastFilter;
EDKII_USB_ETHERNET_SET_ETH_POWER_MANAGE_PATTERN_FILTER SetUsbEthPowerPatternFilter;
EDKII_USB_ETHERNET_GET_ETH_POWER_MANAGE_PATTERN_FILTER GetUsbEthPowerPatternFilter;
EDKII_USB_ETHERNET_SET_ETH_PACKET_FILTER SetUsbEthPacketFilter;
EDKII_USB_ETHERNET_GET_ETH_STATISTIC GetUsbEthStatistic;
};
extern EFI_GUID gEdkIIUsbEthProtocolGuid;
#endif