|
@@ -0,0 +1,114 @@
|
|
|
+/*
|
|
|
+ * 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 */
|