summaryrefslogblamecommitdiffstats
path: root/src/drivers/net/ecm.h
blob: 9d9aad52719408e0c33c0d88085d2bcf240ddaa1 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14













                               

































                                                                         





                                            
                                 










                                             













                                       





                                 



















                                                                   







                                                                       
#ifndef _ECM_H
#define _ECM_H

/** @file
 *
 * CDC-ECM USB Ethernet driver
 *
 */

FILE_LICENCE ( GPL2_OR_LATER );

#include <ipxe/usb.h>
#include <ipxe/cdc.h>

/** CDC-ECM subclass */
#define USB_SUBCLASS_CDC_ECM 0x06

/** CDC-ECM interfaces */
enum ecm_interfaces {
	/** Communications interface */
	ECM_INTERFACE_COMMS = 0,
	/** Data interface */
	ECM_INTERFACE_DATA,
	ECM_INTERFACE_COUNT
};

/** Alternate setting for CDC-ECM data interface */
#define ECM_DATA_ALTERNATE 1

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

	/** Communications interface */
	unsigned int comms;
	/** Data interface */
	unsigned int data;

	/** Interrupt endpoint */
	struct usb_endpoint intr;
	/** Bulk IN endpoint */
	struct usb_endpoint in;
	/** Bulk OUT endpoint */
	struct usb_endpoint out;
};

/** 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_device *usb,
			   struct ecm_ethernet_descriptor *desc,
			   uint8_t *hw_addr );

#endif /* _ECM_H */