#ifndef _ECM_H #define _ECM_H /** @file * * CDC-ECM USB Ethernet driver * */ FILE_LICENCE ( GPL2_OR_LATER ); #include #include /** 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 */