123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- #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 */
|