1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (c) 2018 Microsoft Corp.
7 * The indirection table message is the largest message
8 * received from host, and that is 112 bytes.
10 #define NVS_RESPSIZE_MAX 256
13 * NDIS protocol version numbers
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)
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
31 #define NVS_RXBUF_SIG 0xcafe
32 #define NVS_CHIM_SIG 0xface
34 #define NVS_CHIM_IDX_INVALID 0xffffffff
36 #define NVS_RNDIS_MTYPE_DATA 0
37 #define NVS_RNDIS_MTYPE_CTRL 1
40 * NVS message transaction status codes.
42 #define NVS_STATUS_OK 1
43 #define NVS_STATUS_FAILED 2
46 * NVS request/response message types.
48 #define NVS_TYPE_INIT 1
49 #define NVS_TYPE_INIT_RESP 2
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
61 #define NVS_TYPE_NDIS_CONF 125
62 #define NVS_TYPE_VFASSOC_NOTE 128 /* notification */
63 #define NVS_TYPE_SET_DATAPATH 129
64 #define NVS_TYPE_SUBCH_REQ 133
65 #define NVS_TYPE_SUBCH_RESP 133 /* same as SUBCH_REQ */
66 #define NVS_TYPE_TXTBL_NOTE 134 /* notification */
69 /* NVS message common header */
75 uint32_t type; /* NVS_TYPE_INIT */
81 struct hn_nvs_init_resp {
82 uint32_t type; /* NVS_TYPE_INIT_RESP */
83 uint32_t ver; /* deprecated */
85 uint32_t status; /* NVS_STATUS_ */
89 struct hn_nvs_ndis_conf {
90 uint32_t type; /* NVS_TYPE_NDIS_CONF */
93 uint64_t caps; /* NVS_NDIS_CONF_ */
97 #define NVS_NDIS_CONF_SRIOV 0x0004
98 #define NVS_NDIS_CONF_VLAN 0x0008
101 struct hn_nvs_ndis_init {
102 uint32_t type; /* NVS_TYPE_NDIS_INIT */
103 uint32_t ndis_major; /* NDIS_VERSION_MAJOR_ */
104 uint32_t ndis_minor; /* NDIS_VERSION_MINOR_ */
108 struct hn_nvs_vf_association {
109 uint32_t type; /* NVS_TYPE_VFASSOC_NOTE */
114 #define NVS_DATAPATH_SYNTHETIC 0
115 #define NVS_DATAPATH_VF 1
118 struct hn_nvs_datapath {
119 uint32_t type; /* NVS_TYPE_SET_DATAPATH */
120 uint32_t active_path;/* NVS_DATAPATH_* */
124 struct hn_nvs_rxbuf_conn {
125 uint32_t type; /* NVS_TYPE_RXBUF_CONN */
126 uint32_t gpadl; /* RXBUF vmbus GPADL */
127 uint16_t sig; /* NVS_RXBUF_SIG */
131 struct hn_nvs_rxbuf_sect {
138 struct hn_nvs_rxbuf_connresp {
139 uint32_t type; /* NVS_TYPE_RXBUF_CONNRESP */
140 uint32_t status; /* NVS_STATUS_ */
141 uint32_t nsect; /* # of elem in nvs_sect */
142 struct hn_nvs_rxbuf_sect nvs_sect[1];
146 struct hn_nvs_rxbuf_disconn {
147 uint32_t type; /* NVS_TYPE_RXBUF_DISCONN */
148 uint16_t sig; /* NVS_RXBUF_SIG */
152 struct hn_nvs_chim_conn {
153 uint32_t type; /* NVS_TYPE_CHIM_CONN */
154 uint32_t gpadl; /* chimney buf vmbus GPADL */
155 uint16_t sig; /* NDIS_NVS_CHIM_SIG */
159 struct hn_nvs_chim_connresp {
160 uint32_t type; /* NVS_TYPE_CHIM_CONNRESP */
161 uint32_t status; /* NVS_STATUS_ */
162 uint32_t sectsz; /* section size */
166 struct hn_nvs_chim_disconn {
167 uint32_t type; /* NVS_TYPE_CHIM_DISCONN */
168 uint16_t sig; /* NVS_CHIM_SIG */
172 #define NVS_SUBCH_OP_ALLOC 1
174 struct hn_nvs_subch_req {
175 uint32_t type; /* NVS_TYPE_SUBCH_REQ */
176 uint32_t op; /* NVS_SUBCH_OP_ */
181 struct hn_nvs_subch_resp {
182 uint32_t type; /* NVS_TYPE_SUBCH_RESP */
183 uint32_t status; /* NVS_STATUS_ */
188 struct hn_nvs_rndis {
189 uint32_t type; /* NVS_TYPE_RNDIS */
190 uint32_t rndis_mtype;/* NVS_RNDIS_MTYPE_ */
192 * Chimney sending buffer index and size.
195 * If nvs_chim_idx is set to NVS_CHIM_IDX_INVALID
196 * and nvs_chim_sz is set to 0, then chimney sending
197 * buffer is _not_ used by this RNDIS message.
204 struct hn_nvs_rndis_ack {
205 uint32_t type; /* NVS_TYPE_RNDIS_ACK */
206 uint32_t status; /* NVS_STATUS_ */
211 int hn_nvs_attach(struct hn_data *hv, unsigned int mtu);
212 void hn_nvs_detach(struct hn_data *hv);
213 void hn_nvs_ack_rxbuf(struct vmbus_channel *chan, uint64_t tid);
214 int hn_nvs_alloc_subchans(struct hn_data *hv, uint32_t *nsubch);
215 int hn_nvs_set_datapath(struct hn_data *hv, uint32_t path);
216 void hn_nvs_handle_vfassoc(struct rte_eth_dev *dev,
217 const struct vmbus_chanpkt_hdr *hdr,
221 hn_nvs_send(struct vmbus_channel *chan, uint16_t flags,
222 void *nvs_msg, int nvs_msglen, uintptr_t sndc,
225 return rte_vmbus_chan_send(chan, VMBUS_CHANPKT_TYPE_INBAND,
226 nvs_msg, nvs_msglen, (uint64_t)sndc,
231 hn_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)
236 return rte_vmbus_chan_send_sglist(chan, sg, sglen, nvs_msg, nvs_msglen,
237 (uint64_t)sndc, need_sig);