]> git.ipfire.org Git - ipfire-2.x.git/blame - src/patches/suse-2.6.27.39/patches.drivers/staging-hv-add-the-hyper-v-api-header-files.patch
Fix oinkmaster patch.
[ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.drivers / staging-hv-add-the-hyper-v-api-header-files.patch
CommitLineData
2cb7cef9
BS
1From 50626ba62379de1e1c92abe1e630138bfd096fd0 Mon Sep 17 00:00:00 2001
2From: Hank Janssen <hjanssen@microsoft.com>
3Date: Mon, 13 Jul 2009 15:15:47 -0700
4Subject: Staging: hv: add the Hyper-V api header files
5
6From: Hank Janssen <hjanssen@microsoft.com>
7
8These are the header files for the API to talk to the Hyper-V
9core.
10
11Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
12Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
13Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
14---
15 drivers/staging/hv/include/ChannelMessages.h | 312 +++++++
16 drivers/staging/hv/include/HvHalApi.h | 32
17 drivers/staging/hv/include/HvHcApi.h | 60 +
18 drivers/staging/hv/include/HvPtApi.h | 86 ++
19 drivers/staging/hv/include/HvStatus.h | 718 ++++++++++++++++++
20 drivers/staging/hv/include/HvSynicApi.h | 490 ++++++++++++
21 drivers/staging/hv/include/HvTypes.h | 31
22 drivers/staging/hv/include/HvVpApi.h | 51 +
23 drivers/staging/hv/include/List.h | 269 ++++++
24 drivers/staging/hv/include/VmbusChannelInterface.h | 131 +++
25 drivers/staging/hv/include/VmbusPacketFormat.h | 322 ++++++++
26 drivers/staging/hv/include/nvspprotocol.h | 306 +++++++
27 drivers/staging/hv/include/rndis.h | 836 +++++++++++++++++++++
28 drivers/staging/hv/include/vstorage.h | 309 +++++++
29 14 files changed, 3953 insertions(+)
30 create mode 100644 drivers/staging/hv/include/ChannelMessages.h
31 create mode 100644 drivers/staging/hv/include/HvHalApi.h
32 create mode 100644 drivers/staging/hv/include/HvHcApi.h
33 create mode 100644 drivers/staging/hv/include/HvPtApi.h
34 create mode 100644 drivers/staging/hv/include/HvStatus.h
35 create mode 100644 drivers/staging/hv/include/HvSynicApi.h
36 create mode 100644 drivers/staging/hv/include/HvTypes.h
37 create mode 100644 drivers/staging/hv/include/HvVpApi.h
38 create mode 100644 drivers/staging/hv/include/List.h
39 create mode 100644 drivers/staging/hv/include/VmbusChannelInterface.h
40 create mode 100644 drivers/staging/hv/include/VmbusPacketFormat.h
41 create mode 100644 drivers/staging/hv/include/nvspprotocol.h
42 create mode 100644 drivers/staging/hv/include/rndis.h
43 create mode 100644 drivers/staging/hv/include/vstorage.h
44
45--- /dev/null
46+++ b/drivers/staging/hv/include/ChannelMessages.h
47@@ -0,0 +1,312 @@
48+/*
49+ *
50+ * Copyright (c) 2009, Microsoft Corporation.
51+ *
52+ * This program is free software; you can redistribute it and/or modify it
53+ * under the terms and conditions of the GNU General Public License,
54+ * version 2, as published by the Free Software Foundation.
55+ *
56+ * This program is distributed in the hope it will be useful, but WITHOUT
57+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
58+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
59+ * more details.
60+ *
61+ * You should have received a copy of the GNU General Public License along with
62+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
63+ * Place - Suite 330, Boston, MA 02111-1307 USA.
64+ *
65+ * Authors:
66+ * Haiyang Zhang <haiyangz@microsoft.com>
67+ * Hank Janssen <hjanssen@microsoft.com>
68+ *
69+ */
70+
71+
72+#pragma once
73+
74+#include <VmbusPacketFormat.h>
75+
76+#define C_ASSERT(x)
77+typedef UINT32 NTSTATUS;
78+
79+#pragma pack(push,1)
80+
81+//
82+// Version 1 messages
83+//
84+
85+typedef enum _VMBUS_CHANNEL_MESSAGE_TYPE
86+{
87+ ChannelMessageInvalid = 0,
88+ ChannelMessageOfferChannel = 1,
89+ ChannelMessageRescindChannelOffer = 2,
90+ ChannelMessageRequestOffers = 3,
91+ ChannelMessageAllOffersDelivered = 4,
92+ ChannelMessageOpenChannel = 5,
93+ ChannelMessageOpenChannelResult = 6,
94+ ChannelMessageCloseChannel = 7,
95+ ChannelMessageGpadlHeader = 8,
96+ ChannelMessageGpadlBody = 9,
97+ ChannelMessageGpadlCreated = 10,
98+ ChannelMessageGpadlTeardown = 11,
99+ ChannelMessageGpadlTorndown = 12,
100+ ChannelMessageRelIdReleased = 13,
101+ ChannelMessageInitiateContact = 14,
102+ ChannelMessageVersionResponse = 15,
103+ ChannelMessageUnload = 16,
104+#ifdef VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD
105+ ChannelMessageViewRangeAdd = 17,
106+ ChannelMessageViewRangeRemove = 18,
107+#endif
108+ ChannelMessageCount
109+} VMBUS_CHANNEL_MESSAGE_TYPE, *PVMBUS_CHANNEL_MESSAGE_TYPE;
110+
111+// begin_wpp config
112+// CUSTOM_TYPE(ChannelMessageType, ItemEnum(_VMBUS_CHANNEL_MESSAGE_TYPE));
113+// end_wpp
114+
115+typedef struct _VMBUS_CHANNEL_MESSAGE_HEADER
116+{
117+ VMBUS_CHANNEL_MESSAGE_TYPE MessageType;
118+ UINT32 Padding;
119+} VMBUS_CHANNEL_MESSAGE_HEADER, *PVMBUS_CHANNEL_MESSAGE_HEADER;
120+
121+// Query VMBus Version parameters
122+typedef struct _VMBUS_CHANNEL_QUERY_VMBUS_VERSION
123+{
124+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
125+ UINT32 Version;
126+} VMBUS_CHANNEL_QUERY_VMBUS_VERSION, *PVMBUS_CHANNEL_QUERY_VMBUS_VERSION;
127+
128+// VMBus Version Supported parameters
129+typedef struct _VMBUS_CHANNEL_VERSION_SUPPORTED
130+{
131+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
132+ BOOLEAN VersionSupported;
133+} VMBUS_CHANNEL_VERSION_SUPPORTED, *PVMBUS_CHANNEL_VERSION_SUPPORTED;
134+
135+// Offer Channel parameters
136+typedef struct _VMBUS_CHANNEL_OFFER_CHANNEL
137+{
138+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
139+ VMBUS_CHANNEL_OFFER Offer;
140+ UINT32 ChildRelId;
141+ UINT8 MonitorId;
142+ BOOLEAN MonitorAllocated;
143+} VMBUS_CHANNEL_OFFER_CHANNEL, *PVMBUS_CHANNEL_OFFER_CHANNEL;
144+
145+//
146+// Make sure VMBUS_CHANNEL_OFFER_CHANNEL fits into Synic message.
147+//
148+C_ASSERT(sizeof(VMBUS_CHANNEL_OFFER_CHANNEL) <= MAXIMUM_SYNIC_MESSAGE_BYTES);
149+
150+// Rescind Offer parameters
151+typedef struct _VMBUS_CHANNEL_RESCIND_OFFER
152+{
153+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
154+ UINT32 ChildRelId;
155+} VMBUS_CHANNEL_RESCIND_OFFER, *PVMBUS_CHANNEL_RESCIND_OFFER;
156+
157+// Request Offer -- no parameters, SynIC message contains the partition ID
158+// Set Snoop -- no parameters, SynIC message contains the partition ID
159+// Clear Snoop -- no parameters, SynIC message contains the partition ID
160+// All Offers Delivered -- no parameters, SynIC message contains the partition ID
161+// Flush Client -- no parameters, SynIC message contains the partition ID
162+
163+// Open Channel parameters
164+typedef struct _VMBUS_CHANNEL_OPEN_CHANNEL
165+{
166+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
167+
168+ //
169+ // Identifies the specific VMBus channel that is being opened.
170+ //
171+ UINT32 ChildRelId;
172+
173+ //
174+ // ID making a particular open request at a channel offer unique.
175+ //
176+ UINT32 OpenId;
177+
178+ //
179+ // GPADL for the channel's ring buffer.
180+ //
181+ GPADL_HANDLE RingBufferGpadlHandle;
182+
183+ //
184+ // GPADL for the channel's server context save area.
185+ //
186+ GPADL_HANDLE ServerContextAreaGpadlHandle;
187+
188+ //
189+ // The upstream ring buffer begins at offset zero in the memory described
190+ // by RingBufferGpadlHandle. The downstream ring buffer follows it at this
191+ // offset (in pages).
192+ //
193+ UINT32 DownstreamRingBufferPageOffset;
194+
195+ //
196+ // User-specific data to be passed along to the server endpoint.
197+ //
198+ UCHAR UserData[MAX_USER_DEFINED_BYTES];
199+
200+} VMBUS_CHANNEL_OPEN_CHANNEL, *PVMBUS_CHANNEL_OPEN_CHANNEL;
201+
202+// Reopen Channel parameters;
203+typedef VMBUS_CHANNEL_OPEN_CHANNEL VMBUS_CHANNEL_REOPEN_CHANNEL, *PVMBUS_CHANNEL_REOPEN_CHANNEL;
204+
205+// Open Channel Result parameters
206+typedef struct _VMBUS_CHANNEL_OPEN_RESULT
207+{
208+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
209+ UINT32 ChildRelId;
210+ UINT32 OpenId;
211+ NTSTATUS Status;
212+} VMBUS_CHANNEL_OPEN_RESULT, *PVMBUS_CHANNEL_OPEN_RESULT;
213+
214+// Close channel parameters;
215+typedef struct _VMBUS_CHANNEL_CLOSE_CHANNEL
216+{
217+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
218+ UINT32 ChildRelId;
219+} VMBUS_CHANNEL_CLOSE_CHANNEL, *PVMBUS_CHANNEL_CLOSE_CHANNEL;
220+
221+// Channel Message GPADL
222+#define GPADL_TYPE_RING_BUFFER 1
223+#define GPADL_TYPE_SERVER_SAVE_AREA 2
224+#define GPADL_TYPE_TRANSACTION 8
225+
226+//
227+// The number of PFNs in a GPADL message is defined by the number of pages
228+// that would be spanned by ByteCount and ByteOffset. If the implied number
229+// of PFNs won't fit in this packet, there will be a follow-up packet that
230+// contains more.
231+//
232+
233+typedef struct _VMBUS_CHANNEL_GPADL_HEADER
234+{
235+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
236+ UINT32 ChildRelId;
237+ UINT32 Gpadl;
238+ UINT16 RangeBufLen;
239+ UINT16 RangeCount;
240+ GPA_RANGE Range[0];
241+} VMBUS_CHANNEL_GPADL_HEADER, *PVMBUS_CHANNEL_GPADL_HEADER;
242+
243+
244+//
245+// This is the followup packet that contains more PFNs.
246+//
247+
248+typedef struct _VMBUS_CHANNEL_GPADL_BODY
249+{
250+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
251+ UINT32 MessageNumber;
252+ UINT32 Gpadl;
253+ UINT64 Pfn[0];
254+} VMBUS_CHANNEL_GPADL_BODY, *PVMBUS_CHANNEL_GPADL_BODY;
255+
256+
257+typedef struct _VMBUS_CHANNEL_GPADL_CREATED
258+{
259+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
260+ UINT32 ChildRelId;
261+ UINT32 Gpadl;
262+ UINT32 CreationStatus;
263+} VMBUS_CHANNEL_GPADL_CREATED, *PVMBUS_CHANNEL_GPADL_CREATED;
264+
265+typedef struct _VMBUS_CHANNEL_GPADL_TEARDOWN
266+{
267+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
268+ UINT32 ChildRelId;
269+ UINT32 Gpadl;
270+} VMBUS_CHANNEL_GPADL_TEARDOWN, *PVMBUS_CHANNEL_GPADL_TEARDOWN;
271+
272+typedef struct _VMBUS_CHANNEL_GPADL_TORNDOWN
273+{
274+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
275+ UINT32 Gpadl;
276+} VMBUS_CHANNEL_GPADL_TORNDOWN, *PVMBUS_CHANNEL_GPADL_TORNDOWN;
277+
278+#ifdef VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD
279+typedef struct _VMBUS_CHANNEL_VIEW_RANGE_ADD
280+{
281+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
282+ PHYSICAL_ADDRESS ViewRangeBase;
283+ UINT64 ViewRangeLength;
284+ UINT32 ChildRelId;
285+} VMBUS_CHANNEL_VIEW_RANGE_ADD, *PVMBUS_CHANNEL_VIEW_RANGE_ADD;
286+
287+typedef struct _VMBUS_CHANNEL_VIEW_RANGE_REMOVE
288+{
289+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
290+ PHYSICAL_ADDRESS ViewRangeBase;
291+ UINT32 ChildRelId;
292+} VMBUS_CHANNEL_VIEW_RANGE_REMOVE, *PVMBUS_CHANNEL_VIEW_RANGE_REMOVE;
293+#endif
294+
295+typedef struct _VMBUS_CHANNEL_RELID_RELEASED
296+{
297+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
298+ UINT32 ChildRelId;
299+} VMBUS_CHANNEL_RELID_RELEASED, *PVMBUS_CHANNEL_RELID_RELEASED;
300+
301+typedef struct _VMBUS_CHANNEL_INITIATE_CONTACT
302+{
303+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
304+ UINT32 VMBusVersionRequested;
305+ UINT32 Padding2;
306+ UINT64 InterruptPage;
307+ UINT64 MonitorPage1;
308+ UINT64 MonitorPage2;
309+} VMBUS_CHANNEL_INITIATE_CONTACT, *PVMBUS_CHANNEL_INITIATE_CONTACT;
310+
311+typedef struct _VMBUS_CHANNEL_VERSION_RESPONSE
312+{
313+ VMBUS_CHANNEL_MESSAGE_HEADER Header;
314+ BOOLEAN VersionSupported;
315+} VMBUS_CHANNEL_VERSION_RESPONSE, *PVMBUS_CHANNEL_VERSION_RESPONSE;
316+
317+typedef VMBUS_CHANNEL_MESSAGE_HEADER VMBUS_CHANNEL_UNLOAD, *PVMBUS_CHANNEL_UNLOAD;
318+
319+//
320+// Kind of a table to use the preprocessor to get us the right type for a
321+// specified message ID. Used with ChAllocateSendMessage()
322+//
323+#define ChannelMessageQueryVmbusVersion_TYPE VMBUS_CHANNEL_MESSAGE_HEADER
324+#define ChannelMessageVmbusVersionSupported_TYPE VMBUS_CHANNEL_VERSION_SUPPORTED
325+#define ChannelMessageOfferChannel_TYPE VMBUS_CHANNEL_OFFER_CHANNEL
326+#define ChannelMessageRescindChannelOffer_TYPE VMBUS_CHANNEL_RESCIND_OFFER
327+#define ChannelMessageRequestOffers_TYPE VMBUS_CHANNEL_MESSAGE_HEADER
328+#define ChannelMessageAllOffersDelivered_TYPE VMBUS_CHANNEL_MESSAGE_HEADER
329+#define ChannelMessageOpenChannel_TYPE VMBUS_CHANNEL_OPEN_CHANNEL
330+#define ChannelMessageOpenChannelResult_TYPE VMBUS_CHANNEL_OPEN_RESULT
331+#define ChannelMessageCloseChannel_TYPE VMBUS_CHANNEL_CLOSE_CHANNEL
332+#define ChannelMessageAllGpadlsUnmapped_TYPE VMBUS_CHANNEL_CLOSE_CHANNEL
333+#define ChannelMessageGpadlHeader_TYPE VMBUS_CHANNEL_GPADL_HEADER
334+#define ChannelMessageGpadlBody_TYPE VMBUS_CHANNEL_GPADL_BODY
335+#define ChannelMessageGpadlCreated_TYPE VMBUS_CHANNEL_GPADL_CREATED
336+#define ChannelMessageGpadlTeardown_TYPE VMBUS_CHANNEL_GPADL_TEARDOWN
337+#define ChannelMessageGpadlTorndown_TYPE VMBUS_CHANNEL_GPADL_TORNDOWN
338+#define ChannelMessageViewRangeAdd_TYPE VMBUS_CHANNEL_VIEW_RANGE_ADD
339+#define ChannelMessageViewRangeRemove_TYPE VMBUS_CHANNEL_VIEW_RANGE_REMOVE
340+#define ChannelMessageRelIdReleased_TYPE VMBUS_CHANNEL_RELID_RELEASED
341+#define ChannelMessageInitiateContact_TYPE VMBUS_CHANNEL_INITIATE_CONTACT
342+#define ChannelMessageVersionResponse_TYPE VMBUS_CHANNEL_VERSION_RESPONSE
343+#define ChannelMessageUnload_TYPE VMBUS_CHANNEL_UNLOAD
344+
345+//
346+// Preprocessor wrapper to ChAllocateSendMessageSize() converting the return
347+// value to the correct pointer and calculate the needed size.
348+//
349+// Argument:
350+//
351+// Id - the numberic ID (type VMBUS_CHANNEL_MESSAGE_TYPE) of the message to
352+// send.
353+//
354+#define ChAllocateSendMessage(Id, Fn, Context) \
355+ (Id##_TYPE*)ChAllocateSendMessageSized(sizeof(Id##_TYPE), Id, Fn, Context)
356+
357+
358+#pragma pack(pop)
359+
360--- /dev/null
361+++ b/drivers/staging/hv/include/HvHalApi.h
362@@ -0,0 +1,32 @@
363+/*
364+ *
365+ * Copyright (c) 2009, Microsoft Corporation.
366+ *
367+ * This program is free software; you can redistribute it and/or modify it
368+ * under the terms and conditions of the GNU General Public License,
369+ * version 2, as published by the Free Software Foundation.
370+ *
371+ * This program is distributed in the hope it will be useful, but WITHOUT
372+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
373+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
374+ * more details.
375+ *
376+ * You should have received a copy of the GNU General Public License along with
377+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
378+ * Place - Suite 330, Boston, MA 02111-1307 USA.
379+ *
380+ * Authors:
381+ * Haiyang Zhang <haiyangz@microsoft.com>
382+ * Hank Janssen <hjanssen@microsoft.com>
383+ *
384+ */
385+
386+
387+#pragma once
388+
389+
390+//
391+// Time in the hypervisor is measured in 100 nanosecond units
392+//
393+typedef UINT64 HV_NANO100_TIME, *PHV_NANO100_TIME;
394+typedef UINT64 HV_NANO100_DURATION, *PHV_NANO100_DURATION;
395--- /dev/null
396+++ b/drivers/staging/hv/include/HvHcApi.h
397@@ -0,0 +1,60 @@
398+/*
399+ *
400+ * Copyright (c) 2009, Microsoft Corporation.
401+ *
402+ * This program is free software; you can redistribute it and/or modify it
403+ * under the terms and conditions of the GNU General Public License,
404+ * version 2, as published by the Free Software Foundation.
405+ *
406+ * This program is distributed in the hope it will be useful, but WITHOUT
407+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
408+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
409+ * more details.
410+ *
411+ * You should have received a copy of the GNU General Public License along with
412+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
413+ * Place - Suite 330, Boston, MA 02111-1307 USA.
414+ *
415+ * Authors:
416+ * Haiyang Zhang <haiyangz@microsoft.com>
417+ * Hank Janssen <hjanssen@microsoft.com>
418+ *
419+ */
420+
421+
422+#pragma once
423+
424+//
425+// Declare the various hypercall operations.
426+//
427+typedef enum _HV_CALL_CODE
428+{
429+
430+ HvCallPostMessage = 0x005c,
431+ HvCallSignalEvent = 0x005d,
432+
433+} HV_CALL_CODE, *PHV_CALL_CODE;
434+//
435+// Definition of the HvPostMessage hypercall input structure.
436+//
437+
438+typedef struct _HV_INPUT_POST_MESSAGE
439+{
440+ HV_CONNECTION_ID ConnectionId;
441+ UINT32 Reserved;
442+ HV_MESSAGE_TYPE MessageType;
443+ UINT32 PayloadSize;
444+ UINT64 Payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT];
445+} HV_INPUT_POST_MESSAGE, *PHV_INPUT_POST_MESSAGE;
446+
447+
448+//
449+// Definition of the HvSignalEvent hypercall input structure.
450+//
451+
452+typedef struct _HV_INPUT_SIGNAL_EVENT
453+{
454+ HV_CONNECTION_ID ConnectionId;
455+ UINT16 FlagNumber;
456+ UINT16 RsvdZ;
457+} HV_INPUT_SIGNAL_EVENT, *PHV_INPUT_SIGNAL_EVENT;
458--- /dev/null
459+++ b/drivers/staging/hv/include/HvPtApi.h
460@@ -0,0 +1,86 @@
461+/*
462+ *
463+ * Copyright (c) 2009, Microsoft Corporation.
464+ *
465+ * This program is free software; you can redistribute it and/or modify it
466+ * under the terms and conditions of the GNU General Public License,
467+ * version 2, as published by the Free Software Foundation.
468+ *
469+ * This program is distributed in the hope it will be useful, but WITHOUT
470+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
471+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
472+ * more details.
473+ *
474+ * You should have received a copy of the GNU General Public License along with
475+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
476+ * Place - Suite 330, Boston, MA 02111-1307 USA.
477+ *
478+ * Authors:
479+ * Haiyang Zhang <haiyangz@microsoft.com>
480+ * Hank Janssen <hjanssen@microsoft.com>
481+ *
482+ */
483+
484+
485+#pragma once
486+
487+//
488+// Versioning definitions used for guests reporting themselves to the
489+// hypervisor, and visa versa.
490+// ==================================================================
491+//
492+
493+//
494+// Version info reported by guest OS's
495+//
496+typedef enum _HV_GUEST_OS_VENDOR
497+{
498+ HvGuestOsVendorMicrosoft = 0x0001
499+
500+} HV_GUEST_OS_VENDOR, *PHV_GUEST_OS_VENDOR;
501+
502+typedef enum _HV_GUEST_OS_MICROSOFT_IDS
503+{
504+ HvGuestOsMicrosoftUndefined = 0x00,
505+ HvGuestOsMicrosoftMSDOS = 0x01,
506+ HvGuestOsMicrosoftWindows3x = 0x02,
507+ HvGuestOsMicrosoftWindows9x = 0x03,
508+ HvGuestOsMicrosoftWindowsNT = 0x04,
509+ HvGuestOsMicrosoftWindowsCE = 0x05
510+
511+} HV_GUEST_OS_MICROSOFT_IDS, *PHV_GUEST_OS_MICROSOFT_IDS;
512+
513+//
514+// Declare the MSR used to identify the guest OS.
515+//
516+#define HV_X64_MSR_GUEST_OS_ID 0x40000000
517+
518+typedef union _HV_X64_MSR_GUEST_OS_ID_CONTENTS
519+{
520+ UINT64 AsUINT64;
521+ struct
522+ {
523+ UINT64 BuildNumber : 16;
524+ UINT64 ServiceVersion : 8; // Service Pack, etc.
525+ UINT64 MinorVersion : 8;
526+ UINT64 MajorVersion : 8;
527+ UINT64 OsId : 8; // HV_GUEST_OS_MICROSOFT_IDS (If Vendor=MS)
528+ UINT64 VendorId : 16; // HV_GUEST_OS_VENDOR
529+ };
530+} HV_X64_MSR_GUEST_OS_ID_CONTENTS, *PHV_X64_MSR_GUEST_OS_ID_CONTENTS;
531+
532+//
533+// Declare the MSR used to setup pages used to communicate with the hypervisor.
534+//
535+#define HV_X64_MSR_HYPERCALL 0x40000001
536+
537+typedef union _HV_X64_MSR_HYPERCALL_CONTENTS
538+{
539+ UINT64 AsUINT64;
540+ struct
541+ {
542+ UINT64 Enable : 1;
543+ UINT64 Reserved : 11;
544+ UINT64 GuestPhysicalAddress : 52;
545+ };
546+} HV_X64_MSR_HYPERCALL_CONTENTS, *PHV_X64_MSR_HYPERCALL_CONTENTS;
547--- /dev/null
548+++ b/drivers/staging/hv/include/HvStatus.h
549@@ -0,0 +1,718 @@
550+/*
551+ *
552+ * Copyright (c) 2009, Microsoft Corporation.
553+ *
554+ * This program is free software; you can redistribute it and/or modify it
555+ * under the terms and conditions of the GNU General Public License,
556+ * version 2, as published by the Free Software Foundation.
557+ *
558+ * This program is distributed in the hope it will be useful, but WITHOUT
559+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
560+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
561+ * more details.
562+ *
563+ * You should have received a copy of the GNU General Public License along with
564+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
565+ * Place - Suite 330, Boston, MA 02111-1307 USA.
566+ *
567+ * Authors:
568+ * Haiyang Zhang <haiyangz@microsoft.com>
569+ * Hank Janssen <hjanssen@microsoft.com>
570+ *
571+ */
572+
573+
574+// begin_hvgdk
575+//
576+// Status codes for hypervisor operations.
577+//
578+typedef UINT16 HV_STATUS, *PHV_STATUS;
579+
580+//
581+// MessageId: HV_STATUS_SUCCESS
582+//
583+// MessageText:
584+//
585+// The specified hypercall succeeded
586+//
587+#define HV_STATUS_SUCCESS ((HV_STATUS)0x0000)
588+
589+//
590+// MessageId: HV_STATUS_INVALID_HYPERCALL_CODE
591+//
592+// MessageText:
593+//
594+// The hypervisor does not support the operation because the specified hypercall code is not supported.
595+//
596+#define HV_STATUS_INVALID_HYPERCALL_CODE ((HV_STATUS)0x0002)
597+
598+//
599+// MessageId: HV_STATUS_INVALID_HYPERCALL_INPUT
600+//
601+// MessageText:
602+//
603+// The hypervisor does not support the operation because the encoding for the hypercall input register is not supported.
604+//
605+#define HV_STATUS_INVALID_HYPERCALL_INPUT ((HV_STATUS)0x0003)
606+
607+//
608+// MessageId: HV_STATUS_INVALID_ALIGNMENT
609+//
610+// MessageText:
611+//
612+// The hypervisor could not perform the operation beacuse a parameter has an invalid alignment.
613+//
614+#define HV_STATUS_INVALID_ALIGNMENT ((HV_STATUS)0x0004)
615+
616+//
617+// MessageId: HV_STATUS_INVALID_PARAMETER
618+//
619+// MessageText:
620+//
621+// The hypervisor could not perform the operation beacuse an invalid parameter was specified.
622+//
623+#define HV_STATUS_INVALID_PARAMETER ((HV_STATUS)0x0005)
624+
625+//
626+// MessageId: HV_STATUS_ACCESS_DENIED
627+//
628+// MessageText:
629+//
630+// Access to the specified object was denied.
631+//
632+#define HV_STATUS_ACCESS_DENIED ((HV_STATUS)0x0006)
633+
634+//
635+// MessageId: HV_STATUS_INVALID_PARTITION_STATE
636+//
637+// MessageText:
638+//
639+// The hypervisor could not perform the operation because the partition is entering or in an invalid state.
640+//
641+#define HV_STATUS_INVALID_PARTITION_STATE ((HV_STATUS)0x0007)
642+
643+//
644+// MessageId: HV_STATUS_OPERATION_DENIED
645+//
646+// MessageText:
647+//
648+// The operation is not allowed in the current state.
649+//
650+#define HV_STATUS_OPERATION_DENIED ((HV_STATUS)0x0008)
651+
652+//
653+// MessageId: HV_STATUS_UNKNOWN_PROPERTY
654+//
655+// MessageText:
656+//
657+// The hypervisor does not recognize the specified partition property.
658+//
659+#define HV_STATUS_UNKNOWN_PROPERTY ((HV_STATUS)0x0009)
660+
661+//
662+// MessageId: HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE
663+//
664+// MessageText:
665+//
666+// The specified value of a partition property is out of range or violates an invariant.
667+//
668+#define HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE ((HV_STATUS)0x000A)
669+
670+//
671+// MessageId: HV_STATUS_INSUFFICIENT_MEMORY
672+//
673+// MessageText:
674+//
675+// There is not enough memory in the hypervisor pool to complete the operation.
676+//
677+#define HV_STATUS_INSUFFICIENT_MEMORY ((HV_STATUS)0x000B)
678+
679+//
680+// MessageId: HV_STATUS_PARTITION_TOO_DEEP
681+//
682+// MessageText:
683+//
684+// The maximum partition depth has been exceeded for the partition hierarchy.
685+//
686+#define HV_STATUS_PARTITION_TOO_DEEP ((HV_STATUS)0x000C)
687+
688+//
689+// MessageId: HV_STATUS_INVALID_PARTITION_ID
690+//
691+// MessageText:
692+//
693+// A partition with the specified partition Id does not exist.
694+//
695+#define HV_STATUS_INVALID_PARTITION_ID ((HV_STATUS)0x000D)
696+
697+//
698+// MessageId: HV_STATUS_INVALID_VP_INDEX
699+//
700+// MessageText:
701+//
702+// The hypervisor could not perform the operation because the specified VP index is invalid.
703+//
704+#define HV_STATUS_INVALID_VP_INDEX ((HV_STATUS)0x000E)
705+
706+//
707+// MessageId: HV_STATUS_NOT_FOUND
708+//
709+// MessageText:
710+//
711+// The iteration is complete; no addition items in the iteration could be found.
712+//
713+#define HV_STATUS_NOT_FOUND ((HV_STATUS)0x0010)
714+
715+//
716+// MessageId: HV_STATUS_INVALID_PORT_ID
717+//
718+// MessageText:
719+//
720+// The hypervisor could not perform the operation because the specified port identifier is invalid.
721+//
722+#define HV_STATUS_INVALID_PORT_ID ((HV_STATUS)0x0011)
723+
724+//
725+// MessageId: HV_STATUS_INVALID_CONNECTION_ID
726+//
727+// MessageText:
728+//
729+// The hypervisor could not perform the operation because the specified connection identifier is invalid.
730+//
731+#define HV_STATUS_INVALID_CONNECTION_ID ((HV_STATUS)0x0012)
732+
733+//
734+// MessageId: HV_STATUS_INSUFFICIENT_BUFFERS
735+//
736+// MessageText:
737+//
738+// You did not supply enough message buffers to send a message.
739+//
740+#define HV_STATUS_INSUFFICIENT_BUFFERS ((HV_STATUS)0x0013)
741+
742+//
743+// MessageId: HV_STATUS_NOT_ACKNOWLEDGED
744+//
745+// MessageText:
746+//
747+// The previous virtual interrupt has not been acknowledged.
748+//
749+#define HV_STATUS_NOT_ACKNOWLEDGED ((HV_STATUS)0x0014)
750+
751+//
752+// MessageId: HV_STATUS_INVALID_VP_STATE
753+//
754+// MessageText:
755+//
756+// A virtual processor is not in the correct state for the performance of the indicated operation.
757+//
758+#define HV_STATUS_INVALID_VP_STATE ((HV_STATUS)0x0015)
759+
760+//
761+// MessageId: HV_STATUS_ACKNOWLEDGED
762+//
763+// MessageText:
764+//
765+// The previous virtual interrupt has already been acknowledged.
766+//
767+#define HV_STATUS_ACKNOWLEDGED ((HV_STATUS)0x0016)
768+
769+//
770+// MessageId: HV_STATUS_INVALID_SAVE_RESTORE_STATE
771+//
772+// MessageText:
773+//
774+// The indicated partition is not in a valid state for saving or restoring.
775+//
776+#define HV_STATUS_INVALID_SAVE_RESTORE_STATE ((HV_STATUS)0x0017)
777+
778+//
779+// MessageId: HV_STATUS_INVALID_SYNIC_STATE
780+//
781+// MessageText:
782+//
783+// The hypervisor could not complete the operation because a required feature of the synthetic interrupt controller (SynIC) was disabled.
784+//
785+#define HV_STATUS_INVALID_SYNIC_STATE ((HV_STATUS)0x0018)
786+
787+//
788+// MessageId: HV_STATUS_OBJECT_IN_USE
789+//
790+// MessageText:
791+//
792+// The hypervisor could not perform the operation because the object or value was either already in use or being used for a purpose that would not permit completing the operation.
793+//
794+#define HV_STATUS_OBJECT_IN_USE ((HV_STATUS)0x0019)
795+
796+//
797+// MessageId: HV_STATUS_INVALID_PROXIMITY_DOMAIN_INFO
798+//
799+// MessageText:
800+//
801+// The proximity domain information is invalid.
802+//
803+#define HV_STATUS_INVALID_PROXIMITY_DOMAIN_INFO ((HV_STATUS)0x001A)
804+
805+//
806+// MessageId: HV_STATUS_NO_DATA
807+//
808+// MessageText:
809+//
810+// An attempt to retrieve debugging data failed because none was available.
811+//
812+#define HV_STATUS_NO_DATA ((HV_STATUS)0x001B)
813+
814+//
815+// MessageId: HV_STATUS_INACTIVE
816+//
817+// MessageText:
818+//
819+// The physical connection being used for debuggging has not recorded any receive activity since the last operation.
820+//
821+#define HV_STATUS_INACTIVE ((HV_STATUS)0x001C)
822+
823+//
824+// MessageId: HV_STATUS_NO_RESOURCES
825+//
826+// MessageText:
827+//
828+// There are not enough resources to complete the operation.
829+//
830+#define HV_STATUS_NO_RESOURCES ((HV_STATUS)0x001D)
831+
832+//
833+// MessageId: HV_STATUS_FEATURE_UNAVAILABLE
834+//
835+// MessageText:
836+//
837+// A hypervisor feature is not available to the user.
838+//
839+#define HV_STATUS_FEATURE_UNAVAILABLE ((HV_STATUS)0x001E)
840+
841+// end_hvgdk
842+
843+//
844+// MessageId: HV_STATUS_UNSUCCESSFUL
845+//
846+// MessageText:
847+//
848+// {Operation Failed}
849+// The requested operation was unsuccessful.
850+//
851+#define HV_STATUS_UNSUCCESSFUL ((HV_STATUS)0x1001)
852+
853+//
854+// MessageId: HV_STATUS_INSUFFICIENT_BUFFER
855+//
856+// MessageText:
857+//
858+// The specified buffer was too small to contain all of the requested data.
859+//
860+#define HV_STATUS_INSUFFICIENT_BUFFER ((HV_STATUS)0x1002)
861+
862+//
863+// MessageId: HV_STATUS_GPA_NOT_PRESENT
864+//
865+// MessageText:
866+//
867+// The guest physical address is not currently associated with a system physical address.
868+//
869+#define HV_STATUS_GPA_NOT_PRESENT ((HV_STATUS)0x1003)
870+
871+//
872+// MessageId: HV_STATUS_GUEST_PAGE_FAULT
873+//
874+// MessageText:
875+//
876+// The operation would have resulted in a page fault in the guest.
877+//
878+#define HV_STATUS_GUEST_PAGE_FAULT ((HV_STATUS)0x1004)
879+
880+//
881+// MessageId: HV_STATUS_RUNDOWN_DISABLED
882+//
883+// MessageText:
884+//
885+// The operation cannot proceed as the rundown object was marked disabled.
886+//
887+#define HV_STATUS_RUNDOWN_DISABLED ((HV_STATUS)0x1005)
888+
889+//
890+// MessageId: HV_STATUS_KEY_ALREADY_EXISTS
891+//
892+// MessageText:
893+//
894+// The entry cannot be added as another entry with the same key already exists.
895+//
896+#define HV_STATUS_KEY_ALREADY_EXISTS ((HV_STATUS)0x1006)
897+
898+//
899+// MessageId: HV_STATUS_GPA_INTERCEPT
900+//
901+// MessageText:
902+//
903+// The operation resulted an intercept on a region of guest physical memory.
904+//
905+#define HV_STATUS_GPA_INTERCEPT ((HV_STATUS)0x1007)
906+
907+//
908+// MessageId: HV_STATUS_GUEST_GENERAL_PROTECTION_FAULT
909+//
910+// MessageText:
911+//
912+// The operation would have resulted in a general protection fault in the guest.
913+//
914+#define HV_STATUS_GUEST_GENERAL_PROTECTION_FAULT ((HV_STATUS)0x1008)
915+
916+//
917+// MessageId: HV_STATUS_GUEST_STACK_FAULT
918+//
919+// MessageText:
920+//
921+// The operation would have resulted in a stack fault in the guest.
922+//
923+#define HV_STATUS_GUEST_STACK_FAULT ((HV_STATUS)0x1009)
924+
925+//
926+// MessageId: HV_STATUS_GUEST_INVALID_OPCODE_FAULT
927+//
928+// MessageText:
929+//
930+// The operation would have resulted in an invalid opcode fault in the guest.
931+//
932+#define HV_STATUS_GUEST_INVALID_OPCODE_FAULT ((HV_STATUS)0x100A)
933+
934+//
935+// MessageId: HV_STATUS_FINALIZE_INCOMPLETE
936+//
937+// MessageText:
938+//
939+// The partition is not completely finalized.
940+//
941+#define HV_STATUS_FINALIZE_INCOMPLETE ((HV_STATUS)0x100B)
942+
943+//
944+// MessageId: HV_STATUS_GUEST_MACHINE_CHECK_ABORT
945+//
946+// MessageText:
947+//
948+// The operation would have resulted in an machine check abort in the guest.
949+//
950+#define HV_STATUS_GUEST_MACHINE_CHECK_ABORT ((HV_STATUS)0x100C)
951+
952+//
953+// MessageId: HV_STATUS_ILLEGAL_OVERLAY_ACCESS
954+//
955+// MessageText:
956+//
957+// An illegal access was attempted to an overlay page.
958+//
959+#define HV_STATUS_ILLEGAL_OVERLAY_ACCESS ((HV_STATUS)0x100D)
960+
961+//
962+// MessageId: HV_STATUS_INSUFFICIENT_SYSTEM_VA
963+//
964+// MessageText:
965+//
966+// There is not enough system VA space available to satisfy the request,
967+//
968+#define HV_STATUS_INSUFFICIENT_SYSTEM_VA ((HV_STATUS)0x100E)
969+
970+//
971+// MessageId: HV_STATUS_VIRTUAL_ADDRESS_NOT_MAPPED
972+//
973+// MessageText:
974+//
975+// The passed virtual address was not mapped in the hypervisor address space.
976+//
977+#define HV_STATUS_VIRTUAL_ADDRESS_NOT_MAPPED ((HV_STATUS)0x100F)
978+
979+//
980+// MessageId: HV_STATUS_NOT_IMPLEMENTED
981+//
982+// MessageText:
983+//
984+// The requested operation is not implemented in this version of the hypervisor.
985+//
986+#define HV_STATUS_NOT_IMPLEMENTED ((HV_STATUS)0x1010)
987+
988+//
989+// MessageId: HV_STATUS_VMX_INSTRUCTION_FAILED
990+//
991+// MessageText:
992+//
993+// The requested VMX instruction failed to complete succesfully.
994+//
995+#define HV_STATUS_VMX_INSTRUCTION_FAILED ((HV_STATUS)0x1011)
996+
997+//
998+// MessageId: HV_STATUS_VMX_INSTRUCTION_FAILED_WITH_STATUS
999+//
1000+// MessageText:
1001+//
1002+// The requested VMX instruction failed to complete succesfully indicating status.
1003+//
1004+#define HV_STATUS_VMX_INSTRUCTION_FAILED_WITH_STATUS ((HV_STATUS)0x1012)
1005+
1006+//
1007+// MessageId: HV_STATUS_MSR_ACCESS_FAILED
1008+//
1009+// MessageText:
1010+//
1011+// The requested access to the model specific register failed.
1012+//
1013+#define HV_STATUS_MSR_ACCESS_FAILED ((HV_STATUS)0x1013)
1014+
1015+//
1016+// MessageId: HV_STATUS_CR_ACCESS_FAILED
1017+//
1018+// MessageText:
1019+//
1020+// The requested access to the control register failed.
1021+//
1022+#define HV_STATUS_CR_ACCESS_FAILED ((HV_STATUS)0x1014)
1023+
1024+//
1025+// MessageId: HV_STATUS_TIMEOUT
1026+//
1027+// MessageText:
1028+//
1029+// The specified timeout expired before the operation completed.
1030+//
1031+#define HV_STATUS_TIMEOUT ((HV_STATUS)0x1016)
1032+
1033+//
1034+// MessageId: HV_STATUS_MSR_INTERCEPT
1035+//
1036+// MessageText:
1037+//
1038+// The requested access to the model specific register generated an intercept.
1039+//
1040+#define HV_STATUS_MSR_INTERCEPT ((HV_STATUS)0x1017)
1041+
1042+//
1043+// MessageId: HV_STATUS_CPUID_INTERCEPT
1044+//
1045+// MessageText:
1046+//
1047+// The CPUID instruction generated an intercept.
1048+//
1049+#define HV_STATUS_CPUID_INTERCEPT ((HV_STATUS)0x1018)
1050+
1051+//
1052+// MessageId: HV_STATUS_REPEAT_INSTRUCTION
1053+//
1054+// MessageText:
1055+//
1056+// The current instruction should be repeated and the instruction pointer not advanced.
1057+//
1058+#define HV_STATUS_REPEAT_INSTRUCTION ((HV_STATUS)0x1019)
1059+
1060+//
1061+// MessageId: HV_STATUS_PAGE_PROTECTION_VIOLATION
1062+//
1063+// MessageText:
1064+//
1065+// The current instruction should be repeated and the instruction pointer not advanced.
1066+//
1067+#define HV_STATUS_PAGE_PROTECTION_VIOLATION ((HV_STATUS)0x101A)
1068+
1069+//
1070+// MessageId: HV_STATUS_PAGE_TABLE_INVALID
1071+//
1072+// MessageText:
1073+//
1074+// The current instruction should be repeated and the instruction pointer not advanced.
1075+//
1076+#define HV_STATUS_PAGE_TABLE_INVALID ((HV_STATUS)0x101B)
1077+
1078+//
1079+// MessageId: HV_STATUS_PAGE_NOT_PRESENT
1080+//
1081+// MessageText:
1082+//
1083+// The current instruction should be repeated and the instruction pointer not advanced.
1084+//
1085+#define HV_STATUS_PAGE_NOT_PRESENT ((HV_STATUS)0x101C)
1086+
1087+//
1088+// MessageId: HV_STATUS_IO_INTERCEPT
1089+//
1090+// MessageText:
1091+//
1092+// The requested access to the I/O port generated an intercept.
1093+//
1094+#define HV_STATUS_IO_INTERCEPT ((HV_STATUS)0x101D)
1095+
1096+//
1097+// MessageId: HV_STATUS_NOTHING_TO_DO
1098+//
1099+// MessageText:
1100+//
1101+// There is nothing to do.
1102+//
1103+#define HV_STATUS_NOTHING_TO_DO ((HV_STATUS)0x101E)
1104+
1105+//
1106+// MessageId: HV_STATUS_THREAD_TERMINATING
1107+//
1108+// MessageText:
1109+//
1110+// The requested thread is terminating.
1111+//
1112+#define HV_STATUS_THREAD_TERMINATING ((HV_STATUS)0x101F)
1113+
1114+//
1115+// MessageId: HV_STATUS_SECTION_ALREADY_CONSTRUCTED
1116+//
1117+// MessageText:
1118+//
1119+// The specified section was already constructed.
1120+//
1121+#define HV_STATUS_SECTION_ALREADY_CONSTRUCTED ((HV_STATUS)0x1020)
1122+
1123+//
1124+// MessageId: HV_STATUS_SECTION_NOT_ALREADY_CONSTRUCTED
1125+//
1126+// MessageText:
1127+//
1128+// The specified section was not already constructed.
1129+//
1130+#define HV_STATUS_SECTION_NOT_ALREADY_CONSTRUCTED ((HV_STATUS)0x1021)
1131+
1132+//
1133+// MessageId: HV_STATUS_PAGE_ALREADY_COMMITTED
1134+//
1135+// MessageText:
1136+//
1137+// The specified virtual address was already backed by physical memory.
1138+//
1139+#define HV_STATUS_PAGE_ALREADY_COMMITTED ((HV_STATUS)0x1022)
1140+
1141+//
1142+// MessageId: HV_STATUS_PAGE_NOT_ALREADY_COMMITTED
1143+//
1144+// MessageText:
1145+//
1146+// The specified virtual address was not already backed by physical memory.
1147+//
1148+#define HV_STATUS_PAGE_NOT_ALREADY_COMMITTED ((HV_STATUS)0x1023)
1149+
1150+//
1151+// MessageId: HV_STATUS_COMMITTED_PAGES_REMAIN
1152+//
1153+// MessageText:
1154+//
1155+// Committed pages remain in the section.
1156+//
1157+#define HV_STATUS_COMMITTED_PAGES_REMAIN ((HV_STATUS)0x1024)
1158+
1159+//
1160+// MessageId: HV_STATUS_NO_REMAINING_COMMITTED_PAGES
1161+//
1162+// MessageText:
1163+//
1164+// No additional committed pages beyond the specified page exist in the section.
1165+//
1166+#define HV_STATUS_NO_REMAINING_COMMITTED_PAGES ((HV_STATUS)0x1025)
1167+
1168+//
1169+// MessageId: HV_STATUS_INSUFFICIENT_COMPARTMENT_VA
1170+//
1171+// MessageText:
1172+//
1173+// The VA space of the compartment is exhausted.
1174+//
1175+#define HV_STATUS_INSUFFICIENT_COMPARTMENT_VA ((HV_STATUS)0x1026)
1176+
1177+//
1178+// MessageId: HV_STATUS_DEREF_SPA_LIST_FULL
1179+//
1180+// MessageText:
1181+//
1182+// The SPA dereference list is full, and there are additional entries
1183+// to be added to it.
1184+//
1185+#define HV_STATUS_DEREF_SPA_LIST_FULL ((HV_STATUS)0x1027)
1186+
1187+//
1188+// MessageId: HV_STATUS_GPA_OUT_OF_RANGE
1189+//
1190+// MessageText:
1191+//
1192+// The supplied GPA is out of range.
1193+//
1194+#define HV_STATUS_GPA_OUT_OF_RANGE ((HV_STATUS)0x1027)
1195+
1196+//
1197+// MessageId: HV_STATUS_NONVOLATILE_XMM_STALE
1198+//
1199+// MessageText:
1200+//
1201+// The XMM register that was being accessed is stale.
1202+//
1203+#define HV_STATUS_NONVOLATILE_XMM_STALE ((HV_STATUS)0x1028)
1204+
1205+//
1206+// MessageId: HV_STATUS_UNSUPPORTED_PROCESSOR
1207+//
1208+// MessageText:
1209+//
1210+// The hypervisor does not support the processors in this system.
1211+//
1212+#define HV_STATUS_UNSUPPORTED_PROCESSOR ((HV_STATUS)0x1029)
1213+
1214+//
1215+// MessageId: HV_STATUS_INSUFFICIENT_CROM_SPACE
1216+//
1217+// MessageText:
1218+//
1219+// Insufficient space existed for copying over the CROM contents.
1220+//
1221+#define HV_STATUS_INSUFFICIENT_CROM_SPACE ((HV_STATUS)0x2000)
1222+
1223+//
1224+// MessageId: HV_STATUS_BAD_CROM_FORMAT
1225+//
1226+// MessageText:
1227+//
1228+// The contents of the CROM failed validation attempts.
1229+//
1230+#define HV_STATUS_BAD_CROM_FORMAT ((HV_STATUS)0x2001)
1231+
1232+//
1233+// MessageId: HV_STATUS_UNSUPPORTED_CROM_FORMAT
1234+//
1235+// MessageText:
1236+//
1237+// The contents of the CROM contain contents the parser doesn't support.
1238+//
1239+#define HV_STATUS_UNSUPPORTED_CROM_FORMAT ((HV_STATUS)0x2002)
1240+
1241+//
1242+// MessageId: HV_STATUS_UNSUPPORTED_CONTROLLER
1243+//
1244+// MessageText:
1245+//
1246+// The register format of the OHCI controller specified for debugging is not supported.
1247+//
1248+#define HV_STATUS_UNSUPPORTED_CONTROLLER ((HV_STATUS)0x2003)
1249+
1250+//
1251+// MessageId: HV_STATUS_CROM_TOO_LARGE
1252+//
1253+// MessageText:
1254+//
1255+// The CROM contents were to large to copy over.
1256+//
1257+#define HV_STATUS_CROM_TOO_LARGE ((HV_STATUS)0x2004)
1258+
1259+//
1260+// MessageId: HV_STATUS_CONTROLLER_IN_USE
1261+//
1262+// MessageText:
1263+//
1264+// The OHCI controller specified for debugging cannot be used as it is already in use.
1265+//
1266+#define HV_STATUS_CONTROLLER_IN_USE ((HV_STATUS)0x2005)
1267+
1268--- /dev/null
1269+++ b/drivers/staging/hv/include/HvSynicApi.h
1270@@ -0,0 +1,490 @@
1271+/*
1272+ *
1273+ * Copyright (c) 2009, Microsoft Corporation.
1274+ *
1275+ * This program is free software; you can redistribute it and/or modify it
1276+ * under the terms and conditions of the GNU General Public License,
1277+ * version 2, as published by the Free Software Foundation.
1278+ *
1279+ * This program is distributed in the hope it will be useful, but WITHOUT
1280+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1281+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
1282+ * more details.
1283+ *
1284+ * You should have received a copy of the GNU General Public License along with
1285+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
1286+ * Place - Suite 330, Boston, MA 02111-1307 USA.
1287+ *
1288+ * Authors:
1289+ * Haiyang Zhang <haiyangz@microsoft.com>
1290+ * Hank Janssen <hjanssen@microsoft.com>
1291+ *
1292+ */
1293+
1294+#pragma once
1295+
1296+//
1297+// Define the virtual APIC registers
1298+//
1299+#define HV_X64_MSR_EOI (0x40000070)
1300+#define HV_X64_MSR_ICR (0x40000071)
1301+#define HV_X64_MSR_TPR (0x40000072)
1302+#define HV_X64_MSR_APIC_ASSIST_PAGE (0x40000073)
1303+
1304+//
1305+// Define version of the synthetic interrupt controller.
1306+//
1307+
1308+#define HV_SYNIC_VERSION (1)
1309+
1310+
1311+//
1312+// Define synthetic interrupt controller model specific registers.
1313+//
1314+
1315+#define HV_X64_MSR_SCONTROL (0x40000080)
1316+#define HV_X64_MSR_SVERSION (0x40000081)
1317+#define HV_X64_MSR_SIEFP (0x40000082)
1318+#define HV_X64_MSR_SIMP (0x40000083)
1319+#define HV_X64_MSR_EOM (0x40000084)
1320+#define HV_X64_MSR_SINT0 (0x40000090)
1321+#define HV_X64_MSR_SINT1 (0x40000091)
1322+#define HV_X64_MSR_SINT2 (0x40000092)
1323+#define HV_X64_MSR_SINT3 (0x40000093)
1324+#define HV_X64_MSR_SINT4 (0x40000094)
1325+#define HV_X64_MSR_SINT5 (0x40000095)
1326+#define HV_X64_MSR_SINT6 (0x40000096)
1327+#define HV_X64_MSR_SINT7 (0x40000097)
1328+#define HV_X64_MSR_SINT8 (0x40000098)
1329+#define HV_X64_MSR_SINT9 (0x40000099)
1330+#define HV_X64_MSR_SINT10 (0x4000009A)
1331+#define HV_X64_MSR_SINT11 (0x4000009B)
1332+#define HV_X64_MSR_SINT12 (0x4000009C)
1333+#define HV_X64_MSR_SINT13 (0x4000009D)
1334+#define HV_X64_MSR_SINT14 (0x4000009E)
1335+#define HV_X64_MSR_SINT15 (0x4000009F)
1336+
1337+//
1338+// Define the expected SynIC version.
1339+//
1340+#define HV_SYNIC_VERSION_1 (0x1)
1341+
1342+//
1343+// Define synthetic interrupt controller message constants.
1344+//
1345+
1346+#define HV_MESSAGE_SIZE (256)
1347+#define HV_MESSAGE_PAYLOAD_BYTE_COUNT (240)
1348+#define HV_MESSAGE_PAYLOAD_QWORD_COUNT (30)
1349+#define HV_ANY_VP (0xFFFFFFFF)
1350+
1351+//
1352+// Define synthetic interrupt controller flag constants.
1353+//
1354+
1355+#define HV_EVENT_FLAGS_COUNT (256 * 8)
1356+#define HV_EVENT_FLAGS_BYTE_COUNT (256)
1357+#define HV_EVENT_FLAGS_DWORD_COUNT (256 / sizeof(UINT32))
1358+
1359+//
1360+// Define hypervisor message types.
1361+//
1362+typedef enum _HV_MESSAGE_TYPE
1363+{
1364+ HvMessageTypeNone = 0x00000000,
1365+
1366+ //
1367+ // Memory access messages.
1368+ //
1369+ HvMessageTypeUnmappedGpa = 0x80000000,
1370+ HvMessageTypeGpaIntercept = 0x80000001,
1371+
1372+ //
1373+ // Timer notification messages.
1374+ //
1375+ HvMessageTimerExpired = 0x80000010,
1376+
1377+ //
1378+ // Error messages.
1379+ //
1380+ HvMessageTypeInvalidVpRegisterValue = 0x80000020,
1381+ HvMessageTypeUnrecoverableException = 0x80000021,
1382+ HvMessageTypeUnsupportedFeature = 0x80000022,
1383+
1384+ //
1385+ // Trace buffer complete messages.
1386+ //
1387+ HvMessageTypeEventLogBufferComplete = 0x80000040,
1388+
1389+ //
1390+ // Platform-specific processor intercept messages.
1391+ //
1392+ HvMessageTypeX64IoPortIntercept = 0x80010000,
1393+ HvMessageTypeX64MsrIntercept = 0x80010001,
1394+ HvMessageTypeX64CpuidIntercept = 0x80010002,
1395+ HvMessageTypeX64ExceptionIntercept = 0x80010003,
1396+ HvMessageTypeX64ApicEoi = 0x80010004,
1397+ HvMessageTypeX64LegacyFpError = 0x80010005
1398+
1399+} HV_MESSAGE_TYPE, *PHV_MESSAGE_TYPE;
1400+
1401+//
1402+// Define the number of synthetic interrupt sources.
1403+//
1404+
1405+#define HV_SYNIC_SINT_COUNT (16)
1406+#define HV_SYNIC_STIMER_COUNT (4)
1407+
1408+//
1409+// Define the synthetic interrupt source index type.
1410+//
1411+
1412+typedef UINT32 HV_SYNIC_SINT_INDEX, *PHV_SYNIC_SINT_INDEX;
1413+
1414+//
1415+// Define partition identifier type.
1416+//
1417+
1418+typedef UINT64 HV_PARTITION_ID, *PHV_PARTITION_ID;
1419+
1420+//
1421+// Define invalid partition identifier.
1422+//
1423+#define HV_PARTITION_ID_INVALID ((HV_PARTITION_ID) 0x0)
1424+
1425+//
1426+// Define connection identifier type.
1427+//
1428+
1429+typedef union _HV_CONNECTION_ID
1430+{
1431+ UINT32 AsUINT32;
1432+
1433+ struct
1434+ {
1435+ UINT32 Id:24;
1436+ UINT32 Reserved:8;
1437+ } u;
1438+
1439+} HV_CONNECTION_ID, *PHV_CONNECTION_ID;
1440+
1441+//
1442+// Define port identifier type.
1443+//
1444+
1445+typedef union _HV_PORT_ID
1446+{
1447+ UINT32 AsUINT32;
1448+
1449+ struct
1450+ {
1451+ UINT32 Id:24;
1452+ UINT32 Reserved:8;
1453+ } u ;
1454+
1455+} HV_PORT_ID, *PHV_PORT_ID;
1456+
1457+//
1458+// Define port type.
1459+//
1460+
1461+typedef enum _HV_PORT_TYPE
1462+{
1463+ HvPortTypeMessage = 1,
1464+ HvPortTypeEvent = 2,
1465+ HvPortTypeMonitor = 3
1466+} HV_PORT_TYPE, *PHV_PORT_TYPE;
1467+
1468+//
1469+// Define port information structure.
1470+//
1471+
1472+typedef struct _HV_PORT_INFO
1473+{
1474+ HV_PORT_TYPE PortType;
1475+ UINT32 Padding;
1476+
1477+ union
1478+ {
1479+ struct
1480+ {
1481+ HV_SYNIC_SINT_INDEX TargetSint;
1482+ HV_VP_INDEX TargetVp;
1483+ UINT64 RsvdZ;
1484+ } MessagePortInfo;
1485+
1486+ struct
1487+ {
1488+ HV_SYNIC_SINT_INDEX TargetSint;
1489+ HV_VP_INDEX TargetVp;
1490+ UINT16 BaseFlagNumber;
1491+ UINT16 FlagCount;
1492+ UINT32 RsvdZ;
1493+ } EventPortInfo;
1494+
1495+ struct
1496+ {
1497+ HV_GPA MonitorAddress;
1498+ UINT64 RsvdZ;
1499+ } MonitorPortInfo;
1500+ };
1501+} HV_PORT_INFO, *PHV_PORT_INFO;
1502+
1503+typedef const HV_PORT_INFO *PCHV_PORT_INFO;
1504+
1505+typedef struct _HV_CONNECTION_INFO
1506+{
1507+ HV_PORT_TYPE PortType;
1508+ UINT32 Padding;
1509+
1510+ union
1511+ {
1512+ struct
1513+ {
1514+ UINT64 RsvdZ;
1515+ } MessageConnectionInfo;
1516+
1517+ struct
1518+ {
1519+ UINT64 RsvdZ;
1520+ } EventConnectionInfo;
1521+
1522+ struct
1523+ {
1524+ HV_GPA MonitorAddress;
1525+ } MonitorConnectionInfo;
1526+ };
1527+} HV_CONNECTION_INFO, *PHV_CONNECTION_INFO;
1528+
1529+typedef const HV_CONNECTION_INFO *PCHV_CONNECTION_INFO;
1530+
1531+//
1532+// Define synthetic interrupt controller message flags.
1533+//
1534+
1535+typedef union _HV_MESSAGE_FLAGS
1536+{
1537+ UINT8 AsUINT8;
1538+ struct
1539+ {
1540+ UINT8 MessagePending:1;
1541+ UINT8 Reserved:7;
1542+ };
1543+} HV_MESSAGE_FLAGS, *PHV_MESSAGE_FLAGS;
1544+
1545+
1546+//
1547+// Define synthetic interrupt controller message header.
1548+//
1549+
1550+typedef struct _HV_MESSAGE_HEADER
1551+{
1552+ HV_MESSAGE_TYPE MessageType;
1553+ UINT8 PayloadSize;
1554+ HV_MESSAGE_FLAGS MessageFlags;
1555+ UINT8 Reserved[2];
1556+ union
1557+ {
1558+ HV_PARTITION_ID Sender;
1559+ HV_PORT_ID Port;
1560+ };
1561+
1562+} HV_MESSAGE_HEADER, *PHV_MESSAGE_HEADER;
1563+
1564+//
1565+// Define timer message payload structure.
1566+//
1567+typedef struct _HV_TIMER_MESSAGE_PAYLOAD
1568+{
1569+ UINT32 TimerIndex;
1570+ UINT32 Reserved;
1571+ HV_NANO100_TIME ExpirationTime; // When the timer expired
1572+ HV_NANO100_TIME DeliveryTime; // When the message was delivered
1573+} HV_TIMER_MESSAGE_PAYLOAD, *PHV_TIMER_MESSAGE_PAYLOAD;
1574+
1575+//
1576+// Define synthetic interrupt controller message format.
1577+//
1578+
1579+typedef struct _HV_MESSAGE
1580+{
1581+ HV_MESSAGE_HEADER Header;
1582+ union
1583+ {
1584+ UINT64 Payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT];
1585+ } u ;
1586+} HV_MESSAGE, *PHV_MESSAGE;
1587+
1588+//
1589+// Define the number of message buffers associated with each port.
1590+//
1591+
1592+#define HV_PORT_MESSAGE_BUFFER_COUNT (16)
1593+
1594+//
1595+// Define the synthetic interrupt message page layout.
1596+//
1597+
1598+typedef struct _HV_MESSAGE_PAGE
1599+{
1600+ volatile HV_MESSAGE SintMessage[HV_SYNIC_SINT_COUNT];
1601+} HV_MESSAGE_PAGE, *PHV_MESSAGE_PAGE;
1602+
1603+
1604+//
1605+// Define the synthetic interrupt controller event flags format.
1606+//
1607+
1608+typedef union _HV_SYNIC_EVENT_FLAGS
1609+{
1610+ UINT8 Flags8[HV_EVENT_FLAGS_BYTE_COUNT];
1611+ UINT32 Flags32[HV_EVENT_FLAGS_DWORD_COUNT];
1612+} HV_SYNIC_EVENT_FLAGS, *PHV_SYNIC_EVENT_FLAGS;
1613+
1614+
1615+//
1616+// Define the synthetic interrupt flags page layout.
1617+//
1618+
1619+typedef struct _HV_SYNIC_EVENT_FLAGS_PAGE
1620+{
1621+ volatile HV_SYNIC_EVENT_FLAGS SintEventFlags[HV_SYNIC_SINT_COUNT];
1622+} HV_SYNIC_EVENT_FLAGS_PAGE, *PHV_SYNIC_EVENT_FLAGS_PAGE;
1623+
1624+
1625+//
1626+// Define SynIC control register.
1627+//
1628+typedef union _HV_SYNIC_SCONTROL
1629+{
1630+ UINT64 AsUINT64;
1631+ struct
1632+ {
1633+ UINT64 Enable:1;
1634+ UINT64 Reserved:63;
1635+ };
1636+} HV_SYNIC_SCONTROL, *PHV_SYNIC_SCONTROL;
1637+
1638+//
1639+// Define synthetic interrupt source.
1640+//
1641+
1642+typedef union _HV_SYNIC_SINT
1643+{
1644+ UINT64 AsUINT64;
1645+ struct
1646+ {
1647+ UINT64 Vector :8;
1648+ UINT64 Reserved1 :8;
1649+ UINT64 Masked :1;
1650+ UINT64 AutoEoi :1;
1651+ UINT64 Reserved2 :46;
1652+ };
1653+} HV_SYNIC_SINT, *PHV_SYNIC_SINT;
1654+
1655+//
1656+// Define the format of the SIMP register
1657+//
1658+
1659+typedef union _HV_SYNIC_SIMP
1660+{
1661+ UINT64 AsUINT64;
1662+ struct
1663+ {
1664+ UINT64 SimpEnabled : 1;
1665+ UINT64 Preserved : 11;
1666+ UINT64 BaseSimpGpa : 52;
1667+ };
1668+} HV_SYNIC_SIMP, *PHV_SYNIC_SIMP;
1669+
1670+//
1671+// Define the format of the SIEFP register
1672+//
1673+
1674+typedef union _HV_SYNIC_SIEFP
1675+{
1676+ UINT64 AsUINT64;
1677+ struct
1678+ {
1679+ UINT64 SiefpEnabled : 1;
1680+ UINT64 Preserved : 11;
1681+ UINT64 BaseSiefpGpa : 52;
1682+ };
1683+} HV_SYNIC_SIEFP, *PHV_SYNIC_SIEFP;
1684+
1685+//
1686+// Definitions for the monitored notification facility
1687+//
1688+
1689+typedef union _HV_MONITOR_TRIGGER_GROUP
1690+{
1691+ UINT64 AsUINT64;
1692+
1693+ struct
1694+ {
1695+ UINT32 Pending;
1696+ UINT32 Armed;
1697+ };
1698+
1699+} HV_MONITOR_TRIGGER_GROUP, *PHV_MONITOR_TRIGGER_GROUP;
1700+
1701+typedef struct _HV_MONITOR_PARAMETER
1702+{
1703+ HV_CONNECTION_ID ConnectionId;
1704+ UINT16 FlagNumber;
1705+ UINT16 RsvdZ;
1706+} HV_MONITOR_PARAMETER, *PHV_MONITOR_PARAMETER;
1707+
1708+typedef union _HV_MONITOR_TRIGGER_STATE
1709+{
1710+ UINT32 AsUINT32;
1711+
1712+ struct
1713+ {
1714+ UINT32 GroupEnable : 4;
1715+ UINT32 RsvdZ : 28;
1716+ };
1717+
1718+} HV_MONITOR_TRIGGER_STATE, *PHV_MONITOR_TRIGGER_STATE;
1719+
1720+//
1721+// HV_MONITOR_PAGE Layout
1722+// ------------------------------------------------------
1723+// | 0 | TriggerState (4 bytes) | Rsvd1 (4 bytes) |
1724+// | 8 | TriggerGroup[0] |
1725+// | 10 | TriggerGroup[1] |
1726+// | 18 | TriggerGroup[2] |
1727+// | 20 | TriggerGroup[3] |
1728+// | 28 | Rsvd2[0] |
1729+// | 30 | Rsvd2[1] |
1730+// | 38 | Rsvd2[2] |
1731+// | 40 | NextCheckTime[0][0] | NextCheckTime[0][1] |
1732+// | ... |
1733+// | 240 | Latency[0][0..3] |
1734+// | 340 | Rsvz3[0] |
1735+// | 440 | Parameter[0][0] |
1736+// | 448 | Parameter[0][1] |
1737+// | ... |
1738+// | 840 | Rsvd4[0] |
1739+// ------------------------------------------------------
1740+
1741+typedef struct _HV_MONITOR_PAGE
1742+{
1743+ HV_MONITOR_TRIGGER_STATE TriggerState;
1744+ UINT32 RsvdZ1;
1745+
1746+ HV_MONITOR_TRIGGER_GROUP TriggerGroup[4];
1747+ UINT64 RsvdZ2[3];
1748+
1749+ INT32 NextCheckTime[4][32];
1750+
1751+ UINT16 Latency[4][32];
1752+ UINT64 RsvdZ3[32];
1753+
1754+ HV_MONITOR_PARAMETER Parameter[4][32];
1755+
1756+ UINT8 RsvdZ4[1984];
1757+
1758+} HV_MONITOR_PAGE, *PHV_MONITOR_PAGE;
1759+
1760+typedef volatile HV_MONITOR_PAGE* PVHV_MONITOR_PAGE;
1761--- /dev/null
1762+++ b/drivers/staging/hv/include/HvTypes.h
1763@@ -0,0 +1,31 @@
1764+/*
1765+ *
1766+ * Copyright (c) 2009, Microsoft Corporation.
1767+ *
1768+ * This program is free software; you can redistribute it and/or modify it
1769+ * under the terms and conditions of the GNU General Public License,
1770+ * version 2, as published by the Free Software Foundation.
1771+ *
1772+ * This program is distributed in the hope it will be useful, but WITHOUT
1773+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1774+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
1775+ * more details.
1776+ *
1777+ * You should have received a copy of the GNU General Public License along with
1778+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
1779+ * Place - Suite 330, Boston, MA 02111-1307 USA.
1780+ *
1781+ * Authors:
1782+ * Haiyang Zhang <haiyangz@microsoft.com>
1783+ * Hank Janssen <hjanssen@microsoft.com>
1784+ *
1785+ */
1786+
1787+
1788+#pragma once
1789+
1790+typedef UINT64 HV_GPA, *PHV_GPA;
1791+
1792+#define HV_X64_PAGE_SIZE (4096)
1793+#define HV_PAGE_SIZE HV_X64_PAGE_SIZE
1794+
1795--- /dev/null
1796+++ b/drivers/staging/hv/include/HvVpApi.h
1797@@ -0,0 +1,51 @@
1798+/*
1799+ *
1800+ * Copyright (c) 2009, Microsoft Corporation.
1801+ *
1802+ * This program is free software; you can redistribute it and/or modify it
1803+ * under the terms and conditions of the GNU General Public License,
1804+ * version 2, as published by the Free Software Foundation.
1805+ *
1806+ * This program is distributed in the hope it will be useful, but WITHOUT
1807+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1808+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
1809+ * more details.
1810+ *
1811+ * You should have received a copy of the GNU General Public License along with
1812+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
1813+ * Place - Suite 330, Boston, MA 02111-1307 USA.
1814+ *
1815+ * Authors:
1816+ * Haiyang Zhang <haiyangz@microsoft.com>
1817+ * Hank Janssen <hjanssen@microsoft.com>
1818+ *
1819+ */
1820+
1821+
1822+#pragma once
1823+//
1824+// Virtual Processor Indices
1825+//
1826+typedef UINT32 HV_VP_INDEX, *PHV_VP_INDEX;
1827+
1828+//
1829+// The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent
1830+// is set by CPUID(HvCpuIdFunctionVersionAndFeatures).
1831+// ==========================================================================
1832+//
1833+
1834+typedef enum _HV_CPUID_FUNCTION
1835+{
1836+ HvCpuIdFunctionVersionAndFeatures = 0x00000001,
1837+ HvCpuIdFunctionHvVendorAndMaxFunction = 0x40000000,
1838+ HvCpuIdFunctionHvInterface = 0x40000001,
1839+
1840+ //
1841+ // The remaining functions depend on the value of HvCpuIdFunctionInterface
1842+ //
1843+ HvCpuIdFunctionMsHvVersion = 0x40000002,
1844+ HvCpuIdFunctionMsHvFeatures = 0x40000003,
1845+ HvCpuIdFunctionMsHvEnlightenmentInformation = 0x40000004,
1846+ HvCpuIdFunctionMsHvImplementationLimits = 0x40000005
1847+
1848+} HV_CPUID_FUNCTION, *PHV_CPUID_FUNCTION;
1849--- /dev/null
1850+++ b/drivers/staging/hv/include/List.h
1851@@ -0,0 +1,269 @@
1852+/*
1853+ *
1854+ * Copyright (c) 2009, Microsoft Corporation.
1855+ *
1856+ * This program is free software; you can redistribute it and/or modify it
1857+ * under the terms and conditions of the GNU General Public License,
1858+ * version 2, as published by the Free Software Foundation.
1859+ *
1860+ * This program is distributed in the hope it will be useful, but WITHOUT
1861+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1862+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
1863+ * more details.
1864+ *
1865+ * You should have received a copy of the GNU General Public License along with
1866+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
1867+ * Place - Suite 330, Boston, MA 02111-1307 USA.
1868+ *
1869+ * Authors:
1870+ * Haiyang Zhang <haiyangz@microsoft.com>
1871+ * Hank Janssen <hjanssen@microsoft.com>
1872+ *
1873+ */
1874+
1875+
1876+#ifndef _LIST_H_
1877+#define _LIST_H_
1878+
1879+#include "osd.h"
1880+/*
1881+ *
1882+ * Doubly-linked list manipulation routines. Implemented as macros
1883+ * but logically these are procedures.
1884+ *
1885+ */
1886+
1887+typedef DLIST_ENTRY LIST_ENTRY;
1888+typedef DLIST_ENTRY *PLIST_ENTRY;
1889+
1890+//typedef struct LIST_ENTRY {
1891+// struct LIST_ENTRY * volatile Flink;
1892+// struct LIST_ENTRY * volatile Blink;
1893+//} LIST_ENTRY, *PLIST_ENTRY;
1894+
1895+
1896+
1897+/*
1898+ * VOID
1899+ * InitializeListHead(
1900+ * PLIST_ENTRY ListHead
1901+ * );
1902+ */
1903+#define INITIALIZE_LIST_HEAD InitializeListHead
1904+
1905+#define InitializeListHead(ListHead) (\
1906+ (ListHead)->Flink = (ListHead)->Blink = (ListHead))
1907+
1908+
1909+/*
1910+ * BOOLEAN
1911+ * IsListEmpty(
1912+ * PLIST_ENTRY ListHead
1913+ * );
1914+ */
1915+#define IS_LIST_EMPTY IsListEmpty
1916+
1917+#define IsListEmpty(ListHead) \
1918+ ((ListHead)->Flink == (ListHead))
1919+
1920+
1921+/*
1922+ * PLIST_ENTRY
1923+ * NextListEntry(
1924+ * PLIST_ENTRY Entry
1925+ * );
1926+ */
1927+#define NEXT_LIST_ENTRY NextListEntry
1928+
1929+#define NextListEntry(Entry) \
1930+ (Entry)->Flink
1931+
1932+
1933+/*
1934+ * PLIST_ENTRY
1935+ * PrevListEntry(
1936+ * PLIST_ENTRY Entry
1937+ * );
1938+ */
1939+#define PREV_LIST_ENTRY PrevListEntry
1940+
1941+#define PrevListEntry(Entry) \
1942+ (Entry)->Blink
1943+
1944+
1945+/*
1946+ * PLIST_ENTRY
1947+ * TopListEntry(
1948+ * PLIST_ENTRY ListHead
1949+ * );
1950+ */
1951+#define TOP_LIST_ENTRY TopListEntry
1952+
1953+#define TopListEntry(ListHead) \
1954+ (ListHead)->Flink
1955+
1956+
1957+
1958+/*
1959+ * PLIST_ENTRY
1960+ * RemoveHeadList(
1961+ * PLIST_ENTRY ListHead
1962+ * );
1963+ */
1964+
1965+#define REMOVE_HEAD_LIST RemoveHeadList
1966+
1967+#define RemoveHeadList(ListHead) \
1968+ (ListHead)->Flink;\
1969+ {RemoveEntryList((ListHead)->Flink)}
1970+
1971+
1972+/*
1973+ * PLIST_ENTRY
1974+ * RemoveTailList(
1975+ * PLIST_ENTRY ListHead
1976+ * );
1977+ */
1978+#define REMOVE_TAIL_LIST RemoveTailList
1979+
1980+#define RemoveTailList(ListHead) \
1981+ (ListHead)->Blink;\
1982+ {RemoveEntryList((ListHead)->Blink)}
1983+
1984+
1985+/*
1986+ * VOID
1987+ * RemoveEntryList(
1988+ * PLIST_ENTRY Entry
1989+ * );
1990+ */
1991+#define REMOVE_ENTRY_LIST RemoveEntryList
1992+
1993+#define RemoveEntryList(Entry) {\
1994+ PLIST_ENTRY _EX_Flink = (Entry)->Flink;\
1995+ PLIST_ENTRY _EX_Blink = (Entry)->Blink;\
1996+ _EX_Blink->Flink = _EX_Flink;\
1997+ _EX_Flink->Blink = _EX_Blink;\
1998+ }
1999+
2000+
2001+/*
2002+ * VOID
2003+ * AttachList(
2004+ * PLIST_ENTRY ListHead,
2005+ * PLIST_ENTRY ListEntry
2006+ * );
2007+ */
2008+#define ATTACH_LIST AttachList
2009+
2010+#define AttachList(ListHead,ListEntry) {\
2011+ PLIST_ENTRY _EX_ListHead = (ListHead);\
2012+ PLIST_ENTRY _EX_Blink = (ListHead)->Blink;\
2013+ (ListEntry)->Blink->Flink = _EX_ListHead;\
2014+ _EX_Blink->Flink = (ListEntry);\
2015+ _EX_ListHead->Blink = (ListEntry)->Blink;\
2016+ (ListEntry)->Blink = _EX_Blink;\
2017+ }
2018+
2019+
2020+
2021+/*
2022+ * VOID
2023+ * InsertTailList(
2024+ * PLIST_ENTRY ListHead,
2025+ * PLIST_ENTRY Entry
2026+ * );
2027+ */
2028+
2029+#define INSERT_TAIL_LIST InsertTailList
2030+
2031+#define InsertTailList(ListHead,Entry) {\
2032+ PLIST_ENTRY _EX_ListHead = (ListHead);\
2033+ PLIST_ENTRY _EX_Blink = (ListHead)->Blink;\
2034+ (Entry)->Flink = _EX_ListHead;\
2035+ (Entry)->Blink = _EX_Blink;\
2036+ _EX_Blink->Flink = (Entry);\
2037+ _EX_ListHead->Blink = (Entry);\
2038+ }
2039+
2040+
2041+/*
2042+ * VOID
2043+ * InsertHeadList(
2044+ * PLIST_ENTRY ListHead,
2045+ * PLIST_ENTRY Entry
2046+ * );
2047+ */
2048+#define INSERT_HEAD_LIST InsertHeadList
2049+
2050+#define InsertHeadList(ListHead,Entry) {\
2051+ PLIST_ENTRY _EX_ListHead = (ListHead);\
2052+ PLIST_ENTRY _EX_Flink = (ListHead)->Flink;\
2053+ (Entry)->Flink = _EX_Flink;\
2054+ (Entry)->Blink = _EX_ListHead;\
2055+ _EX_Flink->Blink = (Entry);\
2056+ _EX_ListHead->Flink = (Entry);\
2057+ }
2058+
2059+
2060+/*
2061+ * VOID
2062+ * IterateListEntries(
2063+ * PLIST_ENTRY anchor,
2064+ * PLIST_ENTRY index,
2065+ * PLIST_ENTRY listp
2066+ * );
2067+ */
2068+
2069+#define ITERATE_LIST_ENTRIES IterateListEntries
2070+
2071+#define IterateListEntries(anchor, index, listp) \
2072+ (anchor) = (LIST_ENTRY *)(listp); \
2073+ for((index) = (anchor)->Flink; (index) != (anchor); (index) = (index)->Flink)
2074+
2075+
2076+
2077+/*
2078+ * PSINGLE_LIST_ENTRY
2079+ * PopEntryList(
2080+ * PSINGLE_LIST_ENTRY ListHead
2081+ * );
2082+ */
2083+
2084+#define POP_ENTRY_LIST PopEntryList
2085+
2086+#define PopEntryList(ListHead) \
2087+ (ListHead)->Next;\
2088+ {\
2089+ PSINGLE_LIST_ENTRY FirstEntry;\
2090+ FirstEntry = (ListHead)->Next;\
2091+ if (FirstEntry != NULL) { \
2092+ (ListHead)->Next = FirstEntry->Next;\
2093+ } \
2094+ }
2095+
2096+
2097+
2098+/*
2099+ * VOID
2100+ * PushEntryList(
2101+ * PSINGLE_LIST_ENTRY ListHead,
2102+ * PSINGLE_LIST_ENTRY Entry
2103+ * );
2104+ */
2105+
2106+#define PUSH_ENTRY_LIST PushEntryList
2107+
2108+#define PushEntryList(ListHead,Entry) \
2109+ (Entry)->Next = (ListHead)->Next; \
2110+ (ListHead)->Next = (Entry)
2111+
2112+#ifndef CONTAINING_RECORD
2113+#define CONTAINING_RECORD(address, type, field) ((type *)( \
2114+ (PCHAR)(address) - \
2115+ (PCHAR)(&((type *)0)->field)))
2116+#endif /* CONTAINING_RECORD */
2117+
2118+#endif /* _LIST_H_ */
2119+
2120+/* EOF */
2121--- /dev/null
2122+++ b/drivers/staging/hv/include/nvspprotocol.h
2123@@ -0,0 +1,306 @@
2124+/*
2125+ *
2126+ * Copyright (c) 2009, Microsoft Corporation.
2127+ *
2128+ * This program is free software; you can redistribute it and/or modify it
2129+ * under the terms and conditions of the GNU General Public License,
2130+ * version 2, as published by the Free Software Foundation.
2131+ *
2132+ * This program is distributed in the hope it will be useful, but WITHOUT
2133+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2134+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
2135+ * more details.
2136+ *
2137+ * You should have received a copy of the GNU General Public License along with
2138+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
2139+ * Place - Suite 330, Boston, MA 02111-1307 USA.
2140+ *
2141+ * Authors:
2142+ * Haiyang Zhang <haiyangz@microsoft.com>
2143+ * Hank Janssen <hjanssen@microsoft.com>
2144+ *
2145+ */
2146+
2147+
2148+#pragma once
2149+
2150+#include <VmbusChannelInterface.h>
2151+
2152+#define NVSP_INVALID_PROTOCOL_VERSION ((UINT32)0xFFFFFFFF)
2153+
2154+#define NVSP_PROTOCOL_VERSION_1 2
2155+#define NVSP_MIN_PROTOCOL_VERSION NVSP_PROTOCOL_VERSION_1
2156+#define NVSP_MAX_PROTOCOL_VERSION NVSP_PROTOCOL_VERSION_1
2157+
2158+typedef enum _NVSP_MESSAGE_TYPE
2159+{
2160+ NvspMessageTypeNone = 0,
2161+
2162+ //
2163+ // Init Messages
2164+ //
2165+ NvspMessageTypeInit = 1,
2166+ NvspMessageTypeInitComplete = 2,
2167+
2168+ NvspVersionMessageStart = 100,
2169+
2170+ //
2171+ // Version 1 Messages
2172+ //
2173+ NvspMessage1TypeSendNdisVersion = NvspVersionMessageStart,
2174+
2175+ NvspMessage1TypeSendReceiveBuffer,
2176+ NvspMessage1TypeSendReceiveBufferComplete,
2177+ NvspMessage1TypeRevokeReceiveBuffer,
2178+
2179+ NvspMessage1TypeSendSendBuffer,
2180+ NvspMessage1TypeSendSendBufferComplete,
2181+ NvspMessage1TypeRevokeSendBuffer,
2182+
2183+ NvspMessage1TypeSendRNDISPacket,
2184+ NvspMessage1TypeSendRNDISPacketComplete,
2185+
2186+ //
2187+ // This should be set to the number of messages for the version
2188+ // with the maximum number of messages.
2189+ //
2190+ NvspNumMessagePerVersion = 9,
2191+
2192+} NVSP_MESSAGE_TYPE, *PNVSP_MESSAGE_TYPE;
2193+
2194+typedef enum _NVSP_STATUS
2195+{
2196+ NvspStatusNone = 0,
2197+ NvspStatusSuccess,
2198+ NvspStatusFailure,
2199+ NvspStatusProtocolVersionRangeTooNew,
2200+ NvspStatusProtocolVersionRangeTooOld,
2201+ NvspStatusInvalidRndisPacket,
2202+ NvspStatusBusy,
2203+ NvspStatusMax,
2204+} NVSP_STATUS, *PNVSP_STATUS;
2205+
2206+#pragma pack(push, 1)
2207+
2208+typedef struct _NVSP_MESSAGE_HEADER
2209+{
2210+ UINT32 MessageType;
2211+} NVSP_MESSAGE_HEADER, *PNVSP_MESSAGE_HEADER;
2212+
2213+//
2214+// Init Messages
2215+//
2216+
2217+//
2218+// This message is used by the VSC to initialize the channel
2219+// after the channels has been opened. This message should
2220+// never include anything other then versioning (i.e. this
2221+// message will be the same for ever).
2222+//
2223+typedef struct _NVSP_MESSAGE_INIT
2224+{
2225+ UINT32 MinProtocolVersion;
2226+ UINT32 MaxProtocolVersion;
2227+} NVSP_MESSAGE_INIT, *PNVSP_MESSAGE_INIT;
2228+
2229+//
2230+// This message is used by the VSP to complete the initialization
2231+// of the channel. This message should never include anything other
2232+// then versioning (i.e. this message will be the same for ever).
2233+//
2234+typedef struct _NVSP_MESSAGE_INIT_COMPLETE
2235+{
2236+ UINT32 NegotiatedProtocolVersion;
2237+ UINT32 MaximumMdlChainLength;
2238+ UINT32 Status;
2239+} NVSP_MESSAGE_INIT_COMPLETE, *PNVSP_MESSAGE_INIT_COMPLETE;
2240+
2241+typedef union _NVSP_MESSAGE_INIT_UBER
2242+{
2243+ NVSP_MESSAGE_INIT Init;
2244+ NVSP_MESSAGE_INIT_COMPLETE InitComplete;
2245+} NVSP_MESSAGE_INIT_UBER;
2246+
2247+//
2248+// Version 1 Messages
2249+//
2250+
2251+//
2252+// This message is used by the VSC to send the NDIS version
2253+// to the VSP. The VSP can use this information when handling
2254+// OIDs sent by the VSC.
2255+//
2256+typedef struct _NVSP_1_MESSAGE_SEND_NDIS_VERSION
2257+{
2258+ UINT32 NdisMajorVersion;
2259+ UINT32 NdisMinorVersion;
2260+} NVSP_1_MESSAGE_SEND_NDIS_VERSION, *PNVSP_1_MESSAGE_SEND_NDIS_VERSION;
2261+
2262+//
2263+// This message is used by the VSC to send a receive buffer
2264+// to the VSP. The VSP can then use the receive buffer to
2265+// send data to the VSC.
2266+//
2267+typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER
2268+{
2269+ GPADL_HANDLE GpadlHandle;
2270+ UINT16 Id;
2271+} NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER;
2272+
2273+typedef struct _NVSP_1_RECEIVE_BUFFER_SECTION
2274+{
2275+ UINT32 Offset;
2276+ UINT32 SubAllocationSize;
2277+ UINT32 NumSubAllocations;
2278+ UINT32 EndOffset;
2279+} NVSP_1_RECEIVE_BUFFER_SECTION, *PNVSP_1_RECEIVE_BUFFER_SECTION;
2280+
2281+//
2282+// This message is used by the VSP to acknowledge a receive
2283+// buffer send by the VSC. This message must be sent by the
2284+// VSP before the VSP uses the receive buffer.
2285+//
2286+typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE
2287+{
2288+ UINT32 Status;
2289+ UINT32 NumSections;
2290+
2291+ //
2292+ // The receive buffer is split into two parts, a large
2293+ // suballocation section and a small suballocation
2294+ // section. These sections are then suballocated by a
2295+ // certain size.
2296+ //
2297+ // For example, the following break up of the receive
2298+ // buffer has 6 large suballocations and 10 small
2299+ // suballocations.
2300+ //
2301+ // | Large Section | | Small Section |
2302+ // ------------------------------------------------------------
2303+ // | | | | | | | | | | | | | | | | | |
2304+ // | |
2305+ // LargeOffset SmallOffset
2306+ //
2307+ NVSP_1_RECEIVE_BUFFER_SECTION Sections[1];
2308+
2309+} NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE;
2310+
2311+//
2312+// This message is sent by the VSC to revoke the receive buffer.
2313+// After the VSP completes this transaction, the vsp should never
2314+// use the receive buffer again.
2315+//
2316+typedef struct _NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER
2317+{
2318+ UINT16 Id;
2319+} NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER;
2320+
2321+//
2322+// This message is used by the VSC to send a send buffer
2323+// to the VSP. The VSC can then use the send buffer to
2324+// send data to the VSP.
2325+//
2326+typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER
2327+{
2328+ GPADL_HANDLE GpadlHandle;
2329+ UINT16 Id;
2330+} NVSP_1_MESSAGE_SEND_SEND_BUFFER, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER;
2331+
2332+//
2333+// This message is used by the VSP to acknowledge a send
2334+// buffer sent by the VSC. This message must be sent by the
2335+// VSP before the VSP uses the sent buffer.
2336+//
2337+typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE
2338+{
2339+ UINT32 Status;
2340+
2341+ //
2342+ // The VSC gets to choose the size of the send buffer and
2343+ // the VSP gets to choose the sections size of the buffer.
2344+ // This was done to enable dynamic reconfigurations when
2345+ // the cost of GPA-direct buffers decreases.
2346+ //
2347+ UINT32 SectionSize;
2348+} NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE;
2349+
2350+//
2351+// This message is sent by the VSC to revoke the send buffer.
2352+// After the VSP completes this transaction, the vsp should never
2353+// use the send buffer again.
2354+//
2355+typedef struct _NVSP_1_MESSAGE_REVOKE_SEND_BUFFER
2356+{
2357+ UINT16 Id;
2358+} NVSP_1_MESSAGE_REVOKE_SEND_BUFFER, *PNVSP_1_MESSAGE_REVOKE_SEND_BUFFER;
2359+
2360+//
2361+// This message is used by both the VSP and the VSC to send
2362+// a RNDIS message to the opposite channel endpoint.
2363+//
2364+typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET
2365+{
2366+ //
2367+ // This field is specified by RNIDS. They assume there's
2368+ // two different channels of communication. However,
2369+ // the Network VSP only has one. Therefore, the channel
2370+ // travels with the RNDIS packet.
2371+ //
2372+ UINT32 ChannelType;
2373+
2374+ //
2375+ // This field is used to send part or all of the data
2376+ // through a send buffer. This values specifies an
2377+ // index into the send buffer. If the index is
2378+ // 0xFFFFFFFF, then the send buffer is not being used
2379+ // and all of the data was sent through other VMBus
2380+ // mechanisms.
2381+ //
2382+ UINT32 SendBufferSectionIndex;
2383+ UINT32 SendBufferSectionSize;
2384+} NVSP_1_MESSAGE_SEND_RNDIS_PACKET, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET;
2385+
2386+//
2387+// This message is used by both the VSP and the VSC to complete
2388+// a RNDIS message to the opposite channel endpoint. At this
2389+// point, the initiator of this message cannot use any resources
2390+// associated with the original RNDIS packet.
2391+//
2392+typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE
2393+{
2394+ UINT32 Status;
2395+} NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE;
2396+
2397+typedef union _NVSP_MESSAGE_1_UBER
2398+{
2399+ NVSP_1_MESSAGE_SEND_NDIS_VERSION SendNdisVersion;
2400+
2401+ NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER SendReceiveBuffer;
2402+ NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE SendReceiveBufferComplete;
2403+ NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER RevokeReceiveBuffer;
2404+
2405+ NVSP_1_MESSAGE_SEND_SEND_BUFFER SendSendBuffer;
2406+ NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE SendSendBufferComplete;
2407+ NVSP_1_MESSAGE_REVOKE_SEND_BUFFER RevokeSendBuffer;
2408+
2409+ NVSP_1_MESSAGE_SEND_RNDIS_PACKET SendRNDISPacket;
2410+ NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE SendRNDISPacketComplete;
2411+} NVSP_1_MESSAGE_UBER;
2412+
2413+typedef union _NVSP_ALL_MESSAGES
2414+{
2415+ NVSP_MESSAGE_INIT_UBER InitMessages;
2416+ NVSP_1_MESSAGE_UBER Version1Messages;
2417+
2418+} NVSP_ALL_MESSAGES;
2419+
2420+//
2421+// ALL Messages
2422+//
2423+typedef struct _NVSP_MESSAGE
2424+{
2425+ NVSP_MESSAGE_HEADER Header;
2426+ NVSP_ALL_MESSAGES Messages;
2427+} NVSP_MESSAGE, *PNVSP_MESSAGE;
2428+
2429+#pragma pack(pop)
2430--- /dev/null
2431+++ b/drivers/staging/hv/include/rndis.h
2432@@ -0,0 +1,836 @@
2433+/*
2434+ *
2435+ * Copyright (c) 2009, Microsoft Corporation.
2436+ *
2437+ * This program is free software; you can redistribute it and/or modify it
2438+ * under the terms and conditions of the GNU General Public License,
2439+ * version 2, as published by the Free Software Foundation.
2440+ *
2441+ * This program is distributed in the hope it will be useful, but WITHOUT
2442+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2443+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
2444+ * more details.
2445+ *
2446+ * You should have received a copy of the GNU General Public License along with
2447+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
2448+ * Place - Suite 330, Boston, MA 02111-1307 USA.
2449+ *
2450+ * Authors:
2451+ * Haiyang Zhang <haiyangz@microsoft.com>
2452+ * Hank Janssen <hjanssen@microsoft.com>
2453+ *
2454+ */
2455+
2456+
2457+#ifndef _RNDIS_H_
2458+#define _RNDIS_H_
2459+
2460+//
2461+// Basic types
2462+//
2463+typedef UINT32 RNDIS_REQUEST_ID;
2464+typedef UINT32 RNDIS_HANDLE;
2465+typedef UINT32 RNDIS_STATUS;
2466+typedef UINT32 RNDIS_REQUEST_TYPE;
2467+typedef UINT32 RNDIS_OID;
2468+typedef UINT32 RNDIS_CLASS_ID;
2469+typedef UINT32 RNDIS_MEDIUM;
2470+typedef UINT32 *PRNDIS_REQUEST_ID;
2471+typedef UINT32 *PRNDIS_HANDLE;
2472+typedef UINT32 *PRNDIS_STATUS;
2473+typedef UINT32 *PRNDIS_REQUEST_TYPE;
2474+typedef UINT32 *PRNDIS_OID;
2475+typedef UINT32 *PRNDIS_CLASS_ID;
2476+typedef UINT32 *PRNDIS_MEDIUM;
2477+typedef UINT32 RNDIS_AF;
2478+
2479+//
2480+// Status codes
2481+//
2482+
2483+#ifndef STATUS_SUCCESS
2484+#define STATUS_SUCCESS (0x00000000L)
2485+#endif
2486+
2487+#ifndef STATUS_UNSUCCESSFUL
2488+#define STATUS_UNSUCCESSFUL (0xC0000001L)
2489+#endif
2490+
2491+#ifndef STATUS_PENDING
2492+#define STATUS_PENDING (0x00000103L)
2493+#endif
2494+
2495+#ifndef STATUS_INSUFFICIENT_RESOURCES
2496+#define STATUS_INSUFFICIENT_RESOURCES (0xC000009AL)
2497+#endif
2498+
2499+#ifndef STATUS_BUFFER_OVERFLOW
2500+#define STATUS_BUFFER_OVERFLOW (0x80000005L)
2501+#endif
2502+
2503+#ifndef STATUS_NOT_SUPPORTED
2504+#define STATUS_NOT_SUPPORTED (0xC00000BBL)
2505+#endif
2506+
2507+#define RNDIS_STATUS_SUCCESS ((RNDIS_STATUS)STATUS_SUCCESS)
2508+#define RNDIS_STATUS_PENDING ((RNDIS_STATUS)STATUS_PENDING)
2509+#define RNDIS_STATUS_NOT_RECOGNIZED ((RNDIS_STATUS)0x00010001L)
2510+#define RNDIS_STATUS_NOT_COPIED ((RNDIS_STATUS)0x00010002L)
2511+#define RNDIS_STATUS_NOT_ACCEPTED ((RNDIS_STATUS)0x00010003L)
2512+#define RNDIS_STATUS_CALL_ACTIVE ((RNDIS_STATUS)0x00010007L)
2513+
2514+#define RNDIS_STATUS_ONLINE ((RNDIS_STATUS)0x40010003L)
2515+#define RNDIS_STATUS_RESET_START ((RNDIS_STATUS)0x40010004L)
2516+#define RNDIS_STATUS_RESET_END ((RNDIS_STATUS)0x40010005L)
2517+#define RNDIS_STATUS_RING_STATUS ((RNDIS_STATUS)0x40010006L)
2518+#define RNDIS_STATUS_CLOSED ((RNDIS_STATUS)0x40010007L)
2519+#define RNDIS_STATUS_WAN_LINE_UP ((RNDIS_STATUS)0x40010008L)
2520+#define RNDIS_STATUS_WAN_LINE_DOWN ((RNDIS_STATUS)0x40010009L)
2521+#define RNDIS_STATUS_WAN_FRAGMENT ((RNDIS_STATUS)0x4001000AL)
2522+#define RNDIS_STATUS_MEDIA_CONNECT ((RNDIS_STATUS)0x4001000BL)
2523+#define RNDIS_STATUS_MEDIA_DISCONNECT ((RNDIS_STATUS)0x4001000CL)
2524+#define RNDIS_STATUS_HARDWARE_LINE_UP ((RNDIS_STATUS)0x4001000DL)
2525+#define RNDIS_STATUS_HARDWARE_LINE_DOWN ((RNDIS_STATUS)0x4001000EL)
2526+#define RNDIS_STATUS_INTERFACE_UP ((RNDIS_STATUS)0x4001000FL)
2527+#define RNDIS_STATUS_INTERFACE_DOWN ((RNDIS_STATUS)0x40010010L)
2528+#define RNDIS_STATUS_MEDIA_BUSY ((RNDIS_STATUS)0x40010011L)
2529+#define RNDIS_STATUS_MEDIA_SPECIFIC_INDICATION ((RNDIS_STATUS)0x40010012L)
2530+#define RNDIS_STATUS_WW_INDICATION RNDIS_STATUS_MEDIA_SPECIFIC_INDICATION
2531+#define RNDIS_STATUS_LINK_SPEED_CHANGE ((RNDIS_STATUS)0x40010013L)
2532+
2533+#define RNDIS_STATUS_NOT_RESETTABLE ((RNDIS_STATUS)0x80010001L)
2534+#define RNDIS_STATUS_SOFT_ERRORS ((RNDIS_STATUS)0x80010003L)
2535+#define RNDIS_STATUS_HARD_ERRORS ((RNDIS_STATUS)0x80010004L)
2536+#define RNDIS_STATUS_BUFFER_OVERFLOW ((RNDIS_STATUS)STATUS_BUFFER_OVERFLOW)
2537+
2538+#define RNDIS_STATUS_FAILURE ((RNDIS_STATUS)STATUS_UNSUCCESSFUL)
2539+#define RNDIS_STATUS_RESOURCES ((RNDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES)
2540+#define RNDIS_STATUS_CLOSING ((RNDIS_STATUS)0xC0010002L)
2541+#define RNDIS_STATUS_BAD_VERSION ((RNDIS_STATUS)0xC0010004L)
2542+#define RNDIS_STATUS_BAD_CHARACTERISTICS ((RNDIS_STATUS)0xC0010005L)
2543+#define RNDIS_STATUS_ADAPTER_NOT_FOUND ((RNDIS_STATUS)0xC0010006L)
2544+#define RNDIS_STATUS_OPEN_FAILED ((RNDIS_STATUS)0xC0010007L)
2545+#define RNDIS_STATUS_DEVICE_FAILED ((RNDIS_STATUS)0xC0010008L)
2546+#define RNDIS_STATUS_MULTICAST_FULL ((RNDIS_STATUS)0xC0010009L)
2547+#define RNDIS_STATUS_MULTICAST_EXISTS ((RNDIS_STATUS)0xC001000AL)
2548+#define RNDIS_STATUS_MULTICAST_NOT_FOUND ((RNDIS_STATUS)0xC001000BL)
2549+#define RNDIS_STATUS_REQUEST_ABORTED ((RNDIS_STATUS)0xC001000CL)
2550+#define RNDIS_STATUS_RESET_IN_PROGRESS ((RNDIS_STATUS)0xC001000DL)
2551+#define RNDIS_STATUS_CLOSING_INDICATING ((RNDIS_STATUS)0xC001000EL)
2552+#define RNDIS_STATUS_NOT_SUPPORTED ((RNDIS_STATUS)STATUS_NOT_SUPPORTED)
2553+#define RNDIS_STATUS_INVALID_PACKET ((RNDIS_STATUS)0xC001000FL)
2554+#define RNDIS_STATUS_OPEN_LIST_FULL ((RNDIS_STATUS)0xC0010010L)
2555+#define RNDIS_STATUS_ADAPTER_NOT_READY ((RNDIS_STATUS)0xC0010011L)
2556+#define RNDIS_STATUS_ADAPTER_NOT_OPEN ((RNDIS_STATUS)0xC0010012L)
2557+#define RNDIS_STATUS_NOT_INDICATING ((RNDIS_STATUS)0xC0010013L)
2558+#define RNDIS_STATUS_INVALID_LENGTH ((RNDIS_STATUS)0xC0010014L)
2559+#define RNDIS_STATUS_INVALID_DATA ((RNDIS_STATUS)0xC0010015L)
2560+#define RNDIS_STATUS_BUFFER_TOO_SHORT ((RNDIS_STATUS)0xC0010016L)
2561+#define RNDIS_STATUS_INVALID_OID ((RNDIS_STATUS)0xC0010017L)
2562+#define RNDIS_STATUS_ADAPTER_REMOVED ((RNDIS_STATUS)0xC0010018L)
2563+#define RNDIS_STATUS_UNSUPPORTED_MEDIA ((RNDIS_STATUS)0xC0010019L)
2564+#define RNDIS_STATUS_GROUP_ADDRESS_IN_USE ((RNDIS_STATUS)0xC001001AL)
2565+#define RNDIS_STATUS_FILE_NOT_FOUND ((RNDIS_STATUS)0xC001001BL)
2566+#define RNDIS_STATUS_ERROR_READING_FILE ((RNDIS_STATUS)0xC001001CL)
2567+#define RNDIS_STATUS_ALREADY_MAPPED ((RNDIS_STATUS)0xC001001DL)
2568+#define RNDIS_STATUS_RESOURCE_CONFLICT ((RNDIS_STATUS)0xC001001EL)
2569+#define RNDIS_STATUS_NO_CABLE ((RNDIS_STATUS)0xC001001FL)
2570+
2571+#define RNDIS_STATUS_INVALID_SAP ((RNDIS_STATUS)0xC0010020L)
2572+#define RNDIS_STATUS_SAP_IN_USE ((RNDIS_STATUS)0xC0010021L)
2573+#define RNDIS_STATUS_INVALID_ADDRESS ((RNDIS_STATUS)0xC0010022L)
2574+#define RNDIS_STATUS_VC_NOT_ACTIVATED ((RNDIS_STATUS)0xC0010023L)
2575+#define RNDIS_STATUS_DEST_OUT_OF_ORDER ((RNDIS_STATUS)0xC0010024L)
2576+#define RNDIS_STATUS_VC_NOT_AVAILABLE ((RNDIS_STATUS)0xC0010025L)
2577+#define RNDIS_STATUS_CELLRATE_NOT_AVAILABLE ((RNDIS_STATUS)0xC0010026L)
2578+#define RNDIS_STATUS_INCOMPATABLE_QOS ((RNDIS_STATUS)0xC0010027L)
2579+#define RNDIS_STATUS_AAL_PARAMS_UNSUPPORTED ((RNDIS_STATUS)0xC0010028L)
2580+#define RNDIS_STATUS_NO_ROUTE_TO_DESTINATION ((RNDIS_STATUS)0xC0010029L)
2581+
2582+#define RNDIS_STATUS_TOKEN_RING_OPEN_ERROR ((RNDIS_STATUS)0xC0011000L)
2583+
2584+
2585+//
2586+// Object Identifiers used by NdisRequest Query/Set Information
2587+//
2588+
2589+//
2590+// General Objects
2591+//
2592+
2593+#define RNDIS_OID_GEN_SUPPORTED_LIST 0x00010101
2594+#define RNDIS_OID_GEN_HARDWARE_STATUS 0x00010102
2595+#define RNDIS_OID_GEN_MEDIA_SUPPORTED 0x00010103
2596+#define RNDIS_OID_GEN_MEDIA_IN_USE 0x00010104
2597+#define RNDIS_OID_GEN_MAXIMUM_LOOKAHEAD 0x00010105
2598+#define RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE 0x00010106
2599+#define RNDIS_OID_GEN_LINK_SPEED 0x00010107
2600+#define RNDIS_OID_GEN_TRANSMIT_BUFFER_SPACE 0x00010108
2601+#define RNDIS_OID_GEN_RECEIVE_BUFFER_SPACE 0x00010109
2602+#define RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE 0x0001010A
2603+#define RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE 0x0001010B
2604+#define RNDIS_OID_GEN_VENDOR_ID 0x0001010C
2605+#define RNDIS_OID_GEN_VENDOR_DESCRIPTION 0x0001010D
2606+#define RNDIS_OID_GEN_CURRENT_PACKET_FILTER 0x0001010E
2607+#define RNDIS_OID_GEN_CURRENT_LOOKAHEAD 0x0001010F
2608+#define RNDIS_OID_GEN_DRIVER_VERSION 0x00010110
2609+#define RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE 0x00010111
2610+#define RNDIS_OID_GEN_PROTOCOL_OPTIONS 0x00010112
2611+#define RNDIS_OID_GEN_MAC_OPTIONS 0x00010113
2612+#define RNDIS_OID_GEN_MEDIA_CONNECT_STATUS 0x00010114
2613+#define RNDIS_OID_GEN_MAXIMUM_SEND_PACKETS 0x00010115
2614+#define RNDIS_OID_GEN_VENDOR_DRIVER_VERSION 0x00010116
2615+#define RNDIS_OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118
2616+#define RNDIS_OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119
2617+#define RNDIS_OID_GEN_MACHINE_NAME 0x0001021A
2618+#define RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER 0x0001021B
2619+
2620+#define RNDIS_OID_GEN_XMIT_OK 0x00020101
2621+#define RNDIS_OID_GEN_RCV_OK 0x00020102
2622+#define RNDIS_OID_GEN_XMIT_ERROR 0x00020103
2623+#define RNDIS_OID_GEN_RCV_ERROR 0x00020104
2624+#define RNDIS_OID_GEN_RCV_NO_BUFFER 0x00020105
2625+
2626+#define RNDIS_OID_GEN_DIRECTED_BYTES_XMIT 0x00020201
2627+#define RNDIS_OID_GEN_DIRECTED_FRAMES_XMIT 0x00020202
2628+#define RNDIS_OID_GEN_MULTICAST_BYTES_XMIT 0x00020203
2629+#define RNDIS_OID_GEN_MULTICAST_FRAMES_XMIT 0x00020204
2630+#define RNDIS_OID_GEN_BROADCAST_BYTES_XMIT 0x00020205
2631+#define RNDIS_OID_GEN_BROADCAST_FRAMES_XMIT 0x00020206
2632+#define RNDIS_OID_GEN_DIRECTED_BYTES_RCV 0x00020207
2633+#define RNDIS_OID_GEN_DIRECTED_FRAMES_RCV 0x00020208
2634+#define RNDIS_OID_GEN_MULTICAST_BYTES_RCV 0x00020209
2635+#define RNDIS_OID_GEN_MULTICAST_FRAMES_RCV 0x0002020A
2636+#define RNDIS_OID_GEN_BROADCAST_BYTES_RCV 0x0002020B
2637+#define RNDIS_OID_GEN_BROADCAST_FRAMES_RCV 0x0002020C
2638+
2639+#define RNDIS_OID_GEN_RCV_CRC_ERROR 0x0002020D
2640+#define RNDIS_OID_GEN_TRANSMIT_QUEUE_LENGTH 0x0002020E
2641+
2642+#define RNDIS_OID_GEN_GET_TIME_CAPS 0x0002020F
2643+#define RNDIS_OID_GEN_GET_NETCARD_TIME 0x00020210
2644+
2645+//
2646+// These are connection-oriented general OIDs.
2647+// These replace the above OIDs for connection-oriented media.
2648+//
2649+#define RNDIS_OID_GEN_CO_SUPPORTED_LIST 0x00010101
2650+#define RNDIS_OID_GEN_CO_HARDWARE_STATUS 0x00010102
2651+#define RNDIS_OID_GEN_CO_MEDIA_SUPPORTED 0x00010103
2652+#define RNDIS_OID_GEN_CO_MEDIA_IN_USE 0x00010104
2653+#define RNDIS_OID_GEN_CO_LINK_SPEED 0x00010105
2654+#define RNDIS_OID_GEN_CO_VENDOR_ID 0x00010106
2655+#define RNDIS_OID_GEN_CO_VENDOR_DESCRIPTION 0x00010107
2656+#define RNDIS_OID_GEN_CO_DRIVER_VERSION 0x00010108
2657+#define RNDIS_OID_GEN_CO_PROTOCOL_OPTIONS 0x00010109
2658+#define RNDIS_OID_GEN_CO_MAC_OPTIONS 0x0001010A
2659+#define RNDIS_OID_GEN_CO_MEDIA_CONNECT_STATUS 0x0001010B
2660+#define RNDIS_OID_GEN_CO_VENDOR_DRIVER_VERSION 0x0001010C
2661+#define RNDIS_OID_GEN_CO_MINIMUM_LINK_SPEED 0x0001010D
2662+
2663+#define RNDIS_OID_GEN_CO_GET_TIME_CAPS 0x00010201
2664+#define RNDIS_OID_GEN_CO_GET_NETCARD_TIME 0x00010202
2665+
2666+//
2667+// These are connection-oriented statistics OIDs.
2668+//
2669+#define RNDIS_OID_GEN_CO_XMIT_PDUS_OK 0x00020101
2670+#define RNDIS_OID_GEN_CO_RCV_PDUS_OK 0x00020102
2671+#define RNDIS_OID_GEN_CO_XMIT_PDUS_ERROR 0x00020103
2672+#define RNDIS_OID_GEN_CO_RCV_PDUS_ERROR 0x00020104
2673+#define RNDIS_OID_GEN_CO_RCV_PDUS_NO_BUFFER 0x00020105
2674+
2675+
2676+#define RNDIS_OID_GEN_CO_RCV_CRC_ERROR 0x00020201
2677+#define RNDIS_OID_GEN_CO_TRANSMIT_QUEUE_LENGTH 0x00020202
2678+#define RNDIS_OID_GEN_CO_BYTES_XMIT 0x00020203
2679+#define RNDIS_OID_GEN_CO_BYTES_RCV 0x00020204
2680+#define RNDIS_OID_GEN_CO_BYTES_XMIT_OUTSTANDING 0x00020205
2681+#define RNDIS_OID_GEN_CO_NETCARD_LOAD 0x00020206
2682+
2683+//
2684+// These are objects for Connection-oriented media call-managers.
2685+//
2686+#define RNDIS_OID_CO_ADD_PVC 0xFF000001
2687+#define RNDIS_OID_CO_DELETE_PVC 0xFF000002
2688+#define RNDIS_OID_CO_GET_CALL_INFORMATION 0xFF000003
2689+#define RNDIS_OID_CO_ADD_ADDRESS 0xFF000004
2690+#define RNDIS_OID_CO_DELETE_ADDRESS 0xFF000005
2691+#define RNDIS_OID_CO_GET_ADDRESSES 0xFF000006
2692+#define RNDIS_OID_CO_ADDRESS_CHANGE 0xFF000007
2693+#define RNDIS_OID_CO_SIGNALING_ENABLED 0xFF000008
2694+#define RNDIS_OID_CO_SIGNALING_DISABLED 0xFF000009
2695+
2696+
2697+//
2698+// 802.3 Objects (Ethernet)
2699+//
2700+
2701+#define RNDIS_OID_802_3_PERMANENT_ADDRESS 0x01010101
2702+#define RNDIS_OID_802_3_CURRENT_ADDRESS 0x01010102
2703+#define RNDIS_OID_802_3_MULTICAST_LIST 0x01010103
2704+#define RNDIS_OID_802_3_MAXIMUM_LIST_SIZE 0x01010104
2705+#define RNDIS_OID_802_3_MAC_OPTIONS 0x01010105
2706+
2707+//
2708+//
2709+#define NDIS_802_3_MAC_OPTION_PRIORITY 0x00000001
2710+
2711+#define RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101
2712+#define RNDIS_OID_802_3_XMIT_ONE_COLLISION 0x01020102
2713+#define RNDIS_OID_802_3_XMIT_MORE_COLLISIONS 0x01020103
2714+
2715+#define RNDIS_OID_802_3_XMIT_DEFERRED 0x01020201
2716+#define RNDIS_OID_802_3_XMIT_MAX_COLLISIONS 0x01020202
2717+#define RNDIS_OID_802_3_RCV_OVERRUN 0x01020203
2718+#define RNDIS_OID_802_3_XMIT_UNDERRUN 0x01020204
2719+#define RNDIS_OID_802_3_XMIT_HEARTBEAT_FAILURE 0x01020205
2720+#define RNDIS_OID_802_3_XMIT_TIMES_CRS_LOST 0x01020206
2721+#define RNDIS_OID_802_3_XMIT_LATE_COLLISIONS 0x01020207
2722+
2723+
2724+//
2725+// Remote NDIS message types
2726+//
2727+#define REMOTE_NDIS_PACKET_MSG 0x00000001
2728+#define REMOTE_NDIS_INITIALIZE_MSG 0x00000002
2729+#define REMOTE_NDIS_HALT_MSG 0x00000003
2730+#define REMOTE_NDIS_QUERY_MSG 0x00000004
2731+#define REMOTE_NDIS_SET_MSG 0x00000005
2732+#define REMOTE_NDIS_RESET_MSG 0x00000006
2733+#define REMOTE_NDIS_INDICATE_STATUS_MSG 0x00000007
2734+#define REMOTE_NDIS_KEEPALIVE_MSG 0x00000008
2735+
2736+#define REMOTE_CONDIS_MP_CREATE_VC_MSG 0x00008001
2737+#define REMOTE_CONDIS_MP_DELETE_VC_MSG 0x00008002
2738+#define REMOTE_CONDIS_MP_ACTIVATE_VC_MSG 0x00008005
2739+#define REMOTE_CONDIS_MP_DEACTIVATE_VC_MSG 0x00008006
2740+#define REMOTE_CONDIS_INDICATE_STATUS_MSG 0x00008007
2741+
2742+
2743+// Remote NDIS message completion types
2744+#define REMOTE_NDIS_INITIALIZE_CMPLT 0x80000002
2745+#define REMOTE_NDIS_QUERY_CMPLT 0x80000004
2746+#define REMOTE_NDIS_SET_CMPLT 0x80000005
2747+#define REMOTE_NDIS_RESET_CMPLT 0x80000006
2748+#define REMOTE_NDIS_KEEPALIVE_CMPLT 0x80000008
2749+
2750+#define REMOTE_CONDIS_MP_CREATE_VC_CMPLT 0x80008001
2751+#define REMOTE_CONDIS_MP_DELETE_VC_CMPLT 0x80008002
2752+#define REMOTE_CONDIS_MP_ACTIVATE_VC_CMPLT 0x80008005
2753+#define REMOTE_CONDIS_MP_DEACTIVATE_VC_CMPLT 0x80008006
2754+
2755+//
2756+// Reserved message type for private communication between lower-layer
2757+// host driver and remote device, if necessary.
2758+//
2759+#define REMOTE_NDIS_BUS_MSG 0xff000001
2760+
2761+
2762+
2763+//
2764+// Defines for DeviceFlags in RNDIS_INITIALIZE_COMPLETE
2765+//
2766+#define RNDIS_DF_CONNECTIONLESS 0x00000001
2767+#define RNDIS_DF_CONNECTION_ORIENTED 0x00000002
2768+#define RNDIS_DF_RAW_DATA 0x00000004
2769+
2770+//
2771+// Remote NDIS medium types.
2772+//
2773+#define RNdisMedium802_3 0x00000000
2774+#define RNdisMedium802_5 0x00000001
2775+#define RNdisMediumFddi 0x00000002
2776+#define RNdisMediumWan 0x00000003
2777+#define RNdisMediumLocalTalk 0x00000004
2778+#define RNdisMediumArcnetRaw 0x00000006
2779+#define RNdisMediumArcnet878_2 0x00000007
2780+#define RNdisMediumAtm 0x00000008
2781+#define RNdisMediumWirelessWan 0x00000009
2782+#define RNdisMediumIrda 0x0000000a
2783+#define RNdisMediumCoWan 0x0000000b
2784+#define RNdisMediumMax 0x0000000d // Not a real medium, defined as an upper-bound
2785+
2786+//
2787+// Remote NDIS medium connection states.
2788+//
2789+#define RNdisMediaStateConnected 0x00000000
2790+#define RNdisMediaStateDisconnected 0x00000001
2791+
2792+//
2793+// Remote NDIS version numbers
2794+//
2795+#define RNDIS_MAJOR_VERSION 0x00000001
2796+#define RNDIS_MINOR_VERSION 0x00000000
2797+
2798+//
2799+// NdisInitialize message
2800+//
2801+typedef struct _RNDIS_INITIALIZE_REQUEST
2802+{
2803+ RNDIS_REQUEST_ID RequestId;
2804+ UINT32 MajorVersion;
2805+ UINT32 MinorVersion;
2806+ UINT32 MaxTransferSize;
2807+} RNDIS_INITIALIZE_REQUEST, *PRNDIS_INITIALIZE_REQUEST;
2808+
2809+
2810+//
2811+// Response to NdisInitialize
2812+//
2813+typedef struct _RNDIS_INITIALIZE_COMPLETE
2814+{
2815+ RNDIS_REQUEST_ID RequestId;
2816+ RNDIS_STATUS Status;
2817+ UINT32 MajorVersion;
2818+ UINT32 MinorVersion;
2819+ UINT32 DeviceFlags;
2820+ RNDIS_MEDIUM Medium;
2821+ UINT32 MaxPacketsPerMessage;
2822+ UINT32 MaxTransferSize;
2823+ UINT32 PacketAlignmentFactor;
2824+ UINT32 AFListOffset;
2825+ UINT32 AFListSize;
2826+} RNDIS_INITIALIZE_COMPLETE, *PRNDIS_INITIALIZE_COMPLETE;
2827+
2828+
2829+//
2830+// Call manager devices only: Information about an address family
2831+// supported by the device is appended to the response to NdisInitialize.
2832+//
2833+typedef struct _RNDIS_CO_ADDRESS_FAMILY
2834+{
2835+ RNDIS_AF AddressFamily;
2836+ UINT32 MajorVersion;
2837+ UINT32 MinorVersion;
2838+} RNDIS_CO_ADDRESS_FAMILY, *PRNDIS_CO_ADDRESS_FAMILY;
2839+
2840+
2841+//
2842+// NdisHalt message
2843+//
2844+typedef struct _RNDIS_HALT_REQUEST
2845+{
2846+ RNDIS_REQUEST_ID RequestId;
2847+} RNDIS_HALT_REQUEST, *PRNDIS_HALT_REQUEST;
2848+
2849+
2850+//
2851+// NdisQueryRequest message
2852+//
2853+typedef struct _RNDIS_QUERY_REQUEST
2854+{
2855+ RNDIS_REQUEST_ID RequestId;
2856+ RNDIS_OID Oid;
2857+ UINT32 InformationBufferLength;
2858+ UINT32 InformationBufferOffset;
2859+ RNDIS_HANDLE DeviceVcHandle;
2860+} RNDIS_QUERY_REQUEST, *PRNDIS_QUERY_REQUEST;
2861+
2862+
2863+//
2864+// Response to NdisQueryRequest
2865+//
2866+typedef struct _RNDIS_QUERY_COMPLETE
2867+{
2868+ RNDIS_REQUEST_ID RequestId;
2869+ RNDIS_STATUS Status;
2870+ UINT32 InformationBufferLength;
2871+ UINT32 InformationBufferOffset;
2872+} RNDIS_QUERY_COMPLETE, *PRNDIS_QUERY_COMPLETE;
2873+
2874+
2875+//
2876+// NdisSetRequest message
2877+//
2878+typedef struct _RNDIS_SET_REQUEST
2879+{
2880+ RNDIS_REQUEST_ID RequestId;
2881+ RNDIS_OID Oid;
2882+ UINT32 InformationBufferLength;
2883+ UINT32 InformationBufferOffset;
2884+ RNDIS_HANDLE DeviceVcHandle;
2885+} RNDIS_SET_REQUEST, *PRNDIS_SET_REQUEST;
2886+
2887+
2888+//
2889+// Response to NdisSetRequest
2890+//
2891+typedef struct _RNDIS_SET_COMPLETE
2892+{
2893+ RNDIS_REQUEST_ID RequestId;
2894+ RNDIS_STATUS Status;
2895+} RNDIS_SET_COMPLETE, *PRNDIS_SET_COMPLETE;
2896+
2897+
2898+//
2899+// NdisReset message
2900+//
2901+typedef struct _RNDIS_RESET_REQUEST
2902+{
2903+ UINT32 Reserved;
2904+} RNDIS_RESET_REQUEST, *PRNDIS_RESET_REQUEST;
2905+
2906+//
2907+// Response to NdisReset
2908+//
2909+typedef struct _RNDIS_RESET_COMPLETE
2910+{
2911+ RNDIS_STATUS Status;
2912+ UINT32 AddressingReset;
2913+} RNDIS_RESET_COMPLETE, *PRNDIS_RESET_COMPLETE;
2914+
2915+
2916+//
2917+// NdisMIndicateStatus message
2918+//
2919+typedef struct _RNDIS_INDICATE_STATUS
2920+{
2921+ RNDIS_STATUS Status;
2922+ UINT32 StatusBufferLength;
2923+ UINT32 StatusBufferOffset;
2924+} RNDIS_INDICATE_STATUS, *PRNDIS_INDICATE_STATUS;
2925+
2926+
2927+//
2928+// Diagnostic information passed as the status buffer in
2929+// RNDIS_INDICATE_STATUS messages signifying error conditions.
2930+//
2931+typedef struct _RNDIS_DIAGNOSTIC_INFO
2932+{
2933+ RNDIS_STATUS DiagStatus;
2934+ UINT32 ErrorOffset;
2935+} RNDIS_DIAGNOSTIC_INFO, *PRNDIS_DIAGNOSTIC_INFO;
2936+
2937+
2938+
2939+//
2940+// NdisKeepAlive message
2941+//
2942+typedef struct _RNDIS_KEEPALIVE_REQUEST
2943+{
2944+ RNDIS_REQUEST_ID RequestId;
2945+} RNDIS_KEEPALIVE_REQUEST, *PRNDIS_KEEPALIVE_REQUEST;
2946+
2947+
2948+//
2949+// Response to NdisKeepAlive
2950+//
2951+typedef struct _RNDIS_KEEPALIVE_COMPLETE
2952+{
2953+ RNDIS_REQUEST_ID RequestId;
2954+ RNDIS_STATUS Status;
2955+} RNDIS_KEEPALIVE_COMPLETE, *PRNDIS_KEEPALIVE_COMPLETE;
2956+
2957+
2958+//
2959+// Data message. All Offset fields contain byte offsets from the beginning
2960+// of the RNDIS_PACKET structure. All Length fields are in bytes.
2961+// VcHandle is set to 0 for connectionless data, otherwise it
2962+// contains the VC handle.
2963+//
2964+typedef struct _RNDIS_PACKET
2965+{
2966+ UINT32 DataOffset;
2967+ UINT32 DataLength;
2968+ UINT32 OOBDataOffset;
2969+ UINT32 OOBDataLength;
2970+ UINT32 NumOOBDataElements;
2971+ UINT32 PerPacketInfoOffset;
2972+ UINT32 PerPacketInfoLength;
2973+ RNDIS_HANDLE VcHandle;
2974+ UINT32 Reserved;
2975+} RNDIS_PACKET, *PRNDIS_PACKET;
2976+
2977+//
2978+// Optional Out of Band data associated with a Data message.
2979+//
2980+typedef struct _RNDIS_OOBD
2981+{
2982+ UINT32 Size;
2983+ RNDIS_CLASS_ID Type;
2984+ UINT32 ClassInformationOffset;
2985+} RNDIS_OOBD, *PRNDIS_OOBD;
2986+
2987+//
2988+// Packet extension field contents associated with a Data message.
2989+//
2990+typedef struct _RNDIS_PER_PACKET_INFO
2991+{
2992+ UINT32 Size;
2993+ UINT32 Type;
2994+ UINT32 PerPacketInformationOffset;
2995+} RNDIS_PER_PACKET_INFO, *PRNDIS_PER_PACKET_INFO;
2996+
2997+
2998+//
2999+// Format of Information buffer passed in a SetRequest for the OID
3000+// OID_GEN_RNDIS_CONFIG_PARAMETER.
3001+//
3002+typedef struct _RNDIS_CONFIG_PARAMETER_INFO
3003+{
3004+ UINT32 ParameterNameOffset;
3005+ UINT32 ParameterNameLength;
3006+ UINT32 ParameterType;
3007+ UINT32 ParameterValueOffset;
3008+ UINT32 ParameterValueLength;
3009+} RNDIS_CONFIG_PARAMETER_INFO, *PRNDIS_CONFIG_PARAMETER_INFO;
3010+
3011+//
3012+// Values for ParameterType in RNDIS_CONFIG_PARAMETER_INFO
3013+//
3014+#define RNDIS_CONFIG_PARAM_TYPE_INTEGER 0
3015+#define RNDIS_CONFIG_PARAM_TYPE_STRING 2
3016+
3017+
3018+//
3019+// CONDIS Miniport messages for connection oriented devices
3020+// that do not implement a call manager.
3021+//
3022+
3023+//
3024+// CoNdisMiniportCreateVc message
3025+//
3026+typedef struct _RCONDIS_MP_CREATE_VC
3027+{
3028+ RNDIS_REQUEST_ID RequestId;
3029+ RNDIS_HANDLE NdisVcHandle;
3030+} RCONDIS_MP_CREATE_VC, *PRCONDIS_MP_CREATE_VC;
3031+
3032+//
3033+// Response to CoNdisMiniportCreateVc
3034+//
3035+typedef struct _RCONDIS_MP_CREATE_VC_COMPLETE
3036+{
3037+ RNDIS_REQUEST_ID RequestId;
3038+ RNDIS_HANDLE DeviceVcHandle;
3039+ RNDIS_STATUS Status;
3040+} RCONDIS_MP_CREATE_VC_COMPLETE, *PRCONDIS_MP_CREATE_VC_COMPLETE;
3041+
3042+
3043+//
3044+// CoNdisMiniportDeleteVc message
3045+//
3046+typedef struct _RCONDIS_MP_DELETE_VC
3047+{
3048+ RNDIS_REQUEST_ID RequestId;
3049+ RNDIS_HANDLE DeviceVcHandle;
3050+} RCONDIS_MP_DELETE_VC, *PRCONDIS_MP_DELETE_VC;
3051+
3052+//
3053+// Response to CoNdisMiniportDeleteVc
3054+//
3055+typedef struct _RCONDIS_MP_DELETE_VC_COMPLETE
3056+{
3057+ RNDIS_REQUEST_ID RequestId;
3058+ RNDIS_STATUS Status;
3059+} RCONDIS_MP_DELETE_VC_COMPLETE, *PRCONDIS_MP_DELETE_VC_COMPLETE;
3060+
3061+
3062+//
3063+// CoNdisMiniportQueryRequest message
3064+//
3065+typedef struct _RCONDIS_MP_QUERY_REQUEST
3066+{
3067+ RNDIS_REQUEST_ID RequestId;
3068+ RNDIS_REQUEST_TYPE RequestType;
3069+ RNDIS_OID Oid;
3070+ RNDIS_HANDLE DeviceVcHandle;
3071+ UINT32 InformationBufferLength;
3072+ UINT32 InformationBufferOffset;
3073+} RCONDIS_MP_QUERY_REQUEST, *PRCONDIS_MP_QUERY_REQUEST;
3074+
3075+
3076+//
3077+// CoNdisMiniportSetRequest message
3078+//
3079+typedef struct _RCONDIS_MP_SET_REQUEST
3080+{
3081+ RNDIS_REQUEST_ID RequestId;
3082+ RNDIS_REQUEST_TYPE RequestType;
3083+ RNDIS_OID Oid;
3084+ RNDIS_HANDLE DeviceVcHandle;
3085+ UINT32 InformationBufferLength;
3086+ UINT32 InformationBufferOffset;
3087+} RCONDIS_MP_SET_REQUEST, *PRCONDIS_MP_SET_REQUEST;
3088+
3089+
3090+//
3091+// CoNdisIndicateStatus message
3092+//
3093+typedef struct _RCONDIS_INDICATE_STATUS
3094+{
3095+ RNDIS_HANDLE NdisVcHandle;
3096+ RNDIS_STATUS Status;
3097+ UINT32 StatusBufferLength;
3098+ UINT32 StatusBufferOffset;
3099+} RCONDIS_INDICATE_STATUS, *PRCONDIS_INDICATE_STATUS;
3100+
3101+
3102+//
3103+// CONDIS Call/VC parameters
3104+//
3105+
3106+typedef struct _RCONDIS_SPECIFIC_PARAMETERS
3107+{
3108+ UINT32 ParameterType;
3109+ UINT32 ParameterLength;
3110+ UINT32 ParameterOffset;
3111+} RCONDIS_SPECIFIC_PARAMETERS, *PRCONDIS_SPECIFIC_PARAMETERS;
3112+
3113+typedef struct _RCONDIS_MEDIA_PARAMETERS
3114+{
3115+ UINT32 Flags;
3116+ UINT32 Reserved1;
3117+ UINT32 Reserved2;
3118+ RCONDIS_SPECIFIC_PARAMETERS MediaSpecific;
3119+} RCONDIS_MEDIA_PARAMETERS, *PRCONDIS_MEDIA_PARAMETERS;
3120+
3121+
3122+typedef struct _RNDIS_FLOWSPEC
3123+{
3124+ UINT32 TokenRate;
3125+ UINT32 TokenBucketSize;
3126+ UINT32 PeakBandwidth;
3127+ UINT32 Latency;
3128+ UINT32 DelayVariation;
3129+ UINT32 ServiceType;
3130+ UINT32 MaxSduSize;
3131+ UINT32 MinimumPolicedSize;
3132+} RNDIS_FLOWSPEC, *PRNDIS_FLOWSPEC;
3133+
3134+typedef struct _RCONDIS_CALL_MANAGER_PARAMETERS
3135+{
3136+ RNDIS_FLOWSPEC Transmit;
3137+ RNDIS_FLOWSPEC Receive;
3138+ RCONDIS_SPECIFIC_PARAMETERS CallMgrSpecific;
3139+} RCONDIS_CALL_MANAGER_PARAMETERS, *PRCONDIS_CALL_MANAGER_PARAMETERS;
3140+
3141+//
3142+// CoNdisMiniportActivateVc message
3143+//
3144+typedef struct _RCONDIS_MP_ACTIVATE_VC_REQUEST
3145+{
3146+ RNDIS_REQUEST_ID RequestId;
3147+ UINT32 Flags;
3148+ RNDIS_HANDLE DeviceVcHandle;
3149+ UINT32 MediaParamsOffset;
3150+ UINT32 MediaParamsLength;
3151+ UINT32 CallMgrParamsOffset;
3152+ UINT32 CallMgrParamsLength;
3153+} RCONDIS_MP_ACTIVATE_VC_REQUEST, *PRCONDIS_MP_ACTIVATE_VC_REQUEST;
3154+
3155+//
3156+// Response to CoNdisMiniportActivateVc
3157+//
3158+typedef struct _RCONDIS_MP_ACTIVATE_VC_COMPLETE
3159+{
3160+ RNDIS_REQUEST_ID RequestId;
3161+ RNDIS_STATUS Status;
3162+} RCONDIS_MP_ACTIVATE_VC_COMPLETE, *PRCONDIS_MP_ACTIVATE_VC_COMPLETE;
3163+
3164+
3165+//
3166+// CoNdisMiniportDeactivateVc message
3167+//
3168+typedef struct _RCONDIS_MP_DEACTIVATE_VC_REQUEST
3169+{
3170+ RNDIS_REQUEST_ID RequestId;
3171+ UINT32 Flags;
3172+ RNDIS_HANDLE DeviceVcHandle;
3173+} RCONDIS_MP_DEACTIVATE_VC_REQUEST, *PRCONDIS_MP_DEACTIVATE_VC_REQUEST;
3174+
3175+//
3176+// Response to CoNdisMiniportDeactivateVc
3177+//
3178+typedef struct _RCONDIS_MP_DEACTIVATE_VC_COMPLETE
3179+{
3180+ RNDIS_REQUEST_ID RequestId;
3181+ RNDIS_STATUS Status;
3182+} RCONDIS_MP_DEACTIVATE_VC_COMPLETE, *PRCONDIS_MP_DEACTIVATE_VC_COMPLETE;
3183+
3184+
3185+//
3186+// union with all of the RNDIS messages
3187+//
3188+typedef union _RNDIS_MESSAGE_CONTAINER
3189+{
3190+ RNDIS_PACKET Packet;
3191+ RNDIS_INITIALIZE_REQUEST InitializeRequest;
3192+ RNDIS_HALT_REQUEST HaltRequest;
3193+ RNDIS_QUERY_REQUEST QueryRequest;
3194+ RNDIS_SET_REQUEST SetRequest;
3195+ RNDIS_RESET_REQUEST ResetRequest;
3196+ RNDIS_KEEPALIVE_REQUEST KeepaliveRequest;
3197+ RNDIS_INDICATE_STATUS IndicateStatus;
3198+ RNDIS_INITIALIZE_COMPLETE InitializeComplete;
3199+ RNDIS_QUERY_COMPLETE QueryComplete;
3200+ RNDIS_SET_COMPLETE SetComplete;
3201+ RNDIS_RESET_COMPLETE ResetComplete;
3202+ RNDIS_KEEPALIVE_COMPLETE KeepaliveComplete;
3203+ RCONDIS_MP_CREATE_VC CoMiniportCreateVc;
3204+ RCONDIS_MP_DELETE_VC CoMiniportDeleteVc;
3205+ RCONDIS_INDICATE_STATUS CoIndicateStatus;
3206+ RCONDIS_MP_ACTIVATE_VC_REQUEST CoMiniportActivateVc;
3207+ RCONDIS_MP_DEACTIVATE_VC_REQUEST CoMiniportDeactivateVc;
3208+ RCONDIS_MP_CREATE_VC_COMPLETE CoMiniportCreateVcComplete;
3209+ RCONDIS_MP_DELETE_VC_COMPLETE CoMiniportDeleteVcComplete;
3210+ RCONDIS_MP_ACTIVATE_VC_COMPLETE CoMiniportActivateVcComplete;
3211+ RCONDIS_MP_DEACTIVATE_VC_COMPLETE CoMiniportDeactivateVcComplete;
3212+
3213+
3214+} RNDIS_MESSAGE_CONTAINER, *PRNDIS_MESSAGE_CONTAINER;
3215+
3216+//
3217+// Remote NDIS message format
3218+//
3219+typedef __struct_bcount(MessageLength) struct _RNDIS_MESSAGE
3220+{
3221+ UINT32 NdisMessageType;
3222+
3223+ //
3224+ // Total length of this message, from the beginning
3225+ // of the RNDIS_MESSAGE struct, in bytes.
3226+ //
3227+ UINT32 MessageLength;
3228+
3229+ // Actual message
3230+ RNDIS_MESSAGE_CONTAINER Message;
3231+
3232+} RNDIS_MESSAGE, *PRNDIS_MESSAGE;
3233+
3234+
3235+
3236+//
3237+// Handy macros
3238+
3239+// get the size of an RNDIS message. Pass in the message type,
3240+// RNDIS_SET_REQUEST, RNDIS_PACKET for example
3241+#define RNDIS_MESSAGE_SIZE(Message) \
3242+ (sizeof(Message) + (sizeof(RNDIS_MESSAGE) - sizeof(RNDIS_MESSAGE_CONTAINER)))
3243+
3244+// get pointer to info buffer with message pointer
3245+#define MESSAGE_TO_INFO_BUFFER(Message) \
3246+ (((PUCHAR)(Message)) + Message->InformationBufferOffset)
3247+
3248+// get pointer to status buffer with message pointer
3249+#define MESSAGE_TO_STATUS_BUFFER(Message) \
3250+ (((PUCHAR)(Message)) + Message->StatusBufferOffset)
3251+
3252+// get pointer to OOBD buffer with message pointer
3253+#define MESSAGE_TO_OOBD_BUFFER(Message) \
3254+ (((PUCHAR)(Message)) + Message->OOBDataOffset)
3255+
3256+// get pointer to data buffer with message pointer
3257+#define MESSAGE_TO_DATA_BUFFER(Message) \
3258+ (((PUCHAR)(Message)) + Message->PerPacketInfoOffset)
3259+
3260+// get pointer to contained message from NDIS_MESSAGE pointer
3261+#define RNDIS_MESSAGE_PTR_TO_MESSAGE_PTR(RndisMessage) \
3262+ ((PVOID) &RndisMessage->Message)
3263+
3264+// get pointer to contained message from NDIS_MESSAGE pointer
3265+#define RNDIS_MESSAGE_RAW_PTR_TO_MESSAGE_PTR(RndisMessage) \
3266+ ((PVOID) RndisMessage)
3267+
3268+#endif // _RNDIS_H_
3269--- /dev/null
3270+++ b/drivers/staging/hv/include/VmbusChannelInterface.h
3271@@ -0,0 +1,131 @@
3272+/*
3273+ *
3274+ * Copyright (c) 2009, Microsoft Corporation.
3275+ *
3276+ * This program is free software; you can redistribute it and/or modify it
3277+ * under the terms and conditions of the GNU General Public License,
3278+ * version 2, as published by the Free Software Foundation.
3279+ *
3280+ * This program is distributed in the hope it will be useful, but WITHOUT
3281+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3282+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
3283+ * more details.
3284+ *
3285+ * You should have received a copy of the GNU General Public License along with
3286+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
3287+ * Place - Suite 330, Boston, MA 02111-1307 USA.
3288+ *
3289+ * Authors:
3290+ * Haiyang Zhang <haiyangz@microsoft.com>
3291+ * Hank Janssen <hjanssen@microsoft.com>
3292+ *
3293+ */
3294+
3295+
3296+#pragma once
3297+// allow nameless unions
3298+//#pragma warning(disable : 4201)
3299+
3300+//
3301+// A revision number of vmbus that is used for ensuring both ends on a
3302+// partition are using compatible versions.
3303+//
3304+#define VMBUS_REVISION_NUMBER 13
3305+
3306+//
3307+// Make maximum size of pipe payload of 16K
3308+//
3309+#define MAX_PIPE_DATA_PAYLOAD (sizeof(BYTE) * 16384)
3310+
3311+//
3312+// Define PipeMode values.
3313+//
3314+#define VMBUS_PIPE_TYPE_BYTE 0x00000000
3315+#define VMBUS_PIPE_TYPE_MESSAGE 0x00000004
3316+
3317+//
3318+// The size of the user defined data buffer for non-pipe offers.
3319+//
3320+#define MAX_USER_DEFINED_BYTES 120
3321+
3322+//
3323+// The size of the user defined data buffer for pipe offers.
3324+//
3325+#define MAX_PIPE_USER_DEFINED_BYTES 116
3326+
3327+
3328+//
3329+// At the center of the Channel Management library is
3330+// the Channel Offer. This struct contains the
3331+// fundamental information about an offer.
3332+//
3333+#pragma pack(push,1)
3334+
3335+typedef struct
3336+{
3337+
3338+ GUID InterfaceType;
3339+ GUID InterfaceInstance;
3340+ UINT64 InterruptLatencyIn100nsUnits;
3341+ UINT32 InterfaceRevision;
3342+ UINT32 ServerContextAreaSize; // in bytes
3343+ UINT16 ChannelFlags;
3344+ UINT16 MmioMegabytes; // in bytes * 1024 * 1024
3345+
3346+ union
3347+ {
3348+ //
3349+ // Non-pipes: The user has MAX_USER_DEFINED_BYTES bytes.
3350+ //
3351+ struct
3352+ {
3353+ UCHAR UserDefined[MAX_USER_DEFINED_BYTES];
3354+ } Standard;
3355+
3356+ //
3357+ // Pipes: The following sructure is an integrated pipe protocol, which
3358+ // is implemented on top of standard user-defined data. Pipe clients
3359+ // have MAX_PIPE_USER_DEFINED_BYTES left for their own use.
3360+ //
3361+ struct
3362+ {
3363+ UINT32 PipeMode;
3364+ UCHAR UserDefined[MAX_PIPE_USER_DEFINED_BYTES];
3365+ } Pipe;
3366+ } u;
3367+ UINT32 Padding;
3368+} VMBUS_CHANNEL_OFFER, *PVMBUS_CHANNEL_OFFER;
3369+#pragma pack(pop)
3370+
3371+
3372+//
3373+// Verify the MAX_PIPE_USER_DEFINED_BYTES value.
3374+//
3375+//C_ASSERT(MAX_PIPE_USER_DEFINED_BYTES ==
3376+// MAX_USER_DEFINED_BYTES -
3377+// (FIELD_OFFSET(VMBUS_CHANNEL_OFFER, u.Pipe.UserDefined) -
3378+// FIELD_OFFSET(VMBUS_CHANNEL_OFFER, u.Standard.UserDefined)));
3379+//
3380+
3381+typedef UINT32 GPADL_HANDLE;
3382+
3383+//
3384+// Server Flags
3385+//
3386+
3387+#define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE 1
3388+#define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES 2
3389+#define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS 4
3390+#define VMBUS_CHANNEL_NAMED_PIPE_MODE 0x10
3391+#define VMBUS_CHANNEL_LOOPBACK_OFFER 0x100
3392+#define VMBUS_CHANNEL_PARENT_OFFER 0x200
3393+#define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION 0x400
3394+
3395+//
3396+// TEMPTEMP -- move this next define to devioctl.h some day
3397+//
3398+
3399+#ifndef FILE_DEVICE_VMBUS
3400+#define FILE_DEVICE_VMBUS 0x0000003E
3401+#endif
3402+
3403--- /dev/null
3404+++ b/drivers/staging/hv/include/VmbusPacketFormat.h
3405@@ -0,0 +1,322 @@
3406+/*
3407+ *
3408+ * Copyright (c) 2009, Microsoft Corporation.
3409+ *
3410+ * This program is free software; you can redistribute it and/or modify it
3411+ * under the terms and conditions of the GNU General Public License,
3412+ * version 2, as published by the Free Software Foundation.
3413+ *
3414+ * This program is distributed in the hope it will be useful, but WITHOUT
3415+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3416+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
3417+ * more details.
3418+ *
3419+ * You should have received a copy of the GNU General Public License along with
3420+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
3421+ * Place - Suite 330, Boston, MA 02111-1307 USA.
3422+ *
3423+ * Authors:
3424+ * Haiyang Zhang <haiyangz@microsoft.com>
3425+ * Hank Janssen <hjanssen@microsoft.com>
3426+ *
3427+ */
3428+
3429+
3430+#pragma once
3431+
3432+//#ifndef PAGE_SIZE
3433+//#if defined(_IA64_)
3434+//#error This does not work for IA64
3435+//#else
3436+//#define PAGE_SIZE 0x1000
3437+//#endif
3438+//#endif
3439+
3440+// allow nameless unions
3441+//#pragma warning(disable : 4201)
3442+
3443+typedef struct
3444+{
3445+ union
3446+ {
3447+ struct
3448+ {
3449+ volatile UINT32 In; // Offset in bytes from the ring base
3450+ volatile UINT32 Out; // Offset in bytes from the ring base
3451+ };
3452+ volatile LONGLONG InOut;
3453+ };
3454+
3455+ //
3456+ // If the receiving endpoint sets this to some non-zero value, the sending
3457+ // endpoint should not send any interrupts.
3458+ //
3459+
3460+ volatile UINT32 InterruptMask;
3461+
3462+} VMRCB, *PVMRCB;
3463+
3464+typedef struct
3465+{
3466+ union
3467+ {
3468+ struct
3469+ {
3470+ VMRCB Control;
3471+ };
3472+
3473+ UINT8 Reserved[PAGE_SIZE];
3474+ };
3475+
3476+ //
3477+ // Beginning of the ring data. Note: It must be guaranteed that
3478+ // this data does not share a page with the control structure.
3479+ //
3480+ UINT8 Data[1];
3481+} VMRING, *PVMRING;
3482+
3483+#pragma pack(push, 1)
3484+
3485+typedef struct
3486+{
3487+ UINT16 Type;
3488+ UINT16 DataOffset8;
3489+ UINT16 Length8;
3490+ UINT16 Flags;
3491+ UINT64 TransactionId;
3492+} VMPACKET_DESCRIPTOR, *PVMPACKET_DESCRIPTOR;
3493+
3494+typedef UINT32 PREVIOUS_PACKET_OFFSET, *PPREVIOUS_PACKET_OFFSET;
3495+
3496+typedef struct
3497+{
3498+ PREVIOUS_PACKET_OFFSET PreviousPacketStartOffset;
3499+ VMPACKET_DESCRIPTOR Descriptor;
3500+} VMPACKET_HEADER, *PVMPACKET_HEADER;
3501+
3502+typedef struct
3503+{
3504+ UINT32 ByteCount;
3505+ UINT32 ByteOffset;
3506+} VMTRANSFER_PAGE_RANGE, *PVMTRANSFER_PAGE_RANGE;
3507+
3508+#ifdef __cplusplus
3509+
3510+typedef struct _VMTRANSFER_PAGE_PACKET_HEADER : VMPACKET_DESCRIPTOR {
3511+
3512+#else
3513+
3514+typedef struct VMTRANSFER_PAGE_PACKET_HEADER {
3515+
3516+ VMPACKET_DESCRIPTOR d;
3517+
3518+#endif
3519+
3520+ UINT16 TransferPageSetId;
3521+ BOOLEAN SenderOwnsSet;
3522+ UINT8 Reserved;
3523+ UINT32 RangeCount;
3524+ VMTRANSFER_PAGE_RANGE Ranges[1];
3525+
3526+} VMTRANSFER_PAGE_PACKET_HEADER, *PVMTRANSFER_PAGE_PACKET_HEADER;
3527+
3528+
3529+#ifdef __cplusplus
3530+
3531+typedef struct _VMGPADL_PACKET_HEADER : VMPACKET_DESCRIPTOR {
3532+
3533+#else
3534+
3535+typedef struct _VMGPADL_PACKET_HEADER {
3536+
3537+ VMPACKET_DESCRIPTOR d;
3538+
3539+#endif
3540+
3541+
3542+ UINT32 Gpadl;
3543+ UINT32 Reserved;
3544+
3545+} VMGPADL_PACKET_HEADER, *PVMGPADL_PACKET_HEADER;
3546+
3547+#ifdef __cplusplus
3548+
3549+typedef struct _VMADD_REMOVE_TRANSFER_PAGE_SET : VMPACKET_DESCRIPTOR {
3550+
3551+#else
3552+
3553+typedef struct _VMADD_REMOVE_TRANSFER_PAGE_SET {
3554+
3555+ VMPACKET_DESCRIPTOR d;
3556+
3557+#endif
3558+
3559+ UINT32 Gpadl;
3560+ UINT16 TransferPageSetId;
3561+ UINT16 Reserved;
3562+
3563+} VMADD_REMOVE_TRANSFER_PAGE_SET, *PVMADD_REMOVE_TRANSFER_PAGE_SET;
3564+
3565+#pragma pack(pop)
3566+
3567+//
3568+// This structure defines a range in guest physical space that can be made
3569+// to look virtually contiguous.
3570+//
3571+
3572+typedef struct _GPA_RANGE {
3573+
3574+ UINT32 ByteCount;
3575+ UINT32 ByteOffset;
3576+ UINT64 PfnArray[0];
3577+
3578+} GPA_RANGE, *PGPA_RANGE;
3579+
3580+
3581+
3582+#pragma pack(push, 1)
3583+
3584+//
3585+// This is the format for an Establish Gpadl packet, which contains a handle
3586+// by which this GPADL will be known and a set of GPA ranges associated with
3587+// it. This can be converted to a MDL by the guest OS. If there are multiple
3588+// GPA ranges, then the resulting MDL will be "chained," representing multiple
3589+// VA ranges.
3590+//
3591+
3592+#ifdef __cplusplus
3593+
3594+typedef struct _VMESTABLISH_GPADL : VMPACKET_DESCRIPTOR {
3595+
3596+#else
3597+
3598+typedef struct _VMESTABLISH_GPADL {
3599+
3600+ VMPACKET_DESCRIPTOR d;
3601+
3602+#endif
3603+
3604+ UINT32 Gpadl;
3605+ UINT32 RangeCount;
3606+ GPA_RANGE Range[1];
3607+
3608+} VMESTABLISH_GPADL, *PVMESTABLISH_GPADL;
3609+
3610+
3611+//
3612+// This is the format for a Teardown Gpadl packet, which indicates that the
3613+// GPADL handle in the Establish Gpadl packet will never be referenced again.
3614+//
3615+
3616+#ifdef __cplusplus
3617+
3618+typedef struct _VMTEARDOWN_GPADL : VMPACKET_DESCRIPTOR {
3619+
3620+#else
3621+
3622+typedef struct _VMTEARDOWN_GPADL {
3623+
3624+ VMPACKET_DESCRIPTOR d;
3625+
3626+#endif
3627+
3628+ UINT32 Gpadl;
3629+ UINT32 Reserved; // for alignment to a 8-byte boundary
3630+} VMTEARDOWN_GPADL, *PVMTEARDOWN_GPADL;
3631+
3632+
3633+//
3634+// This is the format for a GPA-Direct packet, which contains a set of GPA
3635+// ranges, in addition to commands and/or data.
3636+//
3637+
3638+#ifdef __cplusplus
3639+
3640+typedef struct _VMDATA_GPA_DIRECT : VMPACKET_DESCRIPTOR {
3641+
3642+#else
3643+
3644+typedef struct _VMDATA_GPA_DIRECT {
3645+
3646+ VMPACKET_DESCRIPTOR d;
3647+
3648+#endif
3649+
3650+ UINT32 Reserved;
3651+ UINT32 RangeCount;
3652+ GPA_RANGE Range[1];
3653+
3654+} VMDATA_GPA_DIRECT, *PVMDATA_GPA_DIRECT;
3655+
3656+
3657+
3658+//
3659+// This is the format for a Additional Data Packet.
3660+//
3661+
3662+#ifdef __cplusplus
3663+
3664+typedef struct _VMADDITIONAL_DATA : VMPACKET_DESCRIPTOR {
3665+
3666+#else
3667+
3668+typedef struct _VMADDITIONAL_DATA {
3669+
3670+ VMPACKET_DESCRIPTOR d;
3671+
3672+#endif
3673+
3674+ UINT64 TotalBytes;
3675+ UINT32 ByteOffset;
3676+ UINT32 ByteCount;
3677+ UCHAR Data[1];
3678+
3679+} VMADDITIONAL_DATA, *PVMADDITIONAL_DATA;
3680+
3681+
3682+#pragma pack(pop)
3683+
3684+typedef union {
3685+ VMPACKET_DESCRIPTOR SimpleHeader;
3686+ VMTRANSFER_PAGE_PACKET_HEADER TransferPageHeader;
3687+ VMGPADL_PACKET_HEADER GpadlHeader;
3688+ VMADD_REMOVE_TRANSFER_PAGE_SET AddRemoveTransferPageHeader;
3689+ VMESTABLISH_GPADL EstablishGpadlHeader;
3690+ VMTEARDOWN_GPADL TeardownGpadlHeader;
3691+ VMDATA_GPA_DIRECT DataGpaDirectHeader;
3692+} VMPACKET_LARGEST_POSSIBLE_HEADER, *PVMPACKET_LARGEST_POSSIBLE_HEADER;
3693+
3694+#define VMPACKET_DATA_START_ADDRESS(__packet) \
3695+ (PVOID)(((PUCHAR)__packet) + ((PVMPACKET_DESCRIPTOR)__packet)->DataOffset8 * 8)
3696+
3697+#define VMPACKET_DATA_LENGTH(__packet) \
3698+ ((((PVMPACKET_DESCRIPTOR)__packet)->Length8 - ((PVMPACKET_DESCRIPTOR)__packet)->DataOffset8) * 8)
3699+
3700+#define VMPACKET_TRANSFER_MODE(__packet) ((PVMPACKET_DESCRIPTOR)__packet)->Type
3701+
3702+typedef enum {
3703+ VmbusServerEndpoint = 0,
3704+ VmbusClientEndpoint,
3705+ VmbusEndpointMaximum
3706+} ENDPOINT_TYPE, *PENDPOINT_TYPE;
3707+
3708+typedef enum {
3709+ VmbusPacketTypeInvalid = 0x0,
3710+ VmbusPacketTypeSynch = 0x1,
3711+ VmbusPacketTypeAddTransferPageSet = 0x2,
3712+ VmbusPacketTypeRemoveTransferPageSet = 0x3,
3713+ VmbusPacketTypeEstablishGpadl = 0x4,
3714+ VmbusPacketTypeTearDownGpadl = 0x5,
3715+ VmbusPacketTypeDataInBand = 0x6,
3716+ VmbusPacketTypeDataUsingTransferPages = 0x7,
3717+ VmbusPacketTypeDataUsingGpadl = 0x8,
3718+ VmbusPacketTypeDataUsingGpaDirect = 0x9,
3719+ VmbusPacketTypeCancelRequest = 0xa,
3720+ VmbusPacketTypeCompletion = 0xb,
3721+ VmbusPacketTypeDataUsingAdditionalPackets = 0xc,
3722+ VmbusPacketTypeAdditionalData = 0xd
3723+} VMBUS_PACKET_TYPE, *PVMBUS_PACKET_TYPE;
3724+
3725+#define VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED 1
3726+
3727+
3728--- /dev/null
3729+++ b/drivers/staging/hv/include/vstorage.h
3730@@ -0,0 +1,309 @@
3731+/*
3732+ *
3733+ * Copyright (c) 2009, Microsoft Corporation.
3734+ *
3735+ * This program is free software; you can redistribute it and/or modify it
3736+ * under the terms and conditions of the GNU General Public License,
3737+ * version 2, as published by the Free Software Foundation.
3738+ *
3739+ * This program is distributed in the hope it will be useful, but WITHOUT
3740+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3741+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
3742+ * more details.
3743+ *
3744+ * You should have received a copy of the GNU General Public License along with
3745+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
3746+ * Place - Suite 330, Boston, MA 02111-1307 USA.
3747+ *
3748+ * Authors:
3749+ * Haiyang Zhang <haiyangz@microsoft.com>
3750+ * Hank Janssen <hjanssen@microsoft.com>
3751+ *
3752+ */
3753+
3754+
3755+#pragma once
3756+
3757+//#include <vmbuspacketformat.h>
3758+//#include <ntddscsi.h>
3759+
3760+#define C_ASSERT(x)
3761+//
3762+// public interface to the server
3763+//
3764+
3765+//
3766+// Storvsp device interface guid
3767+//
3768+
3769+
3770+//
3771+// Protocol versions.
3772+//
3773+
3774+//
3775+// vstorage.w revision number. This is used in the case of a version match,
3776+// to alert the user that structure sizes may be mismatched even though the
3777+// protocol versions match.
3778+//
3779+
3780+#define REVISION_STRING(REVISION_) #REVISION_
3781+#define FILL_VMSTOR_REVISION(RESULT_LVALUE_) \
3782+{ \
3783+ char *revisionString = REVISION_STRING($Revision: 6 $) + 11; \
3784+ RESULT_LVALUE_ = 0; \
3785+ while (*revisionString >= '0' && *revisionString <= '9') \
3786+ { \
3787+ RESULT_LVALUE_ *= 10; \
3788+ RESULT_LVALUE_ += *revisionString - '0'; \
3789+ revisionString++; \
3790+ } \
3791+}
3792+
3793+//
3794+// Major/minor macros. Minor version is in LSB, meaning that earlier flat
3795+// version numbers will be interpreted as "0.x" (i.e., 1 becomes 0.1).
3796+//
3797+
3798+#define VMSTOR_PROTOCOL_MAJOR(VERSION_) (((VERSION_) >> 8) & 0xff)
3799+#define VMSTOR_PROTOCOL_MINOR(VERSION_) (((VERSION_) ) & 0xff)
3800+#define VMSTOR_PROTOCOL_VERSION(MAJOR_, MINOR_) ((((MAJOR_) & 0xff) << 8) | \
3801+ (((MINOR_) & 0xff) ))
3802+
3803+//
3804+// Invalid version.
3805+//
3806+
3807+#define VMSTOR_INVALID_PROTOCOL_VERSION -1
3808+
3809+//
3810+// Version history:
3811+// V1 Beta 0.1
3812+// V1 RC < 2008/1/31 1.0
3813+// V1 RC > 2008/1/31 2.0
3814+//
3815+#define VMSTOR_PROTOCOL_VERSION_CURRENT VMSTOR_PROTOCOL_VERSION(2, 0)
3816+
3817+
3818+//
3819+// This will get replaced with the max transfer length that is possible on
3820+// the host adapter.
3821+// The max transfer length will be published when we offer a vmbus channel.
3822+//
3823+
3824+#define MAX_TRANSFER_LENGTH 0x40000
3825+#define DEFAULT_PACKET_SIZE (sizeof(VMDATA_GPA_DIRECT) + \
3826+ sizeof(VSTOR_PACKET) + \
3827+ (sizeof(UINT64) * (MAX_TRANSFER_LENGTH / PAGE_SIZE)))
3828+
3829+
3830+
3831+//
3832+// Packet structure describing virtual storage requests.
3833+//
3834+
3835+typedef enum
3836+{
3837+ VStorOperationCompleteIo = 1,
3838+ VStorOperationRemoveDevice = 2,
3839+ VStorOperationExecuteSRB = 3,
3840+ VStorOperationResetLun = 4,
3841+ VStorOperationResetAdapter = 5,
3842+ VStorOperationResetBus = 6,
3843+ VStorOperationBeginInitialization = 7,
3844+ VStorOperationEndInitialization = 8,
3845+ VStorOperationQueryProtocolVersion = 9,
3846+ VStorOperationQueryProperties = 10,
3847+ VStorOperationMaximum = 10
3848+
3849+} VSTOR_PACKET_OPERATION;
3850+
3851+
3852+//
3853+// Platform neutral description of a scsi request -
3854+// this remains the same across the write regardless of 32/64 bit
3855+// note: it's patterned off the SCSI_PASS_THROUGH structure
3856+//
3857+
3858+
3859+#pragma pack(push,1)
3860+
3861+
3862+#define CDB16GENERIC_LENGTH 0x10
3863+
3864+#ifndef SENSE_BUFFER_SIZE
3865+#define SENSE_BUFFER_SIZE 0x12
3866+#endif
3867+C_ASSERT(SENSE_BUFFER_SIZE == 0x12);
3868+
3869+#define MAX_DATA_BUFFER_LENGTH_WITH_PADDING 0x14
3870+
3871+
3872+typedef struct
3873+{
3874+ USHORT Length;
3875+ UCHAR SrbStatus;
3876+ UCHAR ScsiStatus;
3877+
3878+ UCHAR PortNumber;
3879+ UCHAR PathId;
3880+ UCHAR TargetId;
3881+ UCHAR Lun;
3882+
3883+ UCHAR CdbLength;
3884+ UCHAR SenseInfoLength;
3885+ UCHAR DataIn;
3886+ UCHAR Reserved;
3887+
3888+ ULONG DataTransferLength;
3889+
3890+ union
3891+ {
3892+ UCHAR Cdb[CDB16GENERIC_LENGTH];
3893+
3894+ UCHAR SenseData[SENSE_BUFFER_SIZE];
3895+
3896+ UCHAR ReservedArray[MAX_DATA_BUFFER_LENGTH_WITH_PADDING];
3897+ };
3898+
3899+} VMSCSI_REQUEST, *PVMSCSI_REQUEST;
3900+
3901+C_ASSERT((sizeof(VMSCSI_REQUEST) % 4) == 0);
3902+
3903+
3904+//
3905+// This structure is sent during the intialization phase to get the different
3906+// properties of the channel.
3907+//
3908+
3909+typedef struct
3910+{
3911+ USHORT ProtocolVersion;
3912+ UCHAR PathId;
3913+ UCHAR TargetId;
3914+
3915+ //
3916+ // Note: port number is only really known on the client side
3917+ //
3918+ ULONG PortNumber;
3919+
3920+ ULONG Flags;
3921+
3922+ ULONG MaxTransferBytes;
3923+
3924+ //
3925+ // This id is unique for each channel and will correspond with
3926+ // vendor specific data in the inquirydata
3927+ //
3928+
3929+ ULONGLONG UniqueId;
3930+
3931+} VMSTORAGE_CHANNEL_PROPERTIES, *PVMSTORAGE_CHANNEL_PROPERTIES;
3932+
3933+C_ASSERT((sizeof(VMSTORAGE_CHANNEL_PROPERTIES) % 4) == 0);
3934+
3935+
3936+//
3937+// This structure is sent during the storage protocol negotiations.
3938+//
3939+
3940+typedef struct
3941+{
3942+ //
3943+ // Major (MSW) and minor (LSW) version numbers.
3944+ //
3945+
3946+ USHORT MajorMinor;
3947+
3948+
3949+ //
3950+ // Revision number is auto-incremented whenever this file is changed
3951+ // (See FILL_VMSTOR_REVISION macro above). Mismatch does not definitely
3952+ // indicate incompatibility--but it does indicate mismatched builds.
3953+ //
3954+
3955+ USHORT Revision;
3956+
3957+} VMSTORAGE_PROTOCOL_VERSION, *PVMSTORAGE_PROTOCOL_VERSION;
3958+
3959+C_ASSERT((sizeof(VMSTORAGE_PROTOCOL_VERSION) % 4) == 0);
3960+
3961+
3962+//
3963+// Channel Property Flags
3964+//
3965+
3966+#define STORAGE_CHANNEL_REMOVABLE_FLAG 0x1
3967+#define STORAGE_CHANNEL_EMULATED_IDE_FLAG 0x2
3968+
3969+
3970+typedef struct _VSTOR_PACKET
3971+{
3972+ //
3973+ // Requested operation type
3974+ //
3975+
3976+ VSTOR_PACKET_OPERATION Operation;
3977+
3978+ //
3979+ // Flags - see below for values
3980+ //
3981+
3982+ ULONG Flags;
3983+
3984+ //
3985+ // Status of the request returned from the server side.
3986+ //
3987+
3988+ ULONG Status;
3989+
3990+ //
3991+ // Data payload area
3992+ //
3993+
3994+ union
3995+ {
3996+ //
3997+ // Structure used to forward SCSI commands from the client to the server.
3998+ //
3999+
4000+ VMSCSI_REQUEST VmSrb;
4001+
4002+ //
4003+ // Structure used to query channel properties.
4004+ //
4005+
4006+ VMSTORAGE_CHANNEL_PROPERTIES StorageChannelProperties;
4007+
4008+ //
4009+ // Used during version negotiations.
4010+ //
4011+
4012+ VMSTORAGE_PROTOCOL_VERSION Version;
4013+ };
4014+
4015+} VSTOR_PACKET, *PVSTOR_PACKET;
4016+
4017+C_ASSERT((sizeof(VSTOR_PACKET) % 4) == 0);
4018+
4019+//
4020+// Packet flags
4021+//
4022+
4023+//
4024+// This flag indicates that the server should send back a completion for this
4025+// packet.
4026+//
4027+
4028+#define REQUEST_COMPLETION_FLAG 0x1
4029+
4030+//
4031+// This is the set of flags that the vsc can set in any packets it sends
4032+//
4033+
4034+#define VSC_LEGAL_FLAGS (REQUEST_COMPLETION_FLAG)
4035+
4036+
4037+#pragma pack(pop)
4038+
4039+