1
2
3
4
5
6
7
8
9
10#define NVS_RESPSIZE_MAX 256
11
12
13
14
15#define NDIS_VERSION_6_1 0x00060001
16#define NDIS_VERSION_6_20 0x00060014
17#define NDIS_VERSION_6_30 0x0006001e
18#define NDIS_VERSION_MAJOR(ver) (((ver) & 0xffff0000) >> 16)
19#define NDIS_VERSION_MINOR(ver) ((ver) & 0xffff)
20
21
22
23
24#define NVS_VERSION_1 0x00002
25#define NVS_VERSION_2 0x30002
26#define NVS_VERSION_4 0x40000
27#define NVS_VERSION_5 0x50000
28#define NVS_VERSION_6 0x60000
29#define NVS_VERSION_61 0x60001
30
31#define NVS_RXBUF_SIG 0xcafe
32#define NVS_CHIM_SIG 0xface
33
34#define NVS_CHIM_IDX_INVALID 0xffffffff
35
36#define NVS_RNDIS_MTYPE_DATA 0
37#define NVS_RNDIS_MTYPE_CTRL 1
38
39
40
41
42#define NVS_STATUS_OK 1
43#define NVS_STATUS_FAILED 2
44
45
46
47
48#define NVS_TYPE_INIT 1
49#define NVS_TYPE_INIT_RESP 2
50
51#define NVS_TYPE_NDIS_INIT 100
52#define NVS_TYPE_RXBUF_CONN 101
53#define NVS_TYPE_RXBUF_CONNRESP 102
54#define NVS_TYPE_RXBUF_DISCONN 103
55#define NVS_TYPE_CHIM_CONN 104
56#define NVS_TYPE_CHIM_CONNRESP 105
57#define NVS_TYPE_CHIM_DISCONN 106
58#define NVS_TYPE_RNDIS 107
59#define NVS_TYPE_RNDIS_ACK 108
60
61#define NVS_TYPE_NDIS_CONF 125
62#define NVS_TYPE_VFASSOC_NOTE 128
63#define NVS_TYPE_SET_DATAPATH 129
64#define NVS_TYPE_SUBCH_REQ 133
65#define NVS_TYPE_SUBCH_RESP 133
66#define NVS_TYPE_TXTBL_NOTE 134
67
68
69
70struct hn_nvs_hdr {
71 uint32_t type;
72} __rte_packed;
73
74struct hn_nvs_init {
75 uint32_t type;
76 uint32_t ver_min;
77 uint32_t ver_max;
78 uint8_t rsvd[28];
79} __rte_packed;
80
81struct hn_nvs_init_resp {
82 uint32_t type;
83 uint32_t ver;
84 uint32_t rsvd;
85 uint32_t status;
86} __rte_packed;
87
88
89struct hn_nvs_ndis_conf {
90 uint32_t type;
91 uint32_t mtu;
92 uint32_t rsvd;
93 uint64_t caps;
94 uint8_t rsvd1[20];
95} __rte_packed;
96
97#define NVS_NDIS_CONF_SRIOV 0x0004
98#define NVS_NDIS_CONF_VLAN 0x0008
99
100
101struct hn_nvs_ndis_init {
102 uint32_t type;
103 uint32_t ndis_major;
104 uint32_t ndis_minor;
105 uint8_t rsvd[28];
106} __rte_packed;
107
108struct hn_nvs_vf_association {
109 uint32_t type;
110 uint32_t allocated;
111 uint32_t serial;
112} __rte_packed;
113
114#define NVS_DATAPATH_SYNTHETIC 0
115#define NVS_DATAPATH_VF 1
116
117
118struct hn_nvs_datapath {
119 uint32_t type;
120 uint32_t active_path;
121 uint8_t rsvd[32];
122} __rte_packed;
123
124struct hn_nvs_rxbuf_conn {
125 uint32_t type;
126 uint32_t gpadl;
127 uint16_t sig;
128 uint8_t rsvd[30];
129} __rte_packed;
130
131struct hn_nvs_rxbuf_sect {
132 uint32_t start;
133 uint32_t slotsz;
134 uint32_t slotcnt;
135 uint32_t end;
136} __rte_packed;
137
138struct hn_nvs_rxbuf_connresp {
139 uint32_t type;
140 uint32_t status;
141 uint32_t nsect;
142 struct hn_nvs_rxbuf_sect nvs_sect[1];
143} __rte_packed;
144
145
146struct hn_nvs_rxbuf_disconn {
147 uint32_t type;
148 uint16_t sig;
149 uint8_t rsvd[34];
150} __rte_packed;
151
152struct hn_nvs_chim_conn {
153 uint32_t type;
154 uint32_t gpadl;
155 uint16_t sig;
156 uint8_t rsvd[30];
157} __rte_packed;
158
159struct hn_nvs_chim_connresp {
160 uint32_t type;
161 uint32_t status;
162 uint32_t sectsz;
163} __rte_packed;
164
165
166struct hn_nvs_chim_disconn {
167 uint32_t type;
168 uint16_t sig;
169 uint8_t rsvd[34];
170} __rte_packed;
171
172#define NVS_SUBCH_OP_ALLOC 1
173
174struct hn_nvs_subch_req {
175 uint32_t type;
176 uint32_t op;
177 uint32_t nsubch;
178 uint8_t rsvd[28];
179} __rte_packed;
180
181struct hn_nvs_subch_resp {
182 uint32_t type;
183 uint32_t status;
184 uint32_t nsubch;
185 uint8_t rsvd[28];
186} __rte_packed;
187
188struct hn_nvs_rndis {
189 uint32_t type;
190 uint32_t rndis_mtype;
191
192
193
194
195
196
197
198
199 uint32_t chim_idx;
200 uint32_t chim_sz;
201 uint8_t rsvd[24];
202} __rte_packed;
203
204struct hn_nvs_rndis_ack {
205 uint32_t type;
206 uint32_t status;
207 uint8_t rsvd[32];
208} __rte_packed;
209
210
211int hn_nvs_attach(struct hn_data *hv, unsigned int mtu);
212void hn_nvs_detach(struct hn_data *hv);
213void hn_nvs_ack_rxbuf(struct vmbus_channel *chan, uint64_t tid);
214int hn_nvs_alloc_subchans(struct hn_data *hv, uint32_t *nsubch);
215void hn_nvs_set_datapath(struct hn_data *hv, uint32_t path);
216void hn_nvs_handle_vfassoc(struct rte_eth_dev *dev,
217 const struct vmbus_chanpkt_hdr *hdr,
218 const void *data);
219
220static inline int
221hn_nvs_send(struct vmbus_channel *chan, uint16_t flags,
222 void *nvs_msg, int nvs_msglen, uintptr_t sndc,
223 bool *need_sig)
224{
225 return rte_vmbus_chan_send(chan, VMBUS_CHANPKT_TYPE_INBAND,
226 nvs_msg, nvs_msglen, (uint64_t)sndc,
227 flags, need_sig);
228}
229
230static inline int
231hn_nvs_send_sglist(struct vmbus_channel *chan,
232 struct vmbus_gpa sg[], unsigned int sglen,
233 void *nvs_msg, int nvs_msglen,
234 uintptr_t sndc, bool *need_sig)
235{
236 return rte_vmbus_chan_send_sglist(chan, sg, sglen, nvs_msg, nvs_msglen,
237 (uint64_t)sndc, need_sig);
238}
239