These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / ipxe / src / drivers / net / ncm.h
diff --git a/qemu/roms/ipxe/src/drivers/net/ncm.h b/qemu/roms/ipxe/src/drivers/net/ncm.h
new file mode 100644 (file)
index 0000000..a9565a5
--- /dev/null
@@ -0,0 +1,173 @@
+#ifndef _NCM_H
+#define _NCM_H
+
+/** @file
+ *
+ * CDC-NCM USB Ethernet driver
+ *
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+
+#include <stdint.h>
+#include <ipxe/usb.h>
+#include <ipxe/cdc.h>
+#include <byteswap.h>
+#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 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 */