USB: ncm: added ncm.h with auxiliary definitions
authorYauheni Kaliuta <yauheni.kaliuta@nokia.com>
Fri, 16 Apr 2010 13:13:35 +0000 (16:13 +0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 20 May 2010 20:21:39 +0000 (13:21 -0700)
Signed-off-by: Yauheni Kaliuta <yauheni.kaliuta@nokia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
include/linux/usb/ncm.h [new file with mode: 0644]

diff --git a/include/linux/usb/ncm.h b/include/linux/usb/ncm.h
new file mode 100644 (file)
index 0000000..006d106
--- /dev/null
@@ -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 */