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