summaryrefslogtreecommitdiff
path: root/drivers/staging/hv/include/nvspprotocol.h
blob: 2ee9dbf0899a1078b513746bb788507f1b5024bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
/*
 *
 * Copyright (c) 2009, Microsoft Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place - Suite 330, Boston, MA 02111-1307 USA.
 *
 * Authors:
 *   Haiyang Zhang <haiyangz@microsoft.com>
 *   Hank Janssen  <hjanssen@microsoft.com>
 *
 */


#pragma once

#include "VmbusChannelInterface.h"

#define NVSP_INVALID_PROTOCOL_VERSION           ((u32)0xFFFFFFFF)

#define NVSP_PROTOCOL_VERSION_1                 2
#define NVSP_MIN_PROTOCOL_VERSION               NVSP_PROTOCOL_VERSION_1
#define NVSP_MAX_PROTOCOL_VERSION               NVSP_PROTOCOL_VERSION_1

typedef enum _NVSP_MESSAGE_TYPE
{
    NvspMessageTypeNone = 0,


    /* Init Messages */

    NvspMessageTypeInit                         = 1,
    NvspMessageTypeInitComplete                 = 2,

    NvspVersionMessageStart                     = 100,


    /* Version 1 Messages */

    NvspMessage1TypeSendNdisVersion             = NvspVersionMessageStart,

    NvspMessage1TypeSendReceiveBuffer,
    NvspMessage1TypeSendReceiveBufferComplete,
    NvspMessage1TypeRevokeReceiveBuffer,

    NvspMessage1TypeSendSendBuffer,
    NvspMessage1TypeSendSendBufferComplete,
    NvspMessage1TypeRevokeSendBuffer,

    NvspMessage1TypeSendRNDISPacket,
    NvspMessage1TypeSendRNDISPacketComplete,


    /* This should be set to the number of messages for the version */
    /* with the maximum number of messages. */

    NvspNumMessagePerVersion                    = 9,

} NVSP_MESSAGE_TYPE, *PNVSP_MESSAGE_TYPE;

typedef enum _NVSP_STATUS
{
    NvspStatusNone = 0,
    NvspStatusSuccess,
    NvspStatusFailure,
    NvspStatusProtocolVersionRangeTooNew,
    NvspStatusProtocolVersionRangeTooOld,
    NvspStatusInvalidRndisPacket,
    NvspStatusBusy,
    NvspStatusMax,
} NVSP_STATUS, *PNVSP_STATUS;

#pragma pack(push, 1)

typedef struct _NVSP_MESSAGE_HEADER
{
    u32                                  MessageType;
} NVSP_MESSAGE_HEADER, *PNVSP_MESSAGE_HEADER;


/* Init Messages */



/* This message is used by the VSC to initialize the channel */
/* after the channels has been opened. This message should */
/* never include anything other then versioning (i.e. this */
/* message will be the same for ever). */

typedef struct _NVSP_MESSAGE_INIT
{
    u32                                  MinProtocolVersion;
    u32                                  MaxProtocolVersion;
} NVSP_MESSAGE_INIT, *PNVSP_MESSAGE_INIT;


/* This message is used by the VSP to complete the initialization */
/* of the channel. This message should never include anything other */
/* then versioning (i.e. this message will be the same for ever). */

typedef struct _NVSP_MESSAGE_INIT_COMPLETE
{
    u32                                  NegotiatedProtocolVersion;
    u32                                  MaximumMdlChainLength;
    u32                                  Status;
} NVSP_MESSAGE_INIT_COMPLETE, *PNVSP_MESSAGE_INIT_COMPLETE;

typedef union _NVSP_MESSAGE_INIT_UBER
{
    NVSP_MESSAGE_INIT                       Init;
    NVSP_MESSAGE_INIT_COMPLETE              InitComplete;
} NVSP_MESSAGE_INIT_UBER;


/* Version 1 Messages */



/* This message is used by the VSC to send the NDIS version */
/* to the VSP. The VSP can use this information when handling */
/* OIDs sent by the VSC. */

typedef struct _NVSP_1_MESSAGE_SEND_NDIS_VERSION
{
    u32                                  NdisMajorVersion;
    u32                                  NdisMinorVersion;
} NVSP_1_MESSAGE_SEND_NDIS_VERSION, *PNVSP_1_MESSAGE_SEND_NDIS_VERSION;


/* This message is used by the VSC to send a receive buffer */
/* to the VSP. The VSP can then use the receive buffer to */
/* send data to the VSC. */

typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER
{
    GPADL_HANDLE                            GpadlHandle;
    u16                                  Id;
} NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER;

typedef struct _NVSP_1_RECEIVE_BUFFER_SECTION
{
    u32                                  Offset;
    u32                                  SubAllocationSize;
    u32                                  NumSubAllocations;
    u32                                  EndOffset;
} NVSP_1_RECEIVE_BUFFER_SECTION, *PNVSP_1_RECEIVE_BUFFER_SECTION;


/* This message is used by the VSP to acknowledge a receive */
/* buffer send by the VSC. This message must be sent by the */
/* VSP before the VSP uses the receive buffer. */

typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE
{
    u32                                  Status;
    u32                                  NumSections;


    /* The receive buffer is split into two parts, a large */
    /* suballocation section and a small suballocation */
    /* section. These sections are then suballocated by a */
    /* certain size. */

    /* For example, the following break up of the receive */
    /* buffer has 6 large suballocations and 10 small */
    /* suballocations. */

    /* |            Large Section          |  |   Small Section   | */
    /* ------------------------------------------------------------ */
    /* |     |     |     |     |     |     |  | | | | | | | | | | | */
    /* |                                      | */
    /* LargeOffset                            SmallOffset */

    NVSP_1_RECEIVE_BUFFER_SECTION           Sections[1];

} NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE;


/* This message is sent by the VSC to revoke the receive buffer. */
/* After the VSP completes this transaction, the vsp should never */
/* use the receive buffer again. */

typedef struct _NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER
{
    u16                                  Id;
} NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER;


/* This message is used by the VSC to send a send buffer */
/* to the VSP. The VSC can then use the send buffer to */
/* send data to the VSP. */

typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER
{
    GPADL_HANDLE                            GpadlHandle;
    u16                                  Id;
} NVSP_1_MESSAGE_SEND_SEND_BUFFER, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER;


/* This message is used by the VSP to acknowledge a send */
/* buffer sent by the VSC. This message must be sent by the */
/* VSP before the VSP uses the sent buffer. */

typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE
{
    u32                                  Status;


    /* The VSC gets to choose the size of the send buffer and */
    /* the VSP gets to choose the sections size of the buffer. */
    /* This was done to enable dynamic reconfigurations when */
    /* the cost of GPA-direct buffers decreases. */

    u32                                  SectionSize;
} NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE;


/* This message is sent by the VSC to revoke the send buffer. */
/* After the VSP completes this transaction, the vsp should never */
/* use the send buffer again. */

typedef struct _NVSP_1_MESSAGE_REVOKE_SEND_BUFFER
{
    u16                                  Id;
} NVSP_1_MESSAGE_REVOKE_SEND_BUFFER, *PNVSP_1_MESSAGE_REVOKE_SEND_BUFFER;


/* This message is used by both the VSP and the VSC to send */
/* a RNDIS message to the opposite channel endpoint. */

typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET
{

    /* This field is specified by RNIDS. They assume there's */
    /* two different channels of communication. However, */
    /* the Network VSP only has one. Therefore, the channel */
    /* travels with the RNDIS packet. */

    u32                                  ChannelType;


    /* This field is used to send part or all of the data */
    /* through a send buffer. This values specifies an */
    /* index into the send buffer. If the index is */
    /* 0xFFFFFFFF, then the send buffer is not being used */
    /* and all of the data was sent through other VMBus */
    /* mechanisms. */

    u32                                  SendBufferSectionIndex;
    u32                                  SendBufferSectionSize;
} NVSP_1_MESSAGE_SEND_RNDIS_PACKET, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET;


/* This message is used by both the VSP and the VSC to complete */
/* a RNDIS message to the opposite channel endpoint. At this */
/* point, the initiator of this message cannot use any resources */
/* associated with the original RNDIS packet. */

typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE
{
    u32                                  Status;
} NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE;

typedef union _NVSP_MESSAGE_1_UBER
{
    NVSP_1_MESSAGE_SEND_NDIS_VERSION            SendNdisVersion;

    NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER          SendReceiveBuffer;
    NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE SendReceiveBufferComplete;
    NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER        RevokeReceiveBuffer;

    NVSP_1_MESSAGE_SEND_SEND_BUFFER             SendSendBuffer;
    NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE    SendSendBufferComplete;
    NVSP_1_MESSAGE_REVOKE_SEND_BUFFER           RevokeSendBuffer;

    NVSP_1_MESSAGE_SEND_RNDIS_PACKET            SendRNDISPacket;
    NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE   SendRNDISPacketComplete;
} NVSP_1_MESSAGE_UBER;

typedef union _NVSP_ALL_MESSAGES
{
    NVSP_MESSAGE_INIT_UBER                  InitMessages;
    NVSP_1_MESSAGE_UBER                     Version1Messages;

} NVSP_ALL_MESSAGES;


/* ALL Messages */

typedef struct _NVSP_MESSAGE
{
    NVSP_MESSAGE_HEADER                     Header;
    NVSP_ALL_MESSAGES                       Messages;
} NVSP_MESSAGE, *PNVSP_MESSAGE;

#pragma pack(pop)