blob: a7d03cf94aa02549ecdf2c307b3c7d275cd778f2 [file] [log] [blame]
#ifndef _ECM_H
#define _ECM_H
/** @file
*
* CDC-ECM USB Ethernet driver
*
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#include <ipxe/usb.h>
#include <ipxe/usbnet.h>
#include <ipxe/cdc.h>
/** CDC-ECM subclass */
#define USB_SUBCLASS_CDC_ECM 0x06
/** Set Ethernet packet filter */
#define ECM_SET_ETHERNET_PACKET_FILTER \
( USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE | \
USB_REQUEST_TYPE ( 0x43 ) )
/** Ethernet packet types */
enum ecm_ethernet_packet_filter {
/** Promiscuous mode */
ECM_PACKET_TYPE_PROMISCUOUS = 0x0001,
/** All multicast packets */
ECM_PACKET_TYPE_ALL_MULTICAST = 0x0002,
/** Unicast packets */
ECM_PACKET_TYPE_DIRECTED = 0x0004,
/** Broadcast packets */
ECM_PACKET_TYPE_BROADCAST = 0x0008,
/** Specified multicast packets */
ECM_PACKET_TYPE_MULTICAST = 0x0010,
};
/** An Ethernet Functional Descriptor */
struct ecm_ethernet_descriptor {
/** Descriptor header */
struct usb_descriptor_header header;
/** Descriptor subtype */
uint8_t subtype;
/** MAC address string */
uint8_t mac;
/** Ethernet statistics bitmap */
uint32_t statistics;
/** Maximum segment size */
uint16_t mtu;
/** Multicast filter configuration */
uint16_t mcast;
/** Number of wake-on-LAN filters */
uint8_t wol;
} __attribute__ (( packed ));
/** A CDC-ECM network device */
struct ecm_device {
/** USB device */
struct usb_device *usb;
/** USB bus */
struct usb_bus *bus;
/** Network device */
struct net_device *netdev;
/** USB network device */
struct usbnet_device usbnet;
};
/** Interrupt maximum fill level
*
* This is a policy decision.
*/
#define ECM_INTR_MAX_FILL 2
/** Bulk IN maximum fill level
*
* This is a policy decision.
*/
#define ECM_IN_MAX_FILL 8
/** Bulk IN buffer size
*
* This is a policy decision.
*/
#define ECM_IN_MTU ( ETH_FRAME_LEN + 4 /* possible VLAN header */ )
extern struct ecm_ethernet_descriptor *
ecm_ethernet_descriptor ( struct usb_configuration_descriptor *config,
struct usb_interface_descriptor *interface );
extern int ecm_fetch_mac ( struct usb_function *func,
struct ecm_ethernet_descriptor *desc,
struct net_device *netdev );
#endif /* _ECM_H */