/** @file
Header file for USB Network Control Model driver
Copyright (c) 2023, American Megatrends International LLC. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef USB_CDC_NCM_H_
#define USB_CDC_NCM_H_
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef struct {
UINTN Signature;
EDKII_USB_ETHERNET_PROTOCOL UsbEth;
EFI_HANDLE UsbCdcDataHandle;
EFI_USB_IO_PROTOCOL *UsbIo;
EFI_USB_CONFIG_DESCRIPTOR *Config;
UINT8 NumOfInterface;
UINT8 BulkInEndpoint;
UINT8 BulkOutEndpoint;
UINT8 InterruptEndpoint;
EFI_MAC_ADDRESS MacAddress;
UINT16 BulkOutSequence;
UINT8 *BulkBuffer;
UINT8 TotalDatagram;
UINT8 NowDatagram;
} USB_ETHERNET_DRIVER;
#define USB_NCM_DRIVER_VERSION 1
#define USB_ETHERNET_BULK_TIMEOUT 1
#define USB_ETHERNET_TRANSFER_TIMEOUT 200
#define USB_NCM_MAX_NTB_SIZE 0xFFFF
#define USB_ETHERNET_FRAME_SIZE 0x5F2 // MAX ethernet frame size
// Defined in USB NCM 1.0 spec., section 3.2 and 3.3
#define USB_NCM_NTH_SIGN_16 0x484D434E
#define USB_NCM_NDP_SIGN_16 0x304D434E
#define USB_NCM_NDP_SIGN_16_CRC 0x314D434E
#define USB_NCM_NTH_LENGTH 0x000C
#define USB_NCM_NDP_LENGTH 0x0010// at least 16
// USB NCM Transfer header structure - UINT16
typedef struct {
UINT32 Signature;
UINT16 HeaderLength;
UINT16 Sequence;
UINT16 BlockLength;
UINT16 NdpIndex;
} USB_NCM_TRANSFER_HEADER_16;
// USB NCM Datagram pointer structure - UINT16
typedef struct {
UINT32 Signature;
UINT16 Length;
UINT16 NextNdpIndex;
} USB_NCM_DATAGRAM_POINTER_16;
// USB NCM Datagram structure
typedef struct {
UINT16 DatagramIndex;
UINT16 DatagramLength;
} USB_NCM_DATA_GRAM;
#define USB_ETHERNET_SIGNATURE SIGNATURE_32('u', 'e', 't', 'h')
#define USB_ETHERNET_DEV_FROM_THIS(a) CR (a, USB_ETHERNET_DRIVER, UsbEth, USB_ETHERNET_SIGNATURE)
typedef struct {
UINT16 Src;
UINT16 Dst;
} BIT_MAP;
extern EFI_COMPONENT_NAME2_PROTOCOL gUsbNcmComponentName2;
EFI_STATUS
EFIAPI
UsbNcmDriverSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
);
EFI_STATUS
EFIAPI
UsbNcmDriverStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
);
EFI_STATUS
EFIAPI
UsbNcmDriverStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer
);
EFI_STATUS
LoadAllDescriptor (
IN EFI_USB_IO_PROTOCOL *UsbIo,
OUT EFI_USB_CONFIG_DESCRIPTOR **ConfigDesc
);
BOOLEAN
NextDescriptor (
IN EFI_USB_CONFIG_DESCRIPTOR *Desc,
IN OUT UINTN *Offset
);
EFI_STATUS
GetFunctionalDescriptor (
IN EFI_USB_CONFIG_DESCRIPTOR *Config,
IN UINT8 FunDescriptorType,
OUT VOID *DataBuffer
);
VOID
GetEndpoint (
IN EFI_USB_IO_PROTOCOL *UsbIo,
IN OUT USB_ETHERNET_DRIVER *UsbEthDriver
);
EFI_STATUS
EFIAPI
UsbEthNcmReceive (
IN PXE_CDB *Cdb,
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN OUT VOID *Packet,
IN OUT UINTN *PacketLength
);
EFI_STATUS
EFIAPI
UsbEthNcmTransmit (
IN PXE_CDB *Cdb,
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN VOID *Packet,
IN OUT UINTN *PacketLength
);
EFI_STATUS
EFIAPI
UsbEthNcmInterrupt (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN BOOLEAN IsNewTransfer,
IN UINTN PollingInterval,
IN EFI_USB_DEVICE_REQUEST *Request
);
EFI_STATUS
EFIAPI
InterruptCallback (
IN VOID *Data,
IN UINTN DataLength,
IN VOID *Context,
IN UINT32 Status
);
EFI_STATUS
EFIAPI
GetUsbEthMacAddress (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT EFI_MAC_ADDRESS *MacAddress
);
EFI_STATUS
EFIAPI
UsbEthNcmBulkSize (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT UINTN *BulkSize
);
EFI_STATUS
EFIAPI
GetUsbHeaderFunDescriptor (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT USB_HEADER_FUN_DESCRIPTOR *UsbHeaderFunDescriptor
);
EFI_STATUS
EFIAPI
GetUsbUnionFunDescriptor (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT USB_UNION_FUN_DESCRIPTOR *UsbUnionFunDescriptor
);
EFI_STATUS
EFIAPI
GetUsbEthFunDescriptor (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
OUT USB_ETHERNET_FUN_DESCRIPTOR *UsbEthFunDescriptor
);
EFI_STATUS
EFIAPI
SetUsbEthMcastFilter (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 Value,
IN VOID *McastAddr
);
EFI_STATUS
EFIAPI
SetUsbEthPowerFilter (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 Value,
IN UINT16 Length,
IN VOID *PatternFilter
);
EFI_STATUS
EFIAPI
GetUsbEthPowerFilter (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 Value,
OUT BOOLEAN *PatternActive
);
EFI_STATUS
EFIAPI
SetUsbEthPacketFilter (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 Value
);
EFI_STATUS
EFIAPI
GetUsbEthStatistic (
IN EDKII_USB_ETHERNET_PROTOCOL *This,
IN UINT16 FeatureSelector,
OUT VOID *Statistic
);
#endif