| /* | 
 |  * USB CDC NCM auxiliary definitions | 
 |  */ | 
 |  | 
 | #ifndef __LINUX_USB_NCM_H | 
 | #define __LINUX_USB_NCM_H | 
 |  | 
 | #include <linux/types.h> | 
 | #include <linux/usb/cdc.h> | 
 | #include <asm/unaligned.h> | 
 |  | 
 | #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 */ |