/* * USB CDC NCM auxiliary definitions */ #ifndef __LINUX_USB_NCM_H #define __LINUX_USB_NCM_H #include #include #include #define NCM_NTB_MIN_IN_SIZE 2048 #define NCM_NTB_MIN_OUT_SIZE 2048 #define NCM_CONTROL_TIMEOUT (5 * 1000) /* bmNetworkCapabilities */ #define NCM_NCAP_ETH_FILTER (1 << 0) #define NCM_NCAP_NET_ADDRESS (1 << 1) #define NCM_NCAP_ENCAP_COMM (1 << 2) #define NCM_NCAP_MAX_DGRAM (1 << 3) #define NCM_NCAP_CRC_MODE (1 << 4) /* * Here are options for NCM Datagram Pointer table (NDP) parser. * There are 2 different formats: NDP16 and NDP32 in the spec (ch. 3), * in NDP16 offsets and sizes fields are 1 16bit word wide, * in NDP32 -- 2 16bit words wide. Also signatures are different. * To make the parser code the same, put the differences in the structure, * and switch pointers to the structures when the format is changed. */ struct ndp_parser_opts { u32 nth_sign; u32 ndp_sign; unsigned nth_size; unsigned ndp_size; unsigned ndplen_align; /* sizes in u16 units */ unsigned dgram_item_len; /* index or length */ unsigned block_length; unsigned fp_index; unsigned reserved1; unsigned reserved2; unsigned next_fp_index; }; #define INIT_NDP16_OPTS { \ .nth_sign = NCM_NTH16_SIGN, \ .ndp_sign = NCM_NDP16_NOCRC_SIGN, \ .nth_size = sizeof(struct usb_cdc_ncm_nth16), \ .ndp_size = sizeof(struct usb_cdc_ncm_ndp16), \ .ndplen_align = 4, \ .dgram_item_len = 1, \ .block_length = 1, \ .fp_index = 1, \ .reserved1 = 0, \ .reserved2 = 0, \ .next_fp_index = 1, \ } #define INIT_NDP32_OPTS { \ .nth_sign = NCM_NTH32_SIGN, \ .ndp_sign = NCM_NDP32_NOCRC_SIGN, \ .nth_size = sizeof(struct usb_cdc_ncm_nth32), \ .ndp_size = sizeof(struct usb_cdc_ncm_ndp32), \ .ndplen_align = 8, \ .dgram_item_len = 2, \ .block_length = 2, \ .fp_index = 2, \ .reserved1 = 1, \ .reserved2 = 2, \ .next_fp_index = 2, \ } static inline void put_ncm(__le16 **p, unsigned size, unsigned val) { switch (size) { case 1: put_unaligned_le16((u16)val, *p); break; case 2: put_unaligned_le32((u32)val, *p); break; default: BUG(); } *p += size; } static inline unsigned get_ncm(__le16 **p, unsigned size) { unsigned tmp; switch (size) { case 1: tmp = get_unaligned_le16(*p); break; case 2: tmp = get_unaligned_le32(*p); break; default: BUG(); } *p += size; return tmp; } #endif /* __LINUX_USB_NCM_H */