These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / ipxe / src / drivers / net / ncm.h
1 #ifndef _NCM_H
2 #define _NCM_H
3
4 /** @file
5  *
6  * CDC-NCM USB Ethernet driver
7  *
8  */
9
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11
12 #include <stdint.h>
13 #include <ipxe/usb.h>
14 #include <ipxe/cdc.h>
15 #include <byteswap.h>
16 #include "ecm.h"
17
18 /** CDC-NCM subclass */
19 #define USB_SUBCLASS_CDC_NCM 0x0d
20
21 /** Get NTB parameters */
22 #define NCM_GET_NTB_PARAMETERS                                          \
23         ( USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE |           \
24           USB_REQUEST_TYPE ( 0x80 ) )
25
26 /** NTB datagram parameters */
27 struct ncm_ntb_datagram_parameters {
28         /** Maximum size */
29         uint32_t mtu;
30         /** Alignment divisor */
31         uint16_t divisor;
32         /** Alignment remainder */
33         uint16_t remainder;
34         /** Alignment modulus */
35         uint16_t modulus;
36 } __attribute__ (( packed ));
37
38 /** NTB parameters */
39 struct ncm_ntb_parameters {
40         /** Length */
41         uint16_t len;
42         /** Supported formats */
43         uint16_t formats;
44         /** IN datagram parameters */
45         struct ncm_ntb_datagram_parameters in;
46         /** Reserved */
47         uint16_t reserved;
48         /** OUT datagram parameters */
49         struct ncm_ntb_datagram_parameters out;
50         /** Maximum number of datagrams per OUT NTB */
51         uint16_t max;
52 } __attribute__ (( packed ));
53
54 /** Set NTB input size */
55 #define NCM_SET_NTB_INPUT_SIZE                                          \
56         ( USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE |          \
57           USB_REQUEST_TYPE ( 0x86 ) )
58
59 /** Set NTB input size */
60 struct ncm_set_ntb_input_size {
61         /** Maximum size */
62         uint32_t mtu;
63 } __attribute__ (( packed ));
64
65 /** Minimum allowed NTB input size */
66 #define NCM_MIN_NTB_INPUT_SIZE 2048
67
68 /** Maximum allowed NTB input size (16-bit) */
69 #define NCM_MAX_NTB_INPUT_SIZE 65536
70
71 /** CDC-NCM transfer header (16-bit) */
72 struct ncm_transfer_header {
73         /** Signature */
74         uint32_t magic;
75         /** Header length */
76         uint16_t header_len;
77         /** Sequence number */
78         uint16_t sequence;
79         /** Total length */
80         uint16_t len;
81         /** Offset of first datagram pointer */
82         uint16_t offset;
83 } __attribute__ (( packed ));
84
85 /** CDC-NCM transfer header magic */
86 #define NCM_TRANSFER_HEADER_MAGIC 0x484d434eUL
87
88 /** CDC-NCM datagram descriptor (16-bit) */
89 struct ncm_datagram_descriptor {
90         /** Starting offset */
91         uint16_t offset;
92         /** Length */
93         uint16_t len;
94 } __attribute__ (( packed ));
95
96 /** CDC-NCM datagram pointer (16-bit) */
97 struct ncm_datagram_pointer {
98         /** Signature */
99         uint32_t magic;
100         /** Header length */
101         uint16_t header_len;
102         /** Offset of next datagram pointer */
103         uint16_t offset;
104         /** Datagram descriptors
105          *
106          * Must be terminated by an empty descriptor.
107          */
108         struct ncm_datagram_descriptor desc[0];
109 } __attribute__ (( packed ));
110
111 /** CDC-NCM datagram pointer magic */
112 #define NCM_DATAGRAM_POINTER_MAGIC 0x304d434eUL
113
114 /** CDC-NCM datagram pointer CRC present flag */
115 #define NCM_DATAGRAM_POINTER_MAGIC_CRC 0x01000000UL
116
117 /** NTB constructed for transmitted packets (excluding padding)
118  *
119  * This is a policy decision.
120  */
121 struct ncm_ntb_header {
122         /** Transfer header */
123         struct ncm_transfer_header nth;
124         /** Datagram pointer */
125         struct ncm_datagram_pointer ndp;
126         /** Datagram descriptors */
127         struct ncm_datagram_descriptor desc[2];
128 } __attribute__ (( packed ));
129
130 /** A CDC-NCM network device */
131 struct ncm_device {
132         /** USB device */
133         struct usb_device *usb;
134         /** USB bus */
135         struct usb_bus *bus;
136         /** Network device */
137         struct net_device *netdev;
138         /** USB network device */
139         struct usbnet_device usbnet;
140
141         /** Maximum supported NTB input size */
142         size_t mtu;
143         /** Transmitted packet sequence number */
144         uint16_t sequence;
145         /** Alignment padding required on transmitted packets */
146         size_t padding;
147 };
148
149 /** Bulk IN ring minimum buffer count
150  *
151  * This is a policy decision.
152  */
153 #define NCM_IN_MIN_COUNT 3
154
155 /** Bulk IN ring minimum total buffer size
156  *
157  * This is a policy decision.
158  */
159 #define NCM_IN_MIN_SIZE 16384
160
161 /** Bulk IN ring maximum total buffer size
162  *
163  * This is a policy decision.
164  */
165 #define NCM_IN_MAX_SIZE 131072
166
167 /** Interrupt ring buffer count
168  *
169  * This is a policy decision.
170  */
171 #define NCM_INTR_COUNT 2
172
173 #endif /* _NCM_H */