#ifndef _NCM_H #define _NCM_H /** @file * * CDC-NCM USB Ethernet driver * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include #include #include "ecm.h" /** CDC-NCM subclass */ #define USB_SUBCLASS_CDC_NCM 0x0d /** Get NTB parameters */ #define NCM_GET_NTB_PARAMETERS \ ( USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE | \ USB_REQUEST_TYPE ( 0x80 ) ) /** NTB datagram parameters */ struct ncm_ntb_datagram_parameters { /** Maximum size */ uint32_t mtu; /** Alignment divisor */ uint16_t divisor; /** Alignment remainder */ uint16_t remainder; /** Alignment modulus */ uint16_t modulus; } __attribute__ (( packed )); /** NTB parameters */ struct ncm_ntb_parameters { /** Length */ uint16_t len; /** Supported formats */ uint16_t formats; /** IN datagram parameters */ struct ncm_ntb_datagram_parameters in; /** Reserved */ uint16_t reserved; /** OUT datagram parameters */ struct ncm_ntb_datagram_parameters out; /** Maximum number of datagrams per OUT NTB */ uint16_t max; } __attribute__ (( packed )); /** Set MAC address */ #define NCM_SET_NET_ADDRESS \ ( USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE | \ USB_REQUEST_TYPE ( 0x82 ) ) /** Set NTB input size */ #define NCM_SET_NTB_INPUT_SIZE \ ( USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE | \ USB_REQUEST_TYPE ( 0x86 ) ) /** Set NTB input size */ struct ncm_set_ntb_input_size { /** Maximum size */ uint32_t mtu; } __attribute__ (( packed )); /** Minimum allowed NTB input size */ #define NCM_MIN_NTB_INPUT_SIZE 2048 /** Maximum allowed NTB input size (16-bit) */ #define NCM_MAX_NTB_INPUT_SIZE 65536 /** CDC-NCM transfer header (16-bit) */ struct ncm_transfer_header { /** Signature */ uint32_t magic; /** Header length */ uint16_t header_len; /** Sequence number */ uint16_t sequence; /** Total length */ uint16_t len; /** Offset of first datagram pointer */ uint16_t offset; } __attribute__ (( packed )); /** CDC-NCM transfer header magic */ #define NCM_TRANSFER_HEADER_MAGIC 0x484d434eUL /** CDC-NCM datagram descriptor (16-bit) */ struct ncm_datagram_descriptor { /** Starting offset */ uint16_t offset; /** Length */ uint16_t len; } __attribute__ (( packed )); /** CDC-NCM datagram pointer (16-bit) */ struct ncm_datagram_pointer { /** Signature */ uint32_t magic; /** Header length */ uint16_t header_len; /** Offset of next datagram pointer */ uint16_t offset; /** Datagram descriptors * * Must be terminated by an empty descriptor. */ struct ncm_datagram_descriptor desc[0]; } __attribute__ (( packed )); /** CDC-NCM datagram pointer magic */ #define NCM_DATAGRAM_POINTER_MAGIC 0x304d434eUL /** CDC-NCM datagram pointer CRC present flag */ #define NCM_DATAGRAM_POINTER_MAGIC_CRC 0x01000000UL /** NTB constructed for transmitted packets (excluding padding) * * This is a policy decision. */ struct ncm_ntb_header { /** Transfer header */ struct ncm_transfer_header nth; /** Datagram pointer */ struct ncm_datagram_pointer ndp; /** Datagram descriptors */ struct ncm_datagram_descriptor desc[2]; } __attribute__ (( packed )); /** A CDC-NCM network device */ struct ncm_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; /** Maximum supported NTB input size */ size_t mtu; /** Transmitted packet sequence number */ uint16_t sequence; /** Alignment padding required on transmitted packets */ size_t padding; }; /** Bulk IN ring minimum buffer count * * This is a policy decision. */ #define NCM_IN_MIN_COUNT 3 /** Bulk IN ring minimum total buffer size * * This is a policy decision. */ #define NCM_IN_MIN_SIZE 16384 /** Bulk IN ring maximum total buffer size * * This is a policy decision. */ #define NCM_IN_MAX_SIZE 131072 /** Interrupt ring buffer count * * This is a policy decision. */ #define NCM_INTR_COUNT 2 #endif /* _NCM_H */