mirror of
https://github.com/ipxe/ipxe
synced 2025-12-20 20:10:18 +03:00
133 lines
2.8 KiB
C
133 lines
2.8 KiB
C
#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 receive ring */
|
|
struct ecm_rx_ring {
|
|
/** USB endpoint */
|
|
struct usb_endpoint ep;
|
|
/** I/O buffer size */
|
|
size_t mtu;
|
|
/** Fill level */
|
|
unsigned int fill;
|
|
/** Maximum fill level */
|
|
unsigned int max;
|
|
};
|
|
|
|
/** A CDC-ECM transmit ring */
|
|
struct ecm_tx_ring {
|
|
/** USB endpoint */
|
|
struct usb_endpoint ep;
|
|
};
|
|
|
|
/** 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 ring */
|
|
struct ecm_rx_ring intr;
|
|
/** Bulk IN ring */
|
|
struct ecm_rx_ring in;
|
|
/** Bulk OUT ring */
|
|
struct ecm_tx_ring 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 */
|