]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.drivers/staging-hv-add-the-hyper-v-api-header-files.patch
Reenabled linux-xen, added patches for Xen Kernel Version 2.6.27.31,
[people/teissler/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.drivers / staging-hv-add-the-hyper-v-api-header-files.patch
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/staging-hv-add-the-hyper-v-api-header-files.patch b/src/patches/suse-2.6.27.31/patches.drivers/staging-hv-add-the-hyper-v-api-header-files.patch
new file mode 100644 (file)
index 0000000..e0581bb
--- /dev/null
@@ -0,0 +1,4039 @@
+From 50626ba62379de1e1c92abe1e630138bfd096fd0 Mon Sep 17 00:00:00 2001
+From: Hank Janssen <hjanssen@microsoft.com>
+Date: Mon, 13 Jul 2009 15:15:47 -0700
+Subject: Staging: hv: add the Hyper-V api header files
+
+From: Hank Janssen <hjanssen@microsoft.com>
+
+These are the header files for the API to talk to the Hyper-V
+core.
+
+Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
+Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+---
+ drivers/staging/hv/include/ChannelMessages.h       |  312 +++++++
+ drivers/staging/hv/include/HvHalApi.h              |   32 
+ drivers/staging/hv/include/HvHcApi.h               |   60 +
+ drivers/staging/hv/include/HvPtApi.h               |   86 ++
+ drivers/staging/hv/include/HvStatus.h              |  718 ++++++++++++++++++
+ drivers/staging/hv/include/HvSynicApi.h            |  490 ++++++++++++
+ drivers/staging/hv/include/HvTypes.h               |   31 
+ drivers/staging/hv/include/HvVpApi.h               |   51 +
+ drivers/staging/hv/include/List.h                  |  269 ++++++
+ drivers/staging/hv/include/VmbusChannelInterface.h |  131 +++
+ drivers/staging/hv/include/VmbusPacketFormat.h     |  322 ++++++++
+ drivers/staging/hv/include/nvspprotocol.h          |  306 +++++++
+ drivers/staging/hv/include/rndis.h                 |  836 +++++++++++++++++++++
+ drivers/staging/hv/include/vstorage.h              |  309 +++++++
+ 14 files changed, 3953 insertions(+)
+ create mode 100644 drivers/staging/hv/include/ChannelMessages.h
+ create mode 100644 drivers/staging/hv/include/HvHalApi.h
+ create mode 100644 drivers/staging/hv/include/HvHcApi.h
+ create mode 100644 drivers/staging/hv/include/HvPtApi.h
+ create mode 100644 drivers/staging/hv/include/HvStatus.h
+ create mode 100644 drivers/staging/hv/include/HvSynicApi.h
+ create mode 100644 drivers/staging/hv/include/HvTypes.h
+ create mode 100644 drivers/staging/hv/include/HvVpApi.h
+ create mode 100644 drivers/staging/hv/include/List.h
+ create mode 100644 drivers/staging/hv/include/VmbusChannelInterface.h
+ create mode 100644 drivers/staging/hv/include/VmbusPacketFormat.h
+ create mode 100644 drivers/staging/hv/include/nvspprotocol.h
+ create mode 100644 drivers/staging/hv/include/rndis.h
+ create mode 100644 drivers/staging/hv/include/vstorage.h
+
+--- /dev/null
++++ b/drivers/staging/hv/include/ChannelMessages.h
+@@ -0,0 +1,312 @@
++/*
++ *
++ * Copyright (c) 2009, Microsoft Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Authors:
++ *   Haiyang Zhang <haiyangz@microsoft.com>
++ *   Hank Janssen  <hjanssen@microsoft.com>
++ *
++ */
++
++
++#pragma once
++
++#include <VmbusPacketFormat.h>
++
++#define C_ASSERT(x)
++typedef UINT32 NTSTATUS;
++
++#pragma pack(push,1)
++
++//
++// Version 1 messages
++//
++
++typedef enum _VMBUS_CHANNEL_MESSAGE_TYPE
++{
++    ChannelMessageInvalid                   =  0,
++    ChannelMessageOfferChannel              =  1,
++    ChannelMessageRescindChannelOffer       =  2,
++    ChannelMessageRequestOffers             =  3,
++    ChannelMessageAllOffersDelivered        =  4,
++    ChannelMessageOpenChannel               =  5,
++    ChannelMessageOpenChannelResult         =  6,
++    ChannelMessageCloseChannel              =  7,
++    ChannelMessageGpadlHeader               =  8,
++    ChannelMessageGpadlBody                 =  9,
++    ChannelMessageGpadlCreated              = 10,
++    ChannelMessageGpadlTeardown             = 11,
++    ChannelMessageGpadlTorndown             = 12,
++    ChannelMessageRelIdReleased             = 13,
++    ChannelMessageInitiateContact           = 14,
++    ChannelMessageVersionResponse           = 15,
++    ChannelMessageUnload                    = 16,
++#ifdef VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD
++    ChannelMessageViewRangeAdd              = 17,
++    ChannelMessageViewRangeRemove           = 18,
++#endif
++    ChannelMessageCount
++} VMBUS_CHANNEL_MESSAGE_TYPE, *PVMBUS_CHANNEL_MESSAGE_TYPE;
++
++// begin_wpp config
++// CUSTOM_TYPE(ChannelMessageType, ItemEnum(_VMBUS_CHANNEL_MESSAGE_TYPE));
++// end_wpp
++
++typedef struct _VMBUS_CHANNEL_MESSAGE_HEADER
++{
++    VMBUS_CHANNEL_MESSAGE_TYPE  MessageType;
++    UINT32                      Padding;
++} VMBUS_CHANNEL_MESSAGE_HEADER, *PVMBUS_CHANNEL_MESSAGE_HEADER;
++
++// Query VMBus Version parameters
++typedef struct _VMBUS_CHANNEL_QUERY_VMBUS_VERSION
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    UINT32 Version;
++} VMBUS_CHANNEL_QUERY_VMBUS_VERSION, *PVMBUS_CHANNEL_QUERY_VMBUS_VERSION;
++
++// VMBus Version Supported parameters
++typedef struct _VMBUS_CHANNEL_VERSION_SUPPORTED
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    BOOLEAN VersionSupported;
++} VMBUS_CHANNEL_VERSION_SUPPORTED, *PVMBUS_CHANNEL_VERSION_SUPPORTED;
++
++// Offer Channel parameters
++typedef struct _VMBUS_CHANNEL_OFFER_CHANNEL
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    VMBUS_CHANNEL_OFFER Offer;
++    UINT32  ChildRelId;
++    UINT8   MonitorId;
++    BOOLEAN MonitorAllocated;
++} VMBUS_CHANNEL_OFFER_CHANNEL, *PVMBUS_CHANNEL_OFFER_CHANNEL;
++
++//
++// Make sure VMBUS_CHANNEL_OFFER_CHANNEL fits into Synic message.
++//
++C_ASSERT(sizeof(VMBUS_CHANNEL_OFFER_CHANNEL) <= MAXIMUM_SYNIC_MESSAGE_BYTES);
++
++// Rescind Offer parameters
++typedef struct _VMBUS_CHANNEL_RESCIND_OFFER
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    UINT32          ChildRelId;
++} VMBUS_CHANNEL_RESCIND_OFFER, *PVMBUS_CHANNEL_RESCIND_OFFER;
++
++// Request Offer -- no parameters, SynIC message contains the partition ID
++// Set Snoop -- no parameters, SynIC message contains the partition ID
++// Clear Snoop -- no parameters, SynIC message contains the partition ID
++// All Offers Delivered -- no parameters, SynIC message contains the partition ID
++// Flush Client -- no parameters, SynIC message contains the partition ID
++
++// Open Channel parameters
++typedef struct _VMBUS_CHANNEL_OPEN_CHANNEL
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++
++    //
++    // Identifies the specific VMBus channel that is being opened.
++    //
++    UINT32          ChildRelId;
++
++    //
++    // ID making a particular open request at a channel offer unique.
++    //
++    UINT32          OpenId;
++
++    //
++    // GPADL for the channel's ring buffer.
++    //
++    GPADL_HANDLE    RingBufferGpadlHandle;
++
++    //
++    // GPADL for the channel's server context save area.
++    //
++    GPADL_HANDLE    ServerContextAreaGpadlHandle;
++
++    //
++    // The upstream ring buffer begins at offset zero in the memory described
++    // by RingBufferGpadlHandle. The downstream ring buffer follows it at this
++    // offset (in pages).
++    //
++    UINT32          DownstreamRingBufferPageOffset;
++
++    //
++    // User-specific data to be passed along to the server endpoint.
++    //
++    UCHAR           UserData[MAX_USER_DEFINED_BYTES];
++
++} VMBUS_CHANNEL_OPEN_CHANNEL, *PVMBUS_CHANNEL_OPEN_CHANNEL;
++
++// Reopen Channel parameters;
++typedef VMBUS_CHANNEL_OPEN_CHANNEL VMBUS_CHANNEL_REOPEN_CHANNEL, *PVMBUS_CHANNEL_REOPEN_CHANNEL;
++
++// Open Channel Result parameters
++typedef struct _VMBUS_CHANNEL_OPEN_RESULT
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    UINT32      ChildRelId;
++    UINT32      OpenId;
++    NTSTATUS    Status;
++} VMBUS_CHANNEL_OPEN_RESULT, *PVMBUS_CHANNEL_OPEN_RESULT;
++
++// Close channel parameters;
++typedef struct _VMBUS_CHANNEL_CLOSE_CHANNEL
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    UINT32      ChildRelId;
++} VMBUS_CHANNEL_CLOSE_CHANNEL, *PVMBUS_CHANNEL_CLOSE_CHANNEL;
++
++// Channel Message GPADL
++#define GPADL_TYPE_RING_BUFFER          1
++#define GPADL_TYPE_SERVER_SAVE_AREA     2
++#define GPADL_TYPE_TRANSACTION          8
++
++//
++// The number of PFNs in a GPADL message is defined by the number of pages
++// that would be spanned by ByteCount and ByteOffset.  If the implied number
++// of PFNs won't fit in this packet, there will be a follow-up packet that
++// contains more.
++//
++
++typedef struct _VMBUS_CHANNEL_GPADL_HEADER
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    UINT32      ChildRelId;
++    UINT32      Gpadl;
++    UINT16      RangeBufLen;
++    UINT16      RangeCount;
++    GPA_RANGE   Range[0];
++} VMBUS_CHANNEL_GPADL_HEADER, *PVMBUS_CHANNEL_GPADL_HEADER;
++
++
++//
++// This is the followup packet that contains more PFNs.
++//
++
++typedef struct _VMBUS_CHANNEL_GPADL_BODY
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    UINT32              MessageNumber;
++    UINT32              Gpadl;
++    UINT64              Pfn[0];
++} VMBUS_CHANNEL_GPADL_BODY, *PVMBUS_CHANNEL_GPADL_BODY;
++
++
++typedef struct _VMBUS_CHANNEL_GPADL_CREATED
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    UINT32              ChildRelId;
++    UINT32              Gpadl;
++    UINT32              CreationStatus;
++} VMBUS_CHANNEL_GPADL_CREATED, *PVMBUS_CHANNEL_GPADL_CREATED;
++
++typedef struct _VMBUS_CHANNEL_GPADL_TEARDOWN
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    UINT32              ChildRelId;
++    UINT32              Gpadl;
++} VMBUS_CHANNEL_GPADL_TEARDOWN, *PVMBUS_CHANNEL_GPADL_TEARDOWN;
++
++typedef struct _VMBUS_CHANNEL_GPADL_TORNDOWN
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    UINT32              Gpadl;
++} VMBUS_CHANNEL_GPADL_TORNDOWN, *PVMBUS_CHANNEL_GPADL_TORNDOWN;
++
++#ifdef VMBUS_FEATURE_PARENT_OR_PEER_MEMORY_MAPPED_INTO_A_CHILD
++typedef struct _VMBUS_CHANNEL_VIEW_RANGE_ADD
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    PHYSICAL_ADDRESS    ViewRangeBase;
++    UINT64              ViewRangeLength;
++    UINT32              ChildRelId;
++} VMBUS_CHANNEL_VIEW_RANGE_ADD, *PVMBUS_CHANNEL_VIEW_RANGE_ADD;
++
++typedef struct _VMBUS_CHANNEL_VIEW_RANGE_REMOVE
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    PHYSICAL_ADDRESS    ViewRangeBase;
++    UINT32              ChildRelId;
++} VMBUS_CHANNEL_VIEW_RANGE_REMOVE, *PVMBUS_CHANNEL_VIEW_RANGE_REMOVE;
++#endif
++
++typedef struct _VMBUS_CHANNEL_RELID_RELEASED
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    UINT32              ChildRelId;
++} VMBUS_CHANNEL_RELID_RELEASED, *PVMBUS_CHANNEL_RELID_RELEASED;
++
++typedef struct _VMBUS_CHANNEL_INITIATE_CONTACT
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    UINT32              VMBusVersionRequested;
++    UINT32              Padding2;
++    UINT64              InterruptPage;
++    UINT64              MonitorPage1;
++    UINT64              MonitorPage2;
++} VMBUS_CHANNEL_INITIATE_CONTACT, *PVMBUS_CHANNEL_INITIATE_CONTACT;
++
++typedef struct _VMBUS_CHANNEL_VERSION_RESPONSE
++{
++    VMBUS_CHANNEL_MESSAGE_HEADER Header;
++    BOOLEAN     VersionSupported;
++} VMBUS_CHANNEL_VERSION_RESPONSE, *PVMBUS_CHANNEL_VERSION_RESPONSE;
++
++typedef VMBUS_CHANNEL_MESSAGE_HEADER VMBUS_CHANNEL_UNLOAD, *PVMBUS_CHANNEL_UNLOAD;
++
++//
++// Kind of a table to use the preprocessor to get us the right type for a
++// specified message ID. Used with ChAllocateSendMessage()
++//
++#define ChannelMessageQueryVmbusVersion_TYPE    VMBUS_CHANNEL_MESSAGE_HEADER
++#define ChannelMessageVmbusVersionSupported_TYPE VMBUS_CHANNEL_VERSION_SUPPORTED
++#define ChannelMessageOfferChannel_TYPE         VMBUS_CHANNEL_OFFER_CHANNEL
++#define ChannelMessageRescindChannelOffer_TYPE  VMBUS_CHANNEL_RESCIND_OFFER
++#define ChannelMessageRequestOffers_TYPE        VMBUS_CHANNEL_MESSAGE_HEADER
++#define ChannelMessageAllOffersDelivered_TYPE   VMBUS_CHANNEL_MESSAGE_HEADER
++#define ChannelMessageOpenChannel_TYPE          VMBUS_CHANNEL_OPEN_CHANNEL
++#define ChannelMessageOpenChannelResult_TYPE    VMBUS_CHANNEL_OPEN_RESULT
++#define ChannelMessageCloseChannel_TYPE         VMBUS_CHANNEL_CLOSE_CHANNEL
++#define ChannelMessageAllGpadlsUnmapped_TYPE    VMBUS_CHANNEL_CLOSE_CHANNEL
++#define ChannelMessageGpadlHeader_TYPE          VMBUS_CHANNEL_GPADL_HEADER
++#define ChannelMessageGpadlBody_TYPE            VMBUS_CHANNEL_GPADL_BODY
++#define ChannelMessageGpadlCreated_TYPE         VMBUS_CHANNEL_GPADL_CREATED
++#define ChannelMessageGpadlTeardown_TYPE        VMBUS_CHANNEL_GPADL_TEARDOWN
++#define ChannelMessageGpadlTorndown_TYPE        VMBUS_CHANNEL_GPADL_TORNDOWN
++#define ChannelMessageViewRangeAdd_TYPE         VMBUS_CHANNEL_VIEW_RANGE_ADD
++#define ChannelMessageViewRangeRemove_TYPE      VMBUS_CHANNEL_VIEW_RANGE_REMOVE
++#define ChannelMessageRelIdReleased_TYPE        VMBUS_CHANNEL_RELID_RELEASED
++#define ChannelMessageInitiateContact_TYPE      VMBUS_CHANNEL_INITIATE_CONTACT
++#define ChannelMessageVersionResponse_TYPE      VMBUS_CHANNEL_VERSION_RESPONSE
++#define ChannelMessageUnload_TYPE               VMBUS_CHANNEL_UNLOAD
++
++//
++// Preprocessor wrapper to ChAllocateSendMessageSize() converting the return
++// value to the correct pointer and calculate the needed size.
++//
++// Argument:
++//
++//  Id - the numberic ID (type VMBUS_CHANNEL_MESSAGE_TYPE) of the message to
++//       send.
++//
++#define ChAllocateSendMessage(Id, Fn, Context)   \
++    (Id##_TYPE*)ChAllocateSendMessageSized(sizeof(Id##_TYPE), Id, Fn, Context)
++
++
++#pragma pack(pop)
++
+--- /dev/null
++++ b/drivers/staging/hv/include/HvHalApi.h
+@@ -0,0 +1,32 @@
++/*
++ *
++ * Copyright (c) 2009, Microsoft Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Authors:
++ *   Haiyang Zhang <haiyangz@microsoft.com>
++ *   Hank Janssen  <hjanssen@microsoft.com>
++ *
++ */
++
++
++#pragma once
++
++
++//
++// Time in the hypervisor is measured in 100 nanosecond units
++//
++typedef UINT64 HV_NANO100_TIME,     *PHV_NANO100_TIME;
++typedef UINT64 HV_NANO100_DURATION, *PHV_NANO100_DURATION;
+--- /dev/null
++++ b/drivers/staging/hv/include/HvHcApi.h
+@@ -0,0 +1,60 @@
++/*
++ *
++ * Copyright (c) 2009, Microsoft Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Authors:
++ *   Haiyang Zhang <haiyangz@microsoft.com>
++ *   Hank Janssen  <hjanssen@microsoft.com>
++ *
++ */
++
++
++#pragma once
++
++//
++// Declare the various hypercall operations.
++//
++typedef enum _HV_CALL_CODE
++{
++
++    HvCallPostMessage                   = 0x005c,
++    HvCallSignalEvent                   = 0x005d,
++
++} HV_CALL_CODE, *PHV_CALL_CODE;
++//
++// Definition of the HvPostMessage hypercall input structure.
++//
++
++typedef struct _HV_INPUT_POST_MESSAGE
++{
++    HV_CONNECTION_ID    ConnectionId;
++    UINT32              Reserved;
++    HV_MESSAGE_TYPE     MessageType;
++    UINT32              PayloadSize;
++    UINT64              Payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT];
++} HV_INPUT_POST_MESSAGE, *PHV_INPUT_POST_MESSAGE;
++
++
++//
++// Definition of the HvSignalEvent hypercall input structure.
++//
++
++typedef struct _HV_INPUT_SIGNAL_EVENT
++{
++    HV_CONNECTION_ID ConnectionId;
++    UINT16           FlagNumber;
++    UINT16           RsvdZ;
++} HV_INPUT_SIGNAL_EVENT, *PHV_INPUT_SIGNAL_EVENT;
+--- /dev/null
++++ b/drivers/staging/hv/include/HvPtApi.h
+@@ -0,0 +1,86 @@
++/*
++ *
++ * Copyright (c) 2009, Microsoft Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Authors:
++ *   Haiyang Zhang <haiyangz@microsoft.com>
++ *   Hank Janssen  <hjanssen@microsoft.com>
++ *
++ */
++
++
++#pragma once
++
++//
++// Versioning definitions used for guests reporting themselves to the
++// hypervisor, and visa versa.
++// ==================================================================
++//
++
++//
++// Version info reported by guest OS's
++//
++typedef enum _HV_GUEST_OS_VENDOR
++{
++    HvGuestOsVendorMicrosoft        = 0x0001
++
++} HV_GUEST_OS_VENDOR, *PHV_GUEST_OS_VENDOR;
++
++typedef enum _HV_GUEST_OS_MICROSOFT_IDS
++{
++    HvGuestOsMicrosoftUndefined     = 0x00,
++    HvGuestOsMicrosoftMSDOS         = 0x01,
++    HvGuestOsMicrosoftWindows3x     = 0x02,
++    HvGuestOsMicrosoftWindows9x     = 0x03,
++    HvGuestOsMicrosoftWindowsNT     = 0x04,
++    HvGuestOsMicrosoftWindowsCE     = 0x05
++
++} HV_GUEST_OS_MICROSOFT_IDS, *PHV_GUEST_OS_MICROSOFT_IDS;
++
++//
++// Declare the MSR used to identify the guest OS.
++//
++#define HV_X64_MSR_GUEST_OS_ID 0x40000000
++
++typedef union _HV_X64_MSR_GUEST_OS_ID_CONTENTS
++{
++    UINT64 AsUINT64;
++    struct
++    {
++        UINT64 BuildNumber    : 16;
++        UINT64 ServiceVersion : 8; // Service Pack, etc.
++        UINT64 MinorVersion   : 8;
++        UINT64 MajorVersion   : 8;
++        UINT64 OsId           : 8; // HV_GUEST_OS_MICROSOFT_IDS (If Vendor=MS)
++        UINT64 VendorId       : 16; // HV_GUEST_OS_VENDOR
++    };
++} HV_X64_MSR_GUEST_OS_ID_CONTENTS, *PHV_X64_MSR_GUEST_OS_ID_CONTENTS;
++
++//
++// Declare the MSR used to setup pages used to communicate with the hypervisor.
++//
++#define HV_X64_MSR_HYPERCALL 0x40000001
++
++typedef union _HV_X64_MSR_HYPERCALL_CONTENTS
++{
++    UINT64 AsUINT64;
++    struct
++    {
++        UINT64 Enable               : 1;
++        UINT64 Reserved             : 11;
++        UINT64 GuestPhysicalAddress : 52;
++    };
++} HV_X64_MSR_HYPERCALL_CONTENTS, *PHV_X64_MSR_HYPERCALL_CONTENTS;
+--- /dev/null
++++ b/drivers/staging/hv/include/HvStatus.h
+@@ -0,0 +1,718 @@
++/*
++ *
++ * Copyright (c) 2009, Microsoft Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Authors:
++ *   Haiyang Zhang <haiyangz@microsoft.com>
++ *   Hank Janssen  <hjanssen@microsoft.com>
++ *
++ */
++
++
++// begin_hvgdk
++//
++// Status codes for hypervisor operations.
++//
++typedef UINT16 HV_STATUS, *PHV_STATUS;
++
++//
++// MessageId: HV_STATUS_SUCCESS
++//
++// MessageText:
++//
++// The specified hypercall succeeded
++//
++#define HV_STATUS_SUCCESS                ((HV_STATUS)0x0000)
++
++//
++// MessageId: HV_STATUS_INVALID_HYPERCALL_CODE
++//
++// MessageText:
++//
++// The hypervisor does not support the operation because the specified hypercall code is not supported.
++//
++#define HV_STATUS_INVALID_HYPERCALL_CODE ((HV_STATUS)0x0002)
++
++//
++// MessageId: HV_STATUS_INVALID_HYPERCALL_INPUT
++//
++// MessageText:
++//
++// The hypervisor does not support the operation because the encoding for the hypercall input register is not supported.
++//
++#define HV_STATUS_INVALID_HYPERCALL_INPUT ((HV_STATUS)0x0003)
++
++//
++// MessageId: HV_STATUS_INVALID_ALIGNMENT
++//
++// MessageText:
++//
++// The hypervisor could not perform the operation beacuse a parameter has an invalid alignment.
++//
++#define HV_STATUS_INVALID_ALIGNMENT      ((HV_STATUS)0x0004)
++
++//
++// MessageId: HV_STATUS_INVALID_PARAMETER
++//
++// MessageText:
++//
++// The hypervisor could not perform the operation beacuse an invalid parameter was specified.
++//
++#define HV_STATUS_INVALID_PARAMETER      ((HV_STATUS)0x0005)
++
++//
++// MessageId: HV_STATUS_ACCESS_DENIED
++//
++// MessageText:
++//
++// Access to the specified object was denied.
++//
++#define HV_STATUS_ACCESS_DENIED          ((HV_STATUS)0x0006)
++
++//
++// MessageId: HV_STATUS_INVALID_PARTITION_STATE
++//
++// MessageText:
++//
++// The hypervisor could not perform the operation because the partition is entering or in an invalid state.
++//
++#define HV_STATUS_INVALID_PARTITION_STATE ((HV_STATUS)0x0007)
++
++//
++// MessageId: HV_STATUS_OPERATION_DENIED
++//
++// MessageText:
++//
++// The operation is not allowed in the current state.
++//
++#define HV_STATUS_OPERATION_DENIED       ((HV_STATUS)0x0008)
++
++//
++// MessageId: HV_STATUS_UNKNOWN_PROPERTY
++//
++// MessageText:
++//
++// The hypervisor does not recognize the specified partition property.
++//
++#define HV_STATUS_UNKNOWN_PROPERTY       ((HV_STATUS)0x0009)
++
++//
++// MessageId: HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE
++//
++// MessageText:
++//
++// The specified value of a partition property is out of range or violates an invariant.
++//
++#define HV_STATUS_PROPERTY_VALUE_OUT_OF_RANGE ((HV_STATUS)0x000A)
++
++//
++// MessageId: HV_STATUS_INSUFFICIENT_MEMORY
++//
++// MessageText:
++//
++// There is not enough memory in the hypervisor pool to complete the operation.
++//
++#define HV_STATUS_INSUFFICIENT_MEMORY    ((HV_STATUS)0x000B)
++
++//
++// MessageId: HV_STATUS_PARTITION_TOO_DEEP
++//
++// MessageText:
++//
++// The maximum partition depth has been exceeded for the partition hierarchy.
++//
++#define HV_STATUS_PARTITION_TOO_DEEP     ((HV_STATUS)0x000C)
++
++//
++// MessageId: HV_STATUS_INVALID_PARTITION_ID
++//
++// MessageText:
++//
++// A partition with the specified partition Id does not exist.
++//
++#define HV_STATUS_INVALID_PARTITION_ID   ((HV_STATUS)0x000D)
++
++//
++// MessageId: HV_STATUS_INVALID_VP_INDEX
++//
++// MessageText:
++//
++// The hypervisor could not perform the operation because the specified VP index is invalid.
++//
++#define HV_STATUS_INVALID_VP_INDEX       ((HV_STATUS)0x000E)
++
++//
++// MessageId: HV_STATUS_NOT_FOUND
++//
++// MessageText:
++//
++// The iteration is complete; no addition items in the iteration could be found.
++//
++#define HV_STATUS_NOT_FOUND              ((HV_STATUS)0x0010)
++
++//
++// MessageId: HV_STATUS_INVALID_PORT_ID
++//
++// MessageText:
++//
++// The hypervisor could not perform the operation because the specified port identifier is invalid.
++//
++#define HV_STATUS_INVALID_PORT_ID        ((HV_STATUS)0x0011)
++
++//
++// MessageId: HV_STATUS_INVALID_CONNECTION_ID
++//
++// MessageText:
++//
++// The hypervisor could not perform the operation because the specified connection identifier is invalid.
++//
++#define HV_STATUS_INVALID_CONNECTION_ID  ((HV_STATUS)0x0012)
++
++//
++// MessageId: HV_STATUS_INSUFFICIENT_BUFFERS
++//
++// MessageText:
++//
++// You did not supply enough message buffers to send a message.
++//
++#define HV_STATUS_INSUFFICIENT_BUFFERS   ((HV_STATUS)0x0013)
++
++//
++// MessageId: HV_STATUS_NOT_ACKNOWLEDGED
++//
++// MessageText:
++//
++// The previous virtual interrupt has not been acknowledged.
++//
++#define HV_STATUS_NOT_ACKNOWLEDGED       ((HV_STATUS)0x0014)
++
++//
++// MessageId: HV_STATUS_INVALID_VP_STATE
++//
++// MessageText:
++//
++// A virtual processor is not in the correct state for the performance of the indicated operation.
++//
++#define HV_STATUS_INVALID_VP_STATE       ((HV_STATUS)0x0015)
++
++//
++// MessageId: HV_STATUS_ACKNOWLEDGED
++//
++// MessageText:
++//
++// The previous virtual interrupt has already been acknowledged.
++//
++#define HV_STATUS_ACKNOWLEDGED           ((HV_STATUS)0x0016)
++
++//
++// MessageId: HV_STATUS_INVALID_SAVE_RESTORE_STATE
++//
++// MessageText:
++//
++// The indicated partition is not in a valid state for saving or restoring.
++//
++#define HV_STATUS_INVALID_SAVE_RESTORE_STATE ((HV_STATUS)0x0017)
++
++//
++// MessageId: HV_STATUS_INVALID_SYNIC_STATE
++//
++// MessageText:
++//
++// The hypervisor could not complete the operation because a required feature of the synthetic interrupt controller (SynIC) was disabled.
++//
++#define HV_STATUS_INVALID_SYNIC_STATE    ((HV_STATUS)0x0018)
++
++//
++// MessageId: HV_STATUS_OBJECT_IN_USE
++//
++// MessageText:
++//
++// 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.
++//
++#define HV_STATUS_OBJECT_IN_USE          ((HV_STATUS)0x0019)
++
++//
++// MessageId: HV_STATUS_INVALID_PROXIMITY_DOMAIN_INFO
++//
++// MessageText:
++//
++// The proximity domain information is invalid.
++//
++#define HV_STATUS_INVALID_PROXIMITY_DOMAIN_INFO ((HV_STATUS)0x001A)
++
++//
++// MessageId: HV_STATUS_NO_DATA
++//
++// MessageText:
++//
++// An attempt to retrieve debugging data failed because none was available.
++//
++#define HV_STATUS_NO_DATA                ((HV_STATUS)0x001B)
++
++//
++// MessageId: HV_STATUS_INACTIVE
++//
++// MessageText:
++//
++// The physical connection being used for debuggging has not recorded any receive activity since the last operation.
++//
++#define HV_STATUS_INACTIVE               ((HV_STATUS)0x001C)
++
++//
++// MessageId: HV_STATUS_NO_RESOURCES
++//
++// MessageText:
++//
++// There are not enough resources to complete the operation.
++//
++#define HV_STATUS_NO_RESOURCES           ((HV_STATUS)0x001D)
++
++//
++// MessageId: HV_STATUS_FEATURE_UNAVAILABLE
++//
++// MessageText:
++//
++// A hypervisor feature is not available to the user.
++//
++#define HV_STATUS_FEATURE_UNAVAILABLE    ((HV_STATUS)0x001E)
++
++// end_hvgdk
++
++//
++// MessageId: HV_STATUS_UNSUCCESSFUL
++//
++// MessageText:
++//
++// {Operation Failed}
++// The requested operation was unsuccessful.
++//
++#define HV_STATUS_UNSUCCESSFUL           ((HV_STATUS)0x1001)
++
++//
++// MessageId: HV_STATUS_INSUFFICIENT_BUFFER
++//
++// MessageText:
++//
++// The specified buffer was too small to contain all of the requested data.
++//
++#define HV_STATUS_INSUFFICIENT_BUFFER    ((HV_STATUS)0x1002)
++
++//
++// MessageId: HV_STATUS_GPA_NOT_PRESENT
++//
++// MessageText:
++//
++// The guest physical address is not currently associated with a system physical address.
++//
++#define HV_STATUS_GPA_NOT_PRESENT        ((HV_STATUS)0x1003)
++
++//
++// MessageId: HV_STATUS_GUEST_PAGE_FAULT
++//
++// MessageText:
++//
++// The operation would have resulted in a page fault in the guest.
++//
++#define HV_STATUS_GUEST_PAGE_FAULT       ((HV_STATUS)0x1004)
++
++//
++// MessageId: HV_STATUS_RUNDOWN_DISABLED
++//
++// MessageText:
++//
++// The operation cannot proceed as the rundown object was marked disabled.
++//
++#define HV_STATUS_RUNDOWN_DISABLED       ((HV_STATUS)0x1005)
++
++//
++// MessageId: HV_STATUS_KEY_ALREADY_EXISTS
++//
++// MessageText:
++//
++// The entry cannot be added as another entry with the same key already exists.
++//
++#define HV_STATUS_KEY_ALREADY_EXISTS     ((HV_STATUS)0x1006)
++
++//
++// MessageId: HV_STATUS_GPA_INTERCEPT
++//
++// MessageText:
++//
++// The operation resulted an intercept on a region of guest physical memory.
++//
++#define HV_STATUS_GPA_INTERCEPT          ((HV_STATUS)0x1007)
++
++//
++// MessageId: HV_STATUS_GUEST_GENERAL_PROTECTION_FAULT
++//
++// MessageText:
++//
++// The operation would have resulted in a general protection fault in the guest.
++//
++#define HV_STATUS_GUEST_GENERAL_PROTECTION_FAULT ((HV_STATUS)0x1008)
++
++//
++// MessageId: HV_STATUS_GUEST_STACK_FAULT
++//
++// MessageText:
++//
++// The operation would have resulted in a stack fault in the guest.
++//
++#define HV_STATUS_GUEST_STACK_FAULT      ((HV_STATUS)0x1009)
++
++//
++// MessageId: HV_STATUS_GUEST_INVALID_OPCODE_FAULT
++//
++// MessageText:
++//
++// The operation would have resulted in an invalid opcode fault in the guest.
++//
++#define HV_STATUS_GUEST_INVALID_OPCODE_FAULT ((HV_STATUS)0x100A)
++
++//
++// MessageId: HV_STATUS_FINALIZE_INCOMPLETE
++//
++// MessageText:
++//
++// The partition is not completely finalized.
++//
++#define HV_STATUS_FINALIZE_INCOMPLETE    ((HV_STATUS)0x100B)
++
++//
++// MessageId: HV_STATUS_GUEST_MACHINE_CHECK_ABORT
++//
++// MessageText:
++//
++// The operation would have resulted in an machine check abort in the guest.
++//
++#define HV_STATUS_GUEST_MACHINE_CHECK_ABORT ((HV_STATUS)0x100C)
++
++//
++// MessageId: HV_STATUS_ILLEGAL_OVERLAY_ACCESS
++//
++// MessageText:
++//
++// An illegal access was attempted to an overlay page.
++//
++#define HV_STATUS_ILLEGAL_OVERLAY_ACCESS ((HV_STATUS)0x100D)
++
++//
++// MessageId: HV_STATUS_INSUFFICIENT_SYSTEM_VA
++//
++// MessageText:
++//
++// There is not enough system VA space available to satisfy the request,
++//
++#define HV_STATUS_INSUFFICIENT_SYSTEM_VA ((HV_STATUS)0x100E)
++
++//
++// MessageId: HV_STATUS_VIRTUAL_ADDRESS_NOT_MAPPED
++//
++// MessageText:
++//
++// The passed virtual address was not mapped in the hypervisor address space.
++//
++#define HV_STATUS_VIRTUAL_ADDRESS_NOT_MAPPED ((HV_STATUS)0x100F)
++
++//
++// MessageId: HV_STATUS_NOT_IMPLEMENTED
++//
++// MessageText:
++//
++// The requested operation is not implemented in this version of the hypervisor.
++//
++#define HV_STATUS_NOT_IMPLEMENTED        ((HV_STATUS)0x1010)
++
++//
++// MessageId: HV_STATUS_VMX_INSTRUCTION_FAILED
++//
++// MessageText:
++//
++// The requested VMX instruction failed to complete succesfully.
++//
++#define HV_STATUS_VMX_INSTRUCTION_FAILED ((HV_STATUS)0x1011)
++
++//
++// MessageId: HV_STATUS_VMX_INSTRUCTION_FAILED_WITH_STATUS
++//
++// MessageText:
++//
++// The requested VMX instruction failed to complete succesfully indicating status.
++//
++#define HV_STATUS_VMX_INSTRUCTION_FAILED_WITH_STATUS ((HV_STATUS)0x1012)
++
++//
++// MessageId: HV_STATUS_MSR_ACCESS_FAILED
++//
++// MessageText:
++//
++// The requested access to the model specific register failed.
++//
++#define HV_STATUS_MSR_ACCESS_FAILED      ((HV_STATUS)0x1013)
++
++//
++// MessageId: HV_STATUS_CR_ACCESS_FAILED
++//
++// MessageText:
++//
++// The requested access to the control register failed.
++//
++#define HV_STATUS_CR_ACCESS_FAILED       ((HV_STATUS)0x1014)
++
++//
++// MessageId: HV_STATUS_TIMEOUT
++//
++// MessageText:
++//
++// The specified timeout expired before the operation completed.
++//
++#define HV_STATUS_TIMEOUT                ((HV_STATUS)0x1016)
++
++//
++// MessageId: HV_STATUS_MSR_INTERCEPT
++//
++// MessageText:
++//
++// The requested access to the model specific register generated an intercept.
++//
++#define HV_STATUS_MSR_INTERCEPT          ((HV_STATUS)0x1017)
++
++//
++// MessageId: HV_STATUS_CPUID_INTERCEPT
++//
++// MessageText:
++//
++// The CPUID instruction generated an intercept.
++//
++#define HV_STATUS_CPUID_INTERCEPT        ((HV_STATUS)0x1018)
++
++//
++// MessageId: HV_STATUS_REPEAT_INSTRUCTION
++//
++// MessageText:
++//
++// The current instruction should be repeated and the instruction pointer not advanced.
++//
++#define HV_STATUS_REPEAT_INSTRUCTION     ((HV_STATUS)0x1019)
++
++//
++// MessageId: HV_STATUS_PAGE_PROTECTION_VIOLATION
++//
++// MessageText:
++//
++// The current instruction should be repeated and the instruction pointer not advanced.
++//
++#define HV_STATUS_PAGE_PROTECTION_VIOLATION ((HV_STATUS)0x101A)
++
++//
++// MessageId: HV_STATUS_PAGE_TABLE_INVALID
++//
++// MessageText:
++//
++// The current instruction should be repeated and the instruction pointer not advanced.
++//
++#define HV_STATUS_PAGE_TABLE_INVALID     ((HV_STATUS)0x101B)
++
++//
++// MessageId: HV_STATUS_PAGE_NOT_PRESENT
++//
++// MessageText:
++//
++// The current instruction should be repeated and the instruction pointer not advanced.
++//
++#define HV_STATUS_PAGE_NOT_PRESENT       ((HV_STATUS)0x101C)
++
++//
++// MessageId: HV_STATUS_IO_INTERCEPT
++//
++// MessageText:
++//
++// The requested access to the I/O port generated an intercept.
++//
++#define HV_STATUS_IO_INTERCEPT           ((HV_STATUS)0x101D)
++
++//
++// MessageId: HV_STATUS_NOTHING_TO_DO
++//
++// MessageText:
++//
++// There is nothing to do.
++//
++#define HV_STATUS_NOTHING_TO_DO          ((HV_STATUS)0x101E)
++
++//
++// MessageId: HV_STATUS_THREAD_TERMINATING
++//
++// MessageText:
++//
++// The requested thread is terminating.
++//
++#define HV_STATUS_THREAD_TERMINATING     ((HV_STATUS)0x101F)
++
++//
++// MessageId: HV_STATUS_SECTION_ALREADY_CONSTRUCTED
++//
++// MessageText:
++//
++// The specified section was already constructed.
++//
++#define HV_STATUS_SECTION_ALREADY_CONSTRUCTED ((HV_STATUS)0x1020)
++
++//
++// MessageId: HV_STATUS_SECTION_NOT_ALREADY_CONSTRUCTED
++//
++// MessageText:
++//
++// The specified section was not already constructed.
++//
++#define HV_STATUS_SECTION_NOT_ALREADY_CONSTRUCTED ((HV_STATUS)0x1021)
++
++//
++// MessageId: HV_STATUS_PAGE_ALREADY_COMMITTED
++//
++// MessageText:
++//
++// The specified virtual address was already backed by physical memory.
++//
++#define HV_STATUS_PAGE_ALREADY_COMMITTED ((HV_STATUS)0x1022)
++
++//
++// MessageId: HV_STATUS_PAGE_NOT_ALREADY_COMMITTED
++//
++// MessageText:
++//
++// The specified virtual address was not already backed by physical memory.
++//
++#define HV_STATUS_PAGE_NOT_ALREADY_COMMITTED ((HV_STATUS)0x1023)
++
++//
++// MessageId: HV_STATUS_COMMITTED_PAGES_REMAIN
++//
++// MessageText:
++//
++// Committed pages remain in the section.
++//
++#define HV_STATUS_COMMITTED_PAGES_REMAIN ((HV_STATUS)0x1024)
++
++//
++// MessageId: HV_STATUS_NO_REMAINING_COMMITTED_PAGES
++//
++// MessageText:
++//
++// No additional committed pages beyond the specified page exist in the section.
++//
++#define HV_STATUS_NO_REMAINING_COMMITTED_PAGES ((HV_STATUS)0x1025)
++
++//
++// MessageId: HV_STATUS_INSUFFICIENT_COMPARTMENT_VA
++//
++// MessageText:
++//
++// The VA space of the compartment is exhausted.
++//
++#define HV_STATUS_INSUFFICIENT_COMPARTMENT_VA ((HV_STATUS)0x1026)
++
++//
++// MessageId: HV_STATUS_DEREF_SPA_LIST_FULL
++//
++// MessageText:
++//
++// The SPA dereference list is full, and there are additional entries
++// to be added to it.
++//
++#define HV_STATUS_DEREF_SPA_LIST_FULL ((HV_STATUS)0x1027)
++
++//
++// MessageId: HV_STATUS_GPA_OUT_OF_RANGE
++//
++// MessageText:
++//
++// The supplied GPA is out of range.
++//
++#define HV_STATUS_GPA_OUT_OF_RANGE ((HV_STATUS)0x1027)
++
++//
++// MessageId: HV_STATUS_NONVOLATILE_XMM_STALE
++//
++// MessageText:
++//
++// The XMM register that was being accessed is stale.
++//
++#define HV_STATUS_NONVOLATILE_XMM_STALE ((HV_STATUS)0x1028)
++
++//
++// MessageId: HV_STATUS_UNSUPPORTED_PROCESSOR
++//
++// MessageText:
++//
++// The hypervisor does not support the processors in this system.
++//
++#define HV_STATUS_UNSUPPORTED_PROCESSOR ((HV_STATUS)0x1029)
++
++//
++// MessageId: HV_STATUS_INSUFFICIENT_CROM_SPACE
++//
++// MessageText:
++//
++// Insufficient space existed for copying over the CROM contents.
++//
++#define HV_STATUS_INSUFFICIENT_CROM_SPACE ((HV_STATUS)0x2000)
++
++//
++// MessageId: HV_STATUS_BAD_CROM_FORMAT
++//
++// MessageText:
++//
++// The contents of the CROM failed validation attempts.
++//
++#define HV_STATUS_BAD_CROM_FORMAT        ((HV_STATUS)0x2001)
++
++//
++// MessageId: HV_STATUS_UNSUPPORTED_CROM_FORMAT
++//
++// MessageText:
++//
++// The contents of the CROM contain contents the parser doesn't support.
++//
++#define HV_STATUS_UNSUPPORTED_CROM_FORMAT ((HV_STATUS)0x2002)
++
++//
++// MessageId: HV_STATUS_UNSUPPORTED_CONTROLLER
++//
++// MessageText:
++//
++// The register format of the OHCI controller specified for debugging is not supported.
++//
++#define HV_STATUS_UNSUPPORTED_CONTROLLER ((HV_STATUS)0x2003)
++
++//
++// MessageId: HV_STATUS_CROM_TOO_LARGE
++//
++// MessageText:
++//
++// The CROM contents were to large to copy over.
++//
++#define HV_STATUS_CROM_TOO_LARGE         ((HV_STATUS)0x2004)
++
++//
++// MessageId: HV_STATUS_CONTROLLER_IN_USE
++//
++// MessageText:
++//
++// The OHCI controller specified for debugging cannot be used as it is already in use.
++//
++#define HV_STATUS_CONTROLLER_IN_USE      ((HV_STATUS)0x2005)
++
+--- /dev/null
++++ b/drivers/staging/hv/include/HvSynicApi.h
+@@ -0,0 +1,490 @@
++/*
++ *
++ * Copyright (c) 2009, Microsoft Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Authors:
++ *   Haiyang Zhang <haiyangz@microsoft.com>
++ *   Hank Janssen  <hjanssen@microsoft.com>
++ *
++ */
++
++#pragma once
++
++//
++// Define the virtual APIC registers
++//
++#define HV_X64_MSR_EOI                  (0x40000070)
++#define HV_X64_MSR_ICR                  (0x40000071)
++#define HV_X64_MSR_TPR                  (0x40000072)
++#define HV_X64_MSR_APIC_ASSIST_PAGE     (0x40000073)
++
++//
++// Define version of the synthetic interrupt controller.
++//
++
++#define HV_SYNIC_VERSION        (1)
++
++
++//
++// Define synthetic interrupt controller model specific registers.
++//
++
++#define HV_X64_MSR_SCONTROL   (0x40000080)
++#define HV_X64_MSR_SVERSION   (0x40000081)
++#define HV_X64_MSR_SIEFP      (0x40000082)
++#define HV_X64_MSR_SIMP       (0x40000083)
++#define HV_X64_MSR_EOM        (0x40000084)
++#define HV_X64_MSR_SINT0      (0x40000090)
++#define HV_X64_MSR_SINT1      (0x40000091)
++#define HV_X64_MSR_SINT2      (0x40000092)
++#define HV_X64_MSR_SINT3      (0x40000093)
++#define HV_X64_MSR_SINT4      (0x40000094)
++#define HV_X64_MSR_SINT5      (0x40000095)
++#define HV_X64_MSR_SINT6      (0x40000096)
++#define HV_X64_MSR_SINT7      (0x40000097)
++#define HV_X64_MSR_SINT8      (0x40000098)
++#define HV_X64_MSR_SINT9      (0x40000099)
++#define HV_X64_MSR_SINT10     (0x4000009A)
++#define HV_X64_MSR_SINT11     (0x4000009B)
++#define HV_X64_MSR_SINT12     (0x4000009C)
++#define HV_X64_MSR_SINT13     (0x4000009D)
++#define HV_X64_MSR_SINT14     (0x4000009E)
++#define HV_X64_MSR_SINT15     (0x4000009F)
++
++//
++// Define the expected SynIC version.
++//
++#define HV_SYNIC_VERSION_1 (0x1)
++
++//
++// Define synthetic interrupt controller message constants.
++//
++
++#define HV_MESSAGE_SIZE                 (256)
++#define HV_MESSAGE_PAYLOAD_BYTE_COUNT   (240)
++#define HV_MESSAGE_PAYLOAD_QWORD_COUNT  (30)
++#define HV_ANY_VP                       (0xFFFFFFFF)
++
++//
++// Define synthetic interrupt controller flag constants.
++//
++
++#define HV_EVENT_FLAGS_COUNT        (256 * 8)
++#define HV_EVENT_FLAGS_BYTE_COUNT   (256)
++#define HV_EVENT_FLAGS_DWORD_COUNT  (256 / sizeof(UINT32))
++
++//
++// Define hypervisor message types.
++//
++typedef enum _HV_MESSAGE_TYPE
++{
++    HvMessageTypeNone = 0x00000000,
++
++    //
++    // Memory access messages.
++    //
++    HvMessageTypeUnmappedGpa = 0x80000000,
++    HvMessageTypeGpaIntercept = 0x80000001,
++
++    //
++    // Timer notification messages.
++    //
++    HvMessageTimerExpired = 0x80000010,
++
++    //
++    // Error messages.
++    //
++    HvMessageTypeInvalidVpRegisterValue = 0x80000020,
++    HvMessageTypeUnrecoverableException = 0x80000021,
++    HvMessageTypeUnsupportedFeature = 0x80000022,
++
++    //
++    // Trace buffer complete messages.
++    //
++    HvMessageTypeEventLogBufferComplete = 0x80000040,
++
++    //
++    // Platform-specific processor intercept messages.
++    //
++    HvMessageTypeX64IoPortIntercept = 0x80010000,
++    HvMessageTypeX64MsrIntercept = 0x80010001,
++    HvMessageTypeX64CpuidIntercept = 0x80010002,
++    HvMessageTypeX64ExceptionIntercept = 0x80010003,
++    HvMessageTypeX64ApicEoi = 0x80010004,
++    HvMessageTypeX64LegacyFpError = 0x80010005
++
++} HV_MESSAGE_TYPE, *PHV_MESSAGE_TYPE;
++
++//
++// Define the number of synthetic interrupt sources.
++//
++
++#define HV_SYNIC_SINT_COUNT (16)
++#define HV_SYNIC_STIMER_COUNT (4)
++
++//
++// Define the synthetic interrupt source index type.
++//
++
++typedef UINT32 HV_SYNIC_SINT_INDEX, *PHV_SYNIC_SINT_INDEX;
++
++//
++// Define partition identifier type.
++//
++
++typedef UINT64 HV_PARTITION_ID, *PHV_PARTITION_ID;
++
++//
++// Define invalid partition identifier.
++//
++#define HV_PARTITION_ID_INVALID ((HV_PARTITION_ID) 0x0)
++
++//
++// Define connection identifier type.
++//
++
++typedef union _HV_CONNECTION_ID
++{
++    UINT32 AsUINT32;
++
++    struct
++    {
++        UINT32 Id:24;
++        UINT32 Reserved:8;
++    } u;
++
++} HV_CONNECTION_ID, *PHV_CONNECTION_ID;
++
++//
++// Define port identifier type.
++//
++
++typedef union _HV_PORT_ID
++{
++    UINT32 AsUINT32;
++
++    struct
++    {
++        UINT32 Id:24;
++        UINT32 Reserved:8;
++    } u ;
++
++} HV_PORT_ID, *PHV_PORT_ID;
++
++//
++// Define port type.
++//
++
++typedef enum _HV_PORT_TYPE
++{
++    HvPortTypeMessage   = 1,
++    HvPortTypeEvent     = 2,
++    HvPortTypeMonitor   = 3
++} HV_PORT_TYPE, *PHV_PORT_TYPE;
++
++//
++// Define port information structure.
++//
++
++typedef struct _HV_PORT_INFO
++{
++    HV_PORT_TYPE PortType;
++    UINT32 Padding;
++
++    union
++    {
++        struct
++        {
++            HV_SYNIC_SINT_INDEX TargetSint;
++            HV_VP_INDEX TargetVp;
++            UINT64 RsvdZ;
++        } MessagePortInfo;
++
++        struct
++        {
++            HV_SYNIC_SINT_INDEX TargetSint;
++            HV_VP_INDEX TargetVp;
++            UINT16 BaseFlagNumber;
++            UINT16 FlagCount;
++            UINT32 RsvdZ;
++        } EventPortInfo;
++
++        struct
++        {
++            HV_GPA MonitorAddress;
++            UINT64 RsvdZ;
++        } MonitorPortInfo;
++    };
++} HV_PORT_INFO, *PHV_PORT_INFO;
++
++typedef const HV_PORT_INFO *PCHV_PORT_INFO;
++
++typedef struct _HV_CONNECTION_INFO
++{
++    HV_PORT_TYPE PortType;
++    UINT32 Padding;
++
++    union
++    {
++        struct
++        {
++            UINT64 RsvdZ;
++        } MessageConnectionInfo;
++
++        struct
++        {
++            UINT64 RsvdZ;
++        } EventConnectionInfo;
++
++        struct
++        {
++            HV_GPA MonitorAddress;
++        } MonitorConnectionInfo;
++    };
++} HV_CONNECTION_INFO, *PHV_CONNECTION_INFO;
++
++typedef const HV_CONNECTION_INFO *PCHV_CONNECTION_INFO;
++
++//
++// Define synthetic interrupt controller message flags.
++//
++
++typedef union _HV_MESSAGE_FLAGS
++{
++    UINT8 AsUINT8;
++    struct
++    {
++        UINT8 MessagePending:1;
++        UINT8 Reserved:7;
++    };
++} HV_MESSAGE_FLAGS, *PHV_MESSAGE_FLAGS;
++
++
++//
++// Define synthetic interrupt controller message header.
++//
++
++typedef struct _HV_MESSAGE_HEADER
++{
++    HV_MESSAGE_TYPE     MessageType;
++    UINT8               PayloadSize;
++    HV_MESSAGE_FLAGS    MessageFlags;
++    UINT8               Reserved[2];
++    union
++    {
++        HV_PARTITION_ID Sender;
++        HV_PORT_ID      Port;
++    };
++
++} HV_MESSAGE_HEADER, *PHV_MESSAGE_HEADER;
++
++//
++// Define timer message payload structure.
++//
++typedef struct _HV_TIMER_MESSAGE_PAYLOAD
++{
++    UINT32          TimerIndex;
++    UINT32          Reserved;
++    HV_NANO100_TIME ExpirationTime;     // When the timer expired
++    HV_NANO100_TIME DeliveryTime;       // When the message was delivered
++} HV_TIMER_MESSAGE_PAYLOAD, *PHV_TIMER_MESSAGE_PAYLOAD;
++
++//
++// Define synthetic interrupt controller message format.
++//
++
++typedef struct _HV_MESSAGE
++{
++    HV_MESSAGE_HEADER Header;
++    union
++    {
++        UINT64 Payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT];
++    } u ;
++} HV_MESSAGE, *PHV_MESSAGE;
++
++//
++// Define the number of message buffers associated with each port.
++//
++
++#define HV_PORT_MESSAGE_BUFFER_COUNT (16)
++
++//
++// Define the synthetic interrupt message page layout.
++//
++
++typedef struct _HV_MESSAGE_PAGE
++{
++    volatile HV_MESSAGE SintMessage[HV_SYNIC_SINT_COUNT];
++} HV_MESSAGE_PAGE, *PHV_MESSAGE_PAGE;
++
++
++//
++// Define the synthetic interrupt controller event flags format.
++//
++
++typedef union _HV_SYNIC_EVENT_FLAGS
++{
++    UINT8 Flags8[HV_EVENT_FLAGS_BYTE_COUNT];
++    UINT32 Flags32[HV_EVENT_FLAGS_DWORD_COUNT];
++} HV_SYNIC_EVENT_FLAGS, *PHV_SYNIC_EVENT_FLAGS;
++
++
++//
++// Define the synthetic interrupt flags page layout.
++//
++
++typedef struct _HV_SYNIC_EVENT_FLAGS_PAGE
++{
++    volatile HV_SYNIC_EVENT_FLAGS SintEventFlags[HV_SYNIC_SINT_COUNT];
++} HV_SYNIC_EVENT_FLAGS_PAGE, *PHV_SYNIC_EVENT_FLAGS_PAGE;
++
++
++//
++// Define SynIC control register.
++//
++typedef union _HV_SYNIC_SCONTROL
++{
++    UINT64 AsUINT64;
++    struct
++    {
++        UINT64 Enable:1;
++        UINT64 Reserved:63;
++    };
++} HV_SYNIC_SCONTROL, *PHV_SYNIC_SCONTROL;
++
++//
++// Define synthetic interrupt source.
++//
++
++typedef union _HV_SYNIC_SINT
++{
++    UINT64 AsUINT64;
++    struct
++    {
++        UINT64 Vector    :8;
++        UINT64 Reserved1 :8;
++        UINT64 Masked    :1;
++        UINT64 AutoEoi   :1;
++        UINT64 Reserved2 :46;
++    };
++} HV_SYNIC_SINT, *PHV_SYNIC_SINT;
++
++//
++// Define the format of the SIMP register
++//
++
++typedef union _HV_SYNIC_SIMP
++{
++    UINT64 AsUINT64;
++    struct
++    {
++        UINT64 SimpEnabled : 1;
++        UINT64 Preserved   : 11;
++        UINT64 BaseSimpGpa : 52;
++    };
++} HV_SYNIC_SIMP, *PHV_SYNIC_SIMP;
++
++//
++// Define the format of the SIEFP register
++//
++
++typedef union _HV_SYNIC_SIEFP
++{
++    UINT64 AsUINT64;
++    struct
++    {
++        UINT64 SiefpEnabled : 1;
++        UINT64 Preserved   : 11;
++        UINT64 BaseSiefpGpa : 52;
++    };
++} HV_SYNIC_SIEFP, *PHV_SYNIC_SIEFP;
++
++//
++// Definitions for the monitored notification facility
++//
++
++typedef union _HV_MONITOR_TRIGGER_GROUP
++{
++    UINT64 AsUINT64;
++
++    struct
++    {
++        UINT32 Pending;
++        UINT32 Armed;
++    };
++
++} HV_MONITOR_TRIGGER_GROUP, *PHV_MONITOR_TRIGGER_GROUP;
++
++typedef struct _HV_MONITOR_PARAMETER
++{
++    HV_CONNECTION_ID    ConnectionId;
++    UINT16              FlagNumber;
++    UINT16              RsvdZ;
++} HV_MONITOR_PARAMETER, *PHV_MONITOR_PARAMETER;
++
++typedef union _HV_MONITOR_TRIGGER_STATE
++{
++    UINT32 AsUINT32;
++
++    struct
++    {
++        UINT32 GroupEnable : 4;
++        UINT32 RsvdZ       : 28;
++    };
++
++} HV_MONITOR_TRIGGER_STATE, *PHV_MONITOR_TRIGGER_STATE;
++
++//
++// HV_MONITOR_PAGE Layout
++// ------------------------------------------------------
++// | 0   | TriggerState (4 bytes) | Rsvd1 (4 bytes)     |
++// | 8   | TriggerGroup[0]                              |
++// | 10  | TriggerGroup[1]                              |
++// | 18  | TriggerGroup[2]                              |
++// | 20  | TriggerGroup[3]                              |
++// | 28  | Rsvd2[0]                                     |
++// | 30  | Rsvd2[1]                                     |
++// | 38  | Rsvd2[2]                                     |
++// | 40  | NextCheckTime[0][0]    | NextCheckTime[0][1] |
++// | ...                                                |
++// | 240 | Latency[0][0..3]                             |
++// | 340 | Rsvz3[0]                                     |
++// | 440 | Parameter[0][0]                              |
++// | 448 | Parameter[0][1]                              |
++// | ...                                                |
++// | 840 | Rsvd4[0]                                     |
++// ------------------------------------------------------
++
++typedef struct _HV_MONITOR_PAGE
++{
++    HV_MONITOR_TRIGGER_STATE TriggerState;
++    UINT32                   RsvdZ1;
++
++    HV_MONITOR_TRIGGER_GROUP TriggerGroup[4];
++    UINT64                   RsvdZ2[3];
++
++    INT32                    NextCheckTime[4][32];
++
++    UINT16                   Latency[4][32];
++    UINT64                   RsvdZ3[32];
++
++    HV_MONITOR_PARAMETER     Parameter[4][32];
++
++    UINT8                    RsvdZ4[1984];
++
++} HV_MONITOR_PAGE, *PHV_MONITOR_PAGE;
++
++typedef volatile HV_MONITOR_PAGE* PVHV_MONITOR_PAGE;
+--- /dev/null
++++ b/drivers/staging/hv/include/HvTypes.h
+@@ -0,0 +1,31 @@
++/*
++ *
++ * Copyright (c) 2009, Microsoft Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Authors:
++ *   Haiyang Zhang <haiyangz@microsoft.com>
++ *   Hank Janssen  <hjanssen@microsoft.com>
++ *
++ */
++
++
++#pragma once
++
++typedef UINT64 HV_GPA, *PHV_GPA;
++
++#define HV_X64_PAGE_SIZE (4096)
++#define HV_PAGE_SIZE HV_X64_PAGE_SIZE
++
+--- /dev/null
++++ b/drivers/staging/hv/include/HvVpApi.h
+@@ -0,0 +1,51 @@
++/*
++ *
++ * Copyright (c) 2009, Microsoft Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Authors:
++ *   Haiyang Zhang <haiyangz@microsoft.com>
++ *   Hank Janssen  <hjanssen@microsoft.com>
++ *
++ */
++
++
++#pragma once
++//
++// Virtual Processor Indices
++//
++typedef UINT32 HV_VP_INDEX, *PHV_VP_INDEX;
++
++//
++// The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent
++// is set by CPUID(HvCpuIdFunctionVersionAndFeatures).
++// ==========================================================================
++//
++
++typedef enum _HV_CPUID_FUNCTION
++{
++    HvCpuIdFunctionVersionAndFeatures           = 0x00000001,
++    HvCpuIdFunctionHvVendorAndMaxFunction       = 0x40000000,
++    HvCpuIdFunctionHvInterface                  = 0x40000001,
++
++    //
++    // The remaining functions depend on the value of HvCpuIdFunctionInterface
++    //
++    HvCpuIdFunctionMsHvVersion                  = 0x40000002,
++    HvCpuIdFunctionMsHvFeatures                 = 0x40000003,
++    HvCpuIdFunctionMsHvEnlightenmentInformation = 0x40000004,
++    HvCpuIdFunctionMsHvImplementationLimits     = 0x40000005
++
++} HV_CPUID_FUNCTION, *PHV_CPUID_FUNCTION;
+--- /dev/null
++++ b/drivers/staging/hv/include/List.h
+@@ -0,0 +1,269 @@
++/*
++ *
++ * Copyright (c) 2009, Microsoft Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Authors:
++ *   Haiyang Zhang <haiyangz@microsoft.com>
++ *   Hank Janssen  <hjanssen@microsoft.com>
++ *
++ */
++
++
++#ifndef _LIST_H_
++#define _LIST_H_
++
++#include "osd.h"
++/*
++ *
++ *  Doubly-linked list manipulation routines.  Implemented as macros
++ *  but logically these are procedures.
++ *
++ */
++
++typedef DLIST_ENTRY LIST_ENTRY;
++typedef DLIST_ENTRY *PLIST_ENTRY;
++
++//typedef struct LIST_ENTRY {
++//   struct LIST_ENTRY * volatile Flink;
++//   struct LIST_ENTRY * volatile Blink;
++//} LIST_ENTRY, *PLIST_ENTRY;
++
++
++
++/*
++ *  VOID
++ *  InitializeListHead(
++ *      PLIST_ENTRY ListHead
++ *      );
++ */
++#define INITIALIZE_LIST_HEAD  InitializeListHead
++
++#define InitializeListHead(ListHead) (\
++    (ListHead)->Flink = (ListHead)->Blink = (ListHead))
++
++
++/*
++ *  BOOLEAN
++ *  IsListEmpty(
++ *      PLIST_ENTRY ListHead
++ *      );
++ */
++#define IS_LIST_EMPTY                 IsListEmpty
++
++#define IsListEmpty(ListHead) \
++    ((ListHead)->Flink == (ListHead))
++
++
++/*
++ *  PLIST_ENTRY
++ *  NextListEntry(
++ *      PLIST_ENTRY Entry
++ *      );
++ */
++#define       NEXT_LIST_ENTRY                 NextListEntry
++
++#define NextListEntry(Entry) \
++    (Entry)->Flink
++
++
++/*
++ *  PLIST_ENTRY
++ *  PrevListEntry(
++ *      PLIST_ENTRY Entry
++ *      );
++ */
++#define       PREV_LIST_ENTRY                 PrevListEntry
++
++#define PrevListEntry(Entry) \
++    (Entry)->Blink
++
++
++/*
++ *  PLIST_ENTRY
++ *  TopListEntry(
++ *      PLIST_ENTRY ListHead
++ *      );
++ */
++#define       TOP_LIST_ENTRY                  TopListEntry
++
++#define TopListEntry(ListHead) \
++    (ListHead)->Flink
++
++
++
++/*
++ *  PLIST_ENTRY
++ *  RemoveHeadList(
++ *      PLIST_ENTRY ListHead
++ *      );
++ */
++
++#define       REMOVE_HEAD_LIST                RemoveHeadList
++
++#define RemoveHeadList(ListHead) \
++    (ListHead)->Flink;\
++    {RemoveEntryList((ListHead)->Flink)}
++
++
++/*
++ *  PLIST_ENTRY
++ *  RemoveTailList(
++ *      PLIST_ENTRY ListHead
++ *      );
++ */
++#define       REMOVE_TAIL_LIST                RemoveTailList
++
++#define RemoveTailList(ListHead) \
++    (ListHead)->Blink;\
++    {RemoveEntryList((ListHead)->Blink)}
++
++
++/*
++ *  VOID
++ *  RemoveEntryList(
++ *      PLIST_ENTRY Entry
++ *      );
++ */
++#define       REMOVE_ENTRY_LIST               RemoveEntryList
++
++#define RemoveEntryList(Entry) {\
++    PLIST_ENTRY _EX_Flink = (Entry)->Flink;\
++    PLIST_ENTRY _EX_Blink = (Entry)->Blink;\
++    _EX_Blink->Flink = _EX_Flink;\
++    _EX_Flink->Blink = _EX_Blink;\
++      }
++
++
++/*
++ *  VOID
++ *  AttachList(
++ *      PLIST_ENTRY ListHead,
++ *      PLIST_ENTRY ListEntry
++ *      );
++ */
++#define       ATTACH_LIST             AttachList
++
++#define AttachList(ListHead,ListEntry) {\
++    PLIST_ENTRY _EX_ListHead = (ListHead);\
++    PLIST_ENTRY _EX_Blink = (ListHead)->Blink;\
++    (ListEntry)->Blink->Flink = _EX_ListHead;\
++    _EX_Blink->Flink = (ListEntry);\
++    _EX_ListHead->Blink = (ListEntry)->Blink;\
++    (ListEntry)->Blink = _EX_Blink;\
++    }
++
++
++
++/*
++ *  VOID
++ *  InsertTailList(
++ *      PLIST_ENTRY ListHead,
++ *      PLIST_ENTRY Entry
++ *      );
++ */
++
++#define       INSERT_TAIL_LIST                InsertTailList
++
++#define InsertTailList(ListHead,Entry) {\
++    PLIST_ENTRY _EX_ListHead = (ListHead);\
++    PLIST_ENTRY _EX_Blink = (ListHead)->Blink;\
++    (Entry)->Flink = _EX_ListHead;\
++    (Entry)->Blink = _EX_Blink;\
++    _EX_Blink->Flink = (Entry);\
++    _EX_ListHead->Blink = (Entry);\
++    }
++
++
++/*
++ *  VOID
++ *  InsertHeadList(
++ *      PLIST_ENTRY ListHead,
++ *      PLIST_ENTRY Entry
++ *      );
++ */
++#define       INSERT_HEAD_LIST                InsertHeadList
++
++#define InsertHeadList(ListHead,Entry) {\
++    PLIST_ENTRY _EX_ListHead = (ListHead);\
++    PLIST_ENTRY _EX_Flink = (ListHead)->Flink;\
++    (Entry)->Flink = _EX_Flink;\
++    (Entry)->Blink = _EX_ListHead;\
++    _EX_Flink->Blink = (Entry);\
++    _EX_ListHead->Flink = (Entry);\
++    }
++
++
++/*
++ *  VOID
++ *  IterateListEntries(
++ *      PLIST_ENTRY anchor,
++ *      PLIST_ENTRY index,
++ *            PLIST_ENTRY listp
++ *      );
++ */
++
++#define       ITERATE_LIST_ENTRIES    IterateListEntries
++
++#define IterateListEntries(anchor, index, listp) \
++      (anchor) = (LIST_ENTRY *)(listp); \
++      for((index) = (anchor)->Flink; (index) != (anchor); (index) = (index)->Flink)
++
++
++
++/*
++ *  PSINGLE_LIST_ENTRY
++ *  PopEntryList(
++ *      PSINGLE_LIST_ENTRY ListHead
++ *      );
++ */
++
++#define       POP_ENTRY_LIST          PopEntryList
++
++#define PopEntryList(ListHead) \
++    (ListHead)->Next;\
++    {\
++        PSINGLE_LIST_ENTRY FirstEntry;\
++        FirstEntry = (ListHead)->Next;\
++        if (FirstEntry != NULL) {     \
++            (ListHead)->Next = FirstEntry->Next;\
++        }                             \
++    }
++
++
++
++/*
++ *  VOID
++ *  PushEntryList(
++ *      PSINGLE_LIST_ENTRY ListHead,
++ *            PSINGLE_LIST_ENTRY Entry
++ *      );
++ */
++
++#define       PUSH_ENTRY_LIST                 PushEntryList
++
++#define PushEntryList(ListHead,Entry) \
++    (Entry)->Next = (ListHead)->Next; \
++    (ListHead)->Next = (Entry)
++
++#ifndef CONTAINING_RECORD
++#define CONTAINING_RECORD(address, type, field) ((type *)( \
++                                                  (PCHAR)(address) - \
++                                                  (PCHAR)(&((type *)0)->field)))
++#endif /* CONTAINING_RECORD */
++
++#endif /* _LIST_H_ */
++
++/* EOF */
+--- /dev/null
++++ b/drivers/staging/hv/include/nvspprotocol.h
+@@ -0,0 +1,306 @@
++/*
++ *
++ * Copyright (c) 2009, Microsoft Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Authors:
++ *   Haiyang Zhang <haiyangz@microsoft.com>
++ *   Hank Janssen  <hjanssen@microsoft.com>
++ *
++ */
++
++
++#pragma once
++
++#include <VmbusChannelInterface.h>
++
++#define NVSP_INVALID_PROTOCOL_VERSION           ((UINT32)0xFFFFFFFF)
++
++#define NVSP_PROTOCOL_VERSION_1                 2
++#define NVSP_MIN_PROTOCOL_VERSION               NVSP_PROTOCOL_VERSION_1
++#define NVSP_MAX_PROTOCOL_VERSION               NVSP_PROTOCOL_VERSION_1
++
++typedef enum _NVSP_MESSAGE_TYPE
++{
++    NvspMessageTypeNone = 0,
++
++    //
++    // Init Messages
++    //
++    NvspMessageTypeInit                         = 1,
++    NvspMessageTypeInitComplete                 = 2,
++
++    NvspVersionMessageStart                     = 100,
++
++    //
++    // Version 1 Messages
++    //
++    NvspMessage1TypeSendNdisVersion             = NvspVersionMessageStart,
++
++    NvspMessage1TypeSendReceiveBuffer,
++    NvspMessage1TypeSendReceiveBufferComplete,
++    NvspMessage1TypeRevokeReceiveBuffer,
++
++    NvspMessage1TypeSendSendBuffer,
++    NvspMessage1TypeSendSendBufferComplete,
++    NvspMessage1TypeRevokeSendBuffer,
++
++    NvspMessage1TypeSendRNDISPacket,
++    NvspMessage1TypeSendRNDISPacketComplete,
++
++    //
++    // This should be set to the number of messages for the version
++    // with the maximum number of messages.
++    //
++    NvspNumMessagePerVersion                    = 9,
++
++} NVSP_MESSAGE_TYPE, *PNVSP_MESSAGE_TYPE;
++
++typedef enum _NVSP_STATUS
++{
++    NvspStatusNone = 0,
++    NvspStatusSuccess,
++    NvspStatusFailure,
++    NvspStatusProtocolVersionRangeTooNew,
++    NvspStatusProtocolVersionRangeTooOld,
++    NvspStatusInvalidRndisPacket,
++    NvspStatusBusy,
++    NvspStatusMax,
++} NVSP_STATUS, *PNVSP_STATUS;
++
++#pragma pack(push, 1)
++
++typedef struct _NVSP_MESSAGE_HEADER
++{
++    UINT32                                  MessageType;
++} NVSP_MESSAGE_HEADER, *PNVSP_MESSAGE_HEADER;
++
++//
++// Init Messages
++//
++
++//
++// This message is used by the VSC to initialize the channel
++// after the channels has been opened. This message should
++// never include anything other then versioning (i.e. this
++// message will be the same for ever).
++//
++typedef struct _NVSP_MESSAGE_INIT
++{
++    UINT32                                  MinProtocolVersion;
++    UINT32                                  MaxProtocolVersion;
++} NVSP_MESSAGE_INIT, *PNVSP_MESSAGE_INIT;
++
++//
++// This message is used by the VSP to complete the initialization
++// of the channel. This message should never include anything other
++// then versioning (i.e. this message will be the same for ever).
++//
++typedef struct _NVSP_MESSAGE_INIT_COMPLETE
++{
++    UINT32                                  NegotiatedProtocolVersion;
++    UINT32                                  MaximumMdlChainLength;
++    UINT32                                  Status;
++} NVSP_MESSAGE_INIT_COMPLETE, *PNVSP_MESSAGE_INIT_COMPLETE;
++
++typedef union _NVSP_MESSAGE_INIT_UBER
++{
++    NVSP_MESSAGE_INIT                       Init;
++    NVSP_MESSAGE_INIT_COMPLETE              InitComplete;
++} NVSP_MESSAGE_INIT_UBER;
++
++//
++// Version 1 Messages
++//
++
++//
++// This message is used by the VSC to send the NDIS version
++// to the VSP. The VSP can use this information when handling
++// OIDs sent by the VSC.
++//
++typedef struct _NVSP_1_MESSAGE_SEND_NDIS_VERSION
++{
++    UINT32                                  NdisMajorVersion;
++    UINT32                                  NdisMinorVersion;
++} NVSP_1_MESSAGE_SEND_NDIS_VERSION, *PNVSP_1_MESSAGE_SEND_NDIS_VERSION;
++
++//
++// This message is used by the VSC to send a receive buffer
++// to the VSP. The VSP can then use the receive buffer to
++// send data to the VSC.
++//
++typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER
++{
++    GPADL_HANDLE                            GpadlHandle;
++    UINT16                                  Id;
++} NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER;
++
++typedef struct _NVSP_1_RECEIVE_BUFFER_SECTION
++{
++    UINT32                                  Offset;
++    UINT32                                  SubAllocationSize;
++    UINT32                                  NumSubAllocations;
++    UINT32                                  EndOffset;
++} NVSP_1_RECEIVE_BUFFER_SECTION, *PNVSP_1_RECEIVE_BUFFER_SECTION;
++
++//
++// This message is used by the VSP to acknowledge a receive
++// buffer send by the VSC. This message must be sent by the
++// VSP before the VSP uses the receive buffer.
++//
++typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE
++{
++    UINT32                                  Status;
++    UINT32                                  NumSections;
++
++    //
++    // The receive buffer is split into two parts, a large
++    // suballocation section and a small suballocation
++    // section. These sections are then suballocated by a
++    // certain size.
++    //
++    // For example, the following break up of the receive
++    // buffer has 6 large suballocations and 10 small
++    // suballocations.
++    //
++    // |            Large Section          |  |   Small Section   |
++    // ------------------------------------------------------------
++    // |     |     |     |     |     |     |  | | | | | | | | | | |
++    // |                                      |
++    // LargeOffset                            SmallOffset
++    //
++    NVSP_1_RECEIVE_BUFFER_SECTION           Sections[1];
++
++} NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE;
++
++//
++// This message is sent by the VSC to revoke the receive buffer.
++// After the VSP completes this transaction, the vsp should never
++// use the receive buffer again.
++//
++typedef struct _NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER
++{
++    UINT16                                  Id;
++} NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER;
++
++//
++// This message is used by the VSC to send a send buffer
++// to the VSP. The VSC can then use the send buffer to
++// send data to the VSP.
++//
++typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER
++{
++    GPADL_HANDLE                            GpadlHandle;
++    UINT16                                  Id;
++} NVSP_1_MESSAGE_SEND_SEND_BUFFER, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER;
++
++//
++// This message is used by the VSP to acknowledge a send
++// buffer sent by the VSC. This message must be sent by the
++// VSP before the VSP uses the sent buffer.
++//
++typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE
++{
++    UINT32                                  Status;
++
++    //
++    // The VSC gets to choose the size of the send buffer and
++    // the VSP gets to choose the sections size of the buffer.
++    // This was done to enable dynamic reconfigurations when
++    // the cost of GPA-direct buffers decreases.
++    //
++    UINT32                                  SectionSize;
++} NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE;
++
++//
++// This message is sent by the VSC to revoke the send buffer.
++// After the VSP completes this transaction, the vsp should never
++// use the send buffer again.
++//
++typedef struct _NVSP_1_MESSAGE_REVOKE_SEND_BUFFER
++{
++    UINT16                                  Id;
++} NVSP_1_MESSAGE_REVOKE_SEND_BUFFER, *PNVSP_1_MESSAGE_REVOKE_SEND_BUFFER;
++
++//
++// This message is used by both the VSP and the VSC to send
++// a RNDIS message to the opposite channel endpoint.
++//
++typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET
++{
++    //
++    // This field is specified by RNIDS. They assume there's
++    // two different channels of communication. However,
++    // the Network VSP only has one. Therefore, the channel
++    // travels with the RNDIS packet.
++    //
++    UINT32                                  ChannelType;
++
++    //
++    // This field is used to send part or all of the data
++    // through a send buffer. This values specifies an
++    // index into the send buffer. If the index is
++    // 0xFFFFFFFF, then the send buffer is not being used
++    // and all of the data was sent through other VMBus
++    // mechanisms.
++    //
++    UINT32                                  SendBufferSectionIndex;
++    UINT32                                  SendBufferSectionSize;
++} NVSP_1_MESSAGE_SEND_RNDIS_PACKET, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET;
++
++//
++// This message is used by both the VSP and the VSC to complete
++// a RNDIS message to the opposite channel endpoint. At this
++// point, the initiator of this message cannot use any resources
++// associated with the original RNDIS packet.
++//
++typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE
++{
++    UINT32                                  Status;
++} NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE;
++
++typedef union _NVSP_MESSAGE_1_UBER
++{
++    NVSP_1_MESSAGE_SEND_NDIS_VERSION            SendNdisVersion;
++
++    NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER          SendReceiveBuffer;
++    NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE SendReceiveBufferComplete;
++    NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER        RevokeReceiveBuffer;
++
++    NVSP_1_MESSAGE_SEND_SEND_BUFFER             SendSendBuffer;
++    NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE    SendSendBufferComplete;
++    NVSP_1_MESSAGE_REVOKE_SEND_BUFFER           RevokeSendBuffer;
++
++    NVSP_1_MESSAGE_SEND_RNDIS_PACKET            SendRNDISPacket;
++    NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE   SendRNDISPacketComplete;
++} NVSP_1_MESSAGE_UBER;
++
++typedef union _NVSP_ALL_MESSAGES
++{
++    NVSP_MESSAGE_INIT_UBER                  InitMessages;
++    NVSP_1_MESSAGE_UBER                     Version1Messages;
++
++} NVSP_ALL_MESSAGES;
++
++//
++// ALL Messages
++//
++typedef struct _NVSP_MESSAGE
++{
++    NVSP_MESSAGE_HEADER                     Header;
++    NVSP_ALL_MESSAGES                       Messages;
++} NVSP_MESSAGE, *PNVSP_MESSAGE;
++
++#pragma pack(pop)
+--- /dev/null
++++ b/drivers/staging/hv/include/rndis.h
+@@ -0,0 +1,836 @@
++/*
++ *
++ * Copyright (c) 2009, Microsoft Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Authors:
++ *   Haiyang Zhang <haiyangz@microsoft.com>
++ *   Hank Janssen  <hjanssen@microsoft.com>
++ *
++ */
++
++
++#ifndef _RNDIS_H_
++#define _RNDIS_H_
++
++//
++//  Basic types
++//
++typedef UINT32                                  RNDIS_REQUEST_ID;
++typedef UINT32                                  RNDIS_HANDLE;
++typedef UINT32                                  RNDIS_STATUS;
++typedef UINT32                                  RNDIS_REQUEST_TYPE;
++typedef UINT32                                  RNDIS_OID;
++typedef UINT32                                  RNDIS_CLASS_ID;
++typedef UINT32                                  RNDIS_MEDIUM;
++typedef UINT32                                  *PRNDIS_REQUEST_ID;
++typedef UINT32                                  *PRNDIS_HANDLE;
++typedef UINT32                                  *PRNDIS_STATUS;
++typedef UINT32                                  *PRNDIS_REQUEST_TYPE;
++typedef UINT32                                  *PRNDIS_OID;
++typedef UINT32                                  *PRNDIS_CLASS_ID;
++typedef UINT32                                  *PRNDIS_MEDIUM;
++typedef UINT32                                  RNDIS_AF;
++
++//
++//  Status codes
++//
++
++#ifndef STATUS_SUCCESS
++#define STATUS_SUCCESS                          (0x00000000L)
++#endif
++
++#ifndef STATUS_UNSUCCESSFUL
++#define STATUS_UNSUCCESSFUL                     (0xC0000001L)
++#endif
++
++#ifndef STATUS_PENDING
++#define STATUS_PENDING                          (0x00000103L)
++#endif
++
++#ifndef STATUS_INSUFFICIENT_RESOURCES
++#define STATUS_INSUFFICIENT_RESOURCES           (0xC000009AL)
++#endif
++
++#ifndef STATUS_BUFFER_OVERFLOW
++#define STATUS_BUFFER_OVERFLOW                  (0x80000005L)
++#endif
++
++#ifndef STATUS_NOT_SUPPORTED
++#define STATUS_NOT_SUPPORTED                    (0xC00000BBL)
++#endif
++
++#define RNDIS_STATUS_SUCCESS                    ((RNDIS_STATUS)STATUS_SUCCESS)
++#define RNDIS_STATUS_PENDING                    ((RNDIS_STATUS)STATUS_PENDING)
++#define RNDIS_STATUS_NOT_RECOGNIZED             ((RNDIS_STATUS)0x00010001L)
++#define RNDIS_STATUS_NOT_COPIED                 ((RNDIS_STATUS)0x00010002L)
++#define RNDIS_STATUS_NOT_ACCEPTED               ((RNDIS_STATUS)0x00010003L)
++#define RNDIS_STATUS_CALL_ACTIVE                ((RNDIS_STATUS)0x00010007L)
++
++#define RNDIS_STATUS_ONLINE                     ((RNDIS_STATUS)0x40010003L)
++#define RNDIS_STATUS_RESET_START                ((RNDIS_STATUS)0x40010004L)
++#define RNDIS_STATUS_RESET_END                  ((RNDIS_STATUS)0x40010005L)
++#define RNDIS_STATUS_RING_STATUS                ((RNDIS_STATUS)0x40010006L)
++#define RNDIS_STATUS_CLOSED                     ((RNDIS_STATUS)0x40010007L)
++#define RNDIS_STATUS_WAN_LINE_UP                ((RNDIS_STATUS)0x40010008L)
++#define RNDIS_STATUS_WAN_LINE_DOWN              ((RNDIS_STATUS)0x40010009L)
++#define RNDIS_STATUS_WAN_FRAGMENT               ((RNDIS_STATUS)0x4001000AL)
++#define RNDIS_STATUS_MEDIA_CONNECT              ((RNDIS_STATUS)0x4001000BL)
++#define RNDIS_STATUS_MEDIA_DISCONNECT           ((RNDIS_STATUS)0x4001000CL)
++#define RNDIS_STATUS_HARDWARE_LINE_UP           ((RNDIS_STATUS)0x4001000DL)
++#define RNDIS_STATUS_HARDWARE_LINE_DOWN         ((RNDIS_STATUS)0x4001000EL)
++#define RNDIS_STATUS_INTERFACE_UP               ((RNDIS_STATUS)0x4001000FL)
++#define RNDIS_STATUS_INTERFACE_DOWN             ((RNDIS_STATUS)0x40010010L)
++#define RNDIS_STATUS_MEDIA_BUSY                 ((RNDIS_STATUS)0x40010011L)
++#define RNDIS_STATUS_MEDIA_SPECIFIC_INDICATION  ((RNDIS_STATUS)0x40010012L)
++#define RNDIS_STATUS_WW_INDICATION              RNDIS_STATUS_MEDIA_SPECIFIC_INDICATION
++#define RNDIS_STATUS_LINK_SPEED_CHANGE          ((RNDIS_STATUS)0x40010013L)
++
++#define RNDIS_STATUS_NOT_RESETTABLE             ((RNDIS_STATUS)0x80010001L)
++#define RNDIS_STATUS_SOFT_ERRORS                ((RNDIS_STATUS)0x80010003L)
++#define RNDIS_STATUS_HARD_ERRORS                ((RNDIS_STATUS)0x80010004L)
++#define RNDIS_STATUS_BUFFER_OVERFLOW            ((RNDIS_STATUS)STATUS_BUFFER_OVERFLOW)
++
++#define RNDIS_STATUS_FAILURE                    ((RNDIS_STATUS)STATUS_UNSUCCESSFUL)
++#define RNDIS_STATUS_RESOURCES                  ((RNDIS_STATUS)STATUS_INSUFFICIENT_RESOURCES)
++#define RNDIS_STATUS_CLOSING                    ((RNDIS_STATUS)0xC0010002L)
++#define RNDIS_STATUS_BAD_VERSION                ((RNDIS_STATUS)0xC0010004L)
++#define RNDIS_STATUS_BAD_CHARACTERISTICS        ((RNDIS_STATUS)0xC0010005L)
++#define RNDIS_STATUS_ADAPTER_NOT_FOUND          ((RNDIS_STATUS)0xC0010006L)
++#define RNDIS_STATUS_OPEN_FAILED                ((RNDIS_STATUS)0xC0010007L)
++#define RNDIS_STATUS_DEVICE_FAILED              ((RNDIS_STATUS)0xC0010008L)
++#define RNDIS_STATUS_MULTICAST_FULL             ((RNDIS_STATUS)0xC0010009L)
++#define RNDIS_STATUS_MULTICAST_EXISTS           ((RNDIS_STATUS)0xC001000AL)
++#define RNDIS_STATUS_MULTICAST_NOT_FOUND        ((RNDIS_STATUS)0xC001000BL)
++#define RNDIS_STATUS_REQUEST_ABORTED            ((RNDIS_STATUS)0xC001000CL)
++#define RNDIS_STATUS_RESET_IN_PROGRESS          ((RNDIS_STATUS)0xC001000DL)
++#define RNDIS_STATUS_CLOSING_INDICATING         ((RNDIS_STATUS)0xC001000EL)
++#define RNDIS_STATUS_NOT_SUPPORTED              ((RNDIS_STATUS)STATUS_NOT_SUPPORTED)
++#define RNDIS_STATUS_INVALID_PACKET             ((RNDIS_STATUS)0xC001000FL)
++#define RNDIS_STATUS_OPEN_LIST_FULL             ((RNDIS_STATUS)0xC0010010L)
++#define RNDIS_STATUS_ADAPTER_NOT_READY          ((RNDIS_STATUS)0xC0010011L)
++#define RNDIS_STATUS_ADAPTER_NOT_OPEN           ((RNDIS_STATUS)0xC0010012L)
++#define RNDIS_STATUS_NOT_INDICATING             ((RNDIS_STATUS)0xC0010013L)
++#define RNDIS_STATUS_INVALID_LENGTH             ((RNDIS_STATUS)0xC0010014L)
++#define RNDIS_STATUS_INVALID_DATA               ((RNDIS_STATUS)0xC0010015L)
++#define RNDIS_STATUS_BUFFER_TOO_SHORT           ((RNDIS_STATUS)0xC0010016L)
++#define RNDIS_STATUS_INVALID_OID                ((RNDIS_STATUS)0xC0010017L)
++#define RNDIS_STATUS_ADAPTER_REMOVED            ((RNDIS_STATUS)0xC0010018L)
++#define RNDIS_STATUS_UNSUPPORTED_MEDIA          ((RNDIS_STATUS)0xC0010019L)
++#define RNDIS_STATUS_GROUP_ADDRESS_IN_USE       ((RNDIS_STATUS)0xC001001AL)
++#define RNDIS_STATUS_FILE_NOT_FOUND             ((RNDIS_STATUS)0xC001001BL)
++#define RNDIS_STATUS_ERROR_READING_FILE         ((RNDIS_STATUS)0xC001001CL)
++#define RNDIS_STATUS_ALREADY_MAPPED             ((RNDIS_STATUS)0xC001001DL)
++#define RNDIS_STATUS_RESOURCE_CONFLICT          ((RNDIS_STATUS)0xC001001EL)
++#define RNDIS_STATUS_NO_CABLE                   ((RNDIS_STATUS)0xC001001FL)
++
++#define RNDIS_STATUS_INVALID_SAP                ((RNDIS_STATUS)0xC0010020L)
++#define RNDIS_STATUS_SAP_IN_USE                 ((RNDIS_STATUS)0xC0010021L)
++#define RNDIS_STATUS_INVALID_ADDRESS            ((RNDIS_STATUS)0xC0010022L)
++#define RNDIS_STATUS_VC_NOT_ACTIVATED           ((RNDIS_STATUS)0xC0010023L)
++#define RNDIS_STATUS_DEST_OUT_OF_ORDER          ((RNDIS_STATUS)0xC0010024L)
++#define RNDIS_STATUS_VC_NOT_AVAILABLE           ((RNDIS_STATUS)0xC0010025L)
++#define RNDIS_STATUS_CELLRATE_NOT_AVAILABLE     ((RNDIS_STATUS)0xC0010026L)
++#define RNDIS_STATUS_INCOMPATABLE_QOS           ((RNDIS_STATUS)0xC0010027L)
++#define RNDIS_STATUS_AAL_PARAMS_UNSUPPORTED     ((RNDIS_STATUS)0xC0010028L)
++#define RNDIS_STATUS_NO_ROUTE_TO_DESTINATION    ((RNDIS_STATUS)0xC0010029L)
++
++#define RNDIS_STATUS_TOKEN_RING_OPEN_ERROR      ((RNDIS_STATUS)0xC0011000L)
++
++
++//
++// Object Identifiers used by NdisRequest Query/Set Information
++//
++
++//
++// General Objects
++//
++
++#define RNDIS_OID_GEN_SUPPORTED_LIST                    0x00010101
++#define RNDIS_OID_GEN_HARDWARE_STATUS                   0x00010102
++#define RNDIS_OID_GEN_MEDIA_SUPPORTED                   0x00010103
++#define RNDIS_OID_GEN_MEDIA_IN_USE                      0x00010104
++#define RNDIS_OID_GEN_MAXIMUM_LOOKAHEAD                 0x00010105
++#define RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE                0x00010106
++#define RNDIS_OID_GEN_LINK_SPEED                        0x00010107
++#define RNDIS_OID_GEN_TRANSMIT_BUFFER_SPACE             0x00010108
++#define RNDIS_OID_GEN_RECEIVE_BUFFER_SPACE              0x00010109
++#define RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE               0x0001010A
++#define RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE                0x0001010B
++#define RNDIS_OID_GEN_VENDOR_ID                         0x0001010C
++#define RNDIS_OID_GEN_VENDOR_DESCRIPTION                0x0001010D
++#define RNDIS_OID_GEN_CURRENT_PACKET_FILTER             0x0001010E
++#define RNDIS_OID_GEN_CURRENT_LOOKAHEAD                 0x0001010F
++#define RNDIS_OID_GEN_DRIVER_VERSION                    0x00010110
++#define RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE                0x00010111
++#define RNDIS_OID_GEN_PROTOCOL_OPTIONS                  0x00010112
++#define RNDIS_OID_GEN_MAC_OPTIONS                       0x00010113
++#define RNDIS_OID_GEN_MEDIA_CONNECT_STATUS              0x00010114
++#define RNDIS_OID_GEN_MAXIMUM_SEND_PACKETS              0x00010115
++#define RNDIS_OID_GEN_VENDOR_DRIVER_VERSION             0x00010116
++#define RNDIS_OID_GEN_NETWORK_LAYER_ADDRESSES           0x00010118
++#define RNDIS_OID_GEN_TRANSPORT_HEADER_OFFSET           0x00010119
++#define RNDIS_OID_GEN_MACHINE_NAME                      0x0001021A
++#define RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER            0x0001021B
++
++#define RNDIS_OID_GEN_XMIT_OK                           0x00020101
++#define RNDIS_OID_GEN_RCV_OK                            0x00020102
++#define RNDIS_OID_GEN_XMIT_ERROR                        0x00020103
++#define RNDIS_OID_GEN_RCV_ERROR                         0x00020104
++#define RNDIS_OID_GEN_RCV_NO_BUFFER                     0x00020105
++
++#define RNDIS_OID_GEN_DIRECTED_BYTES_XMIT               0x00020201
++#define RNDIS_OID_GEN_DIRECTED_FRAMES_XMIT              0x00020202
++#define RNDIS_OID_GEN_MULTICAST_BYTES_XMIT              0x00020203
++#define RNDIS_OID_GEN_MULTICAST_FRAMES_XMIT             0x00020204
++#define RNDIS_OID_GEN_BROADCAST_BYTES_XMIT              0x00020205
++#define RNDIS_OID_GEN_BROADCAST_FRAMES_XMIT             0x00020206
++#define RNDIS_OID_GEN_DIRECTED_BYTES_RCV                0x00020207
++#define RNDIS_OID_GEN_DIRECTED_FRAMES_RCV               0x00020208
++#define RNDIS_OID_GEN_MULTICAST_BYTES_RCV               0x00020209
++#define RNDIS_OID_GEN_MULTICAST_FRAMES_RCV              0x0002020A
++#define RNDIS_OID_GEN_BROADCAST_BYTES_RCV               0x0002020B
++#define RNDIS_OID_GEN_BROADCAST_FRAMES_RCV              0x0002020C
++
++#define RNDIS_OID_GEN_RCV_CRC_ERROR                     0x0002020D
++#define RNDIS_OID_GEN_TRANSMIT_QUEUE_LENGTH             0x0002020E
++
++#define RNDIS_OID_GEN_GET_TIME_CAPS                     0x0002020F
++#define RNDIS_OID_GEN_GET_NETCARD_TIME                  0x00020210
++
++//
++// These are connection-oriented general OIDs.
++// These replace the above OIDs for connection-oriented media.
++//
++#define RNDIS_OID_GEN_CO_SUPPORTED_LIST                 0x00010101
++#define RNDIS_OID_GEN_CO_HARDWARE_STATUS                0x00010102
++#define RNDIS_OID_GEN_CO_MEDIA_SUPPORTED                0x00010103
++#define RNDIS_OID_GEN_CO_MEDIA_IN_USE                   0x00010104
++#define RNDIS_OID_GEN_CO_LINK_SPEED                     0x00010105
++#define RNDIS_OID_GEN_CO_VENDOR_ID                      0x00010106
++#define RNDIS_OID_GEN_CO_VENDOR_DESCRIPTION             0x00010107
++#define RNDIS_OID_GEN_CO_DRIVER_VERSION                 0x00010108
++#define RNDIS_OID_GEN_CO_PROTOCOL_OPTIONS               0x00010109
++#define RNDIS_OID_GEN_CO_MAC_OPTIONS                    0x0001010A
++#define RNDIS_OID_GEN_CO_MEDIA_CONNECT_STATUS           0x0001010B
++#define RNDIS_OID_GEN_CO_VENDOR_DRIVER_VERSION          0x0001010C
++#define RNDIS_OID_GEN_CO_MINIMUM_LINK_SPEED             0x0001010D
++
++#define RNDIS_OID_GEN_CO_GET_TIME_CAPS                  0x00010201
++#define RNDIS_OID_GEN_CO_GET_NETCARD_TIME               0x00010202
++
++//
++// These are connection-oriented statistics OIDs.
++//
++#define RNDIS_OID_GEN_CO_XMIT_PDUS_OK                   0x00020101
++#define RNDIS_OID_GEN_CO_RCV_PDUS_OK                    0x00020102
++#define RNDIS_OID_GEN_CO_XMIT_PDUS_ERROR                0x00020103
++#define RNDIS_OID_GEN_CO_RCV_PDUS_ERROR                 0x00020104
++#define RNDIS_OID_GEN_CO_RCV_PDUS_NO_BUFFER             0x00020105
++
++
++#define RNDIS_OID_GEN_CO_RCV_CRC_ERROR                  0x00020201
++#define RNDIS_OID_GEN_CO_TRANSMIT_QUEUE_LENGTH          0x00020202
++#define RNDIS_OID_GEN_CO_BYTES_XMIT                     0x00020203
++#define RNDIS_OID_GEN_CO_BYTES_RCV                      0x00020204
++#define RNDIS_OID_GEN_CO_BYTES_XMIT_OUTSTANDING         0x00020205
++#define RNDIS_OID_GEN_CO_NETCARD_LOAD                   0x00020206
++
++//
++// These are objects for Connection-oriented media call-managers.
++//
++#define RNDIS_OID_CO_ADD_PVC                            0xFF000001
++#define RNDIS_OID_CO_DELETE_PVC                         0xFF000002
++#define RNDIS_OID_CO_GET_CALL_INFORMATION               0xFF000003
++#define RNDIS_OID_CO_ADD_ADDRESS                        0xFF000004
++#define RNDIS_OID_CO_DELETE_ADDRESS                     0xFF000005
++#define RNDIS_OID_CO_GET_ADDRESSES                      0xFF000006
++#define RNDIS_OID_CO_ADDRESS_CHANGE                     0xFF000007
++#define RNDIS_OID_CO_SIGNALING_ENABLED                  0xFF000008
++#define RNDIS_OID_CO_SIGNALING_DISABLED                 0xFF000009
++
++
++//
++// 802.3 Objects (Ethernet)
++//
++
++#define RNDIS_OID_802_3_PERMANENT_ADDRESS               0x01010101
++#define RNDIS_OID_802_3_CURRENT_ADDRESS                 0x01010102
++#define RNDIS_OID_802_3_MULTICAST_LIST                  0x01010103
++#define RNDIS_OID_802_3_MAXIMUM_LIST_SIZE               0x01010104
++#define RNDIS_OID_802_3_MAC_OPTIONS                     0x01010105
++
++//
++//
++#define NDIS_802_3_MAC_OPTION_PRIORITY                  0x00000001
++
++#define RNDIS_OID_802_3_RCV_ERROR_ALIGNMENT             0x01020101
++#define RNDIS_OID_802_3_XMIT_ONE_COLLISION              0x01020102
++#define RNDIS_OID_802_3_XMIT_MORE_COLLISIONS            0x01020103
++
++#define RNDIS_OID_802_3_XMIT_DEFERRED                   0x01020201
++#define RNDIS_OID_802_3_XMIT_MAX_COLLISIONS             0x01020202
++#define RNDIS_OID_802_3_RCV_OVERRUN                     0x01020203
++#define RNDIS_OID_802_3_XMIT_UNDERRUN                   0x01020204
++#define RNDIS_OID_802_3_XMIT_HEARTBEAT_FAILURE          0x01020205
++#define RNDIS_OID_802_3_XMIT_TIMES_CRS_LOST             0x01020206
++#define RNDIS_OID_802_3_XMIT_LATE_COLLISIONS            0x01020207
++
++
++//
++// Remote NDIS message types
++//
++#define REMOTE_NDIS_PACKET_MSG                  0x00000001
++#define REMOTE_NDIS_INITIALIZE_MSG              0x00000002
++#define REMOTE_NDIS_HALT_MSG                    0x00000003
++#define REMOTE_NDIS_QUERY_MSG                   0x00000004
++#define REMOTE_NDIS_SET_MSG                     0x00000005
++#define REMOTE_NDIS_RESET_MSG                   0x00000006
++#define REMOTE_NDIS_INDICATE_STATUS_MSG         0x00000007
++#define REMOTE_NDIS_KEEPALIVE_MSG               0x00000008
++
++#define REMOTE_CONDIS_MP_CREATE_VC_MSG          0x00008001
++#define REMOTE_CONDIS_MP_DELETE_VC_MSG          0x00008002
++#define REMOTE_CONDIS_MP_ACTIVATE_VC_MSG        0x00008005
++#define REMOTE_CONDIS_MP_DEACTIVATE_VC_MSG      0x00008006
++#define REMOTE_CONDIS_INDICATE_STATUS_MSG       0x00008007
++
++
++// Remote NDIS message completion types
++#define REMOTE_NDIS_INITIALIZE_CMPLT            0x80000002
++#define REMOTE_NDIS_QUERY_CMPLT                 0x80000004
++#define REMOTE_NDIS_SET_CMPLT                   0x80000005
++#define REMOTE_NDIS_RESET_CMPLT                 0x80000006
++#define REMOTE_NDIS_KEEPALIVE_CMPLT             0x80000008
++
++#define REMOTE_CONDIS_MP_CREATE_VC_CMPLT        0x80008001
++#define REMOTE_CONDIS_MP_DELETE_VC_CMPLT        0x80008002
++#define REMOTE_CONDIS_MP_ACTIVATE_VC_CMPLT      0x80008005
++#define REMOTE_CONDIS_MP_DEACTIVATE_VC_CMPLT    0x80008006
++
++//
++// Reserved message type for private communication between lower-layer
++// host driver and remote device, if necessary.
++//
++#define REMOTE_NDIS_BUS_MSG                     0xff000001
++
++
++
++//
++//  Defines for DeviceFlags in RNDIS_INITIALIZE_COMPLETE
++//
++#define RNDIS_DF_CONNECTIONLESS             0x00000001
++#define RNDIS_DF_CONNECTION_ORIENTED        0x00000002
++#define RNDIS_DF_RAW_DATA                   0x00000004
++
++//
++//  Remote NDIS medium types.
++//
++#define RNdisMedium802_3                    0x00000000
++#define RNdisMedium802_5                    0x00000001
++#define RNdisMediumFddi                     0x00000002
++#define RNdisMediumWan                      0x00000003
++#define RNdisMediumLocalTalk                0x00000004
++#define RNdisMediumArcnetRaw                0x00000006
++#define RNdisMediumArcnet878_2              0x00000007
++#define RNdisMediumAtm                      0x00000008
++#define RNdisMediumWirelessWan              0x00000009
++#define RNdisMediumIrda                     0x0000000a
++#define RNdisMediumCoWan                    0x0000000b
++#define RNdisMediumMax                      0x0000000d     // Not a real medium, defined as an upper-bound
++
++//
++// Remote NDIS medium connection states.
++//
++#define RNdisMediaStateConnected            0x00000000
++#define RNdisMediaStateDisconnected         0x00000001
++
++//
++//  Remote NDIS version numbers
++//
++#define RNDIS_MAJOR_VERSION                 0x00000001
++#define RNDIS_MINOR_VERSION                 0x00000000
++
++//
++//  NdisInitialize message
++//
++typedef struct _RNDIS_INITIALIZE_REQUEST
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    UINT32                                  MajorVersion;
++    UINT32                                  MinorVersion;
++    UINT32                                  MaxTransferSize;
++} RNDIS_INITIALIZE_REQUEST, *PRNDIS_INITIALIZE_REQUEST;
++
++
++//
++//  Response to NdisInitialize
++//
++typedef struct _RNDIS_INITIALIZE_COMPLETE
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    RNDIS_STATUS                            Status;
++    UINT32                                  MajorVersion;
++    UINT32                                  MinorVersion;
++    UINT32                                  DeviceFlags;
++    RNDIS_MEDIUM                            Medium;
++    UINT32                                  MaxPacketsPerMessage;
++    UINT32                                  MaxTransferSize;
++    UINT32                                  PacketAlignmentFactor;
++    UINT32                                  AFListOffset;
++    UINT32                                  AFListSize;
++} RNDIS_INITIALIZE_COMPLETE, *PRNDIS_INITIALIZE_COMPLETE;
++
++
++//
++//  Call manager devices only: Information about an address family
++//  supported by the device is appended to the response to NdisInitialize.
++//
++typedef struct _RNDIS_CO_ADDRESS_FAMILY
++{
++    RNDIS_AF                                AddressFamily;
++    UINT32                                  MajorVersion;
++    UINT32                                  MinorVersion;
++} RNDIS_CO_ADDRESS_FAMILY, *PRNDIS_CO_ADDRESS_FAMILY;
++
++
++//
++//  NdisHalt message
++//
++typedef struct _RNDIS_HALT_REQUEST
++{
++    RNDIS_REQUEST_ID                        RequestId;
++} RNDIS_HALT_REQUEST, *PRNDIS_HALT_REQUEST;
++
++
++//
++// NdisQueryRequest message
++//
++typedef struct _RNDIS_QUERY_REQUEST
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    RNDIS_OID                               Oid;
++    UINT32                                  InformationBufferLength;
++    UINT32                                  InformationBufferOffset;
++    RNDIS_HANDLE                            DeviceVcHandle;
++} RNDIS_QUERY_REQUEST, *PRNDIS_QUERY_REQUEST;
++
++
++//
++//  Response to NdisQueryRequest
++//
++typedef struct _RNDIS_QUERY_COMPLETE
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    RNDIS_STATUS                            Status;
++    UINT32                                  InformationBufferLength;
++    UINT32                                  InformationBufferOffset;
++} RNDIS_QUERY_COMPLETE, *PRNDIS_QUERY_COMPLETE;
++
++
++//
++//  NdisSetRequest message
++//
++typedef struct _RNDIS_SET_REQUEST
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    RNDIS_OID                               Oid;
++    UINT32                                  InformationBufferLength;
++    UINT32                                  InformationBufferOffset;
++    RNDIS_HANDLE                            DeviceVcHandle;
++} RNDIS_SET_REQUEST, *PRNDIS_SET_REQUEST;
++
++
++//
++//  Response to NdisSetRequest
++//
++typedef struct _RNDIS_SET_COMPLETE
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    RNDIS_STATUS                            Status;
++} RNDIS_SET_COMPLETE, *PRNDIS_SET_COMPLETE;
++
++
++//
++//  NdisReset message
++//
++typedef struct _RNDIS_RESET_REQUEST
++{
++    UINT32                                  Reserved;
++} RNDIS_RESET_REQUEST, *PRNDIS_RESET_REQUEST;
++
++//
++//  Response to NdisReset
++//
++typedef struct _RNDIS_RESET_COMPLETE
++{
++    RNDIS_STATUS                            Status;
++    UINT32                                  AddressingReset;
++} RNDIS_RESET_COMPLETE, *PRNDIS_RESET_COMPLETE;
++
++
++//
++//  NdisMIndicateStatus message
++//
++typedef struct _RNDIS_INDICATE_STATUS
++{
++    RNDIS_STATUS                            Status;
++    UINT32                                  StatusBufferLength;
++    UINT32                                  StatusBufferOffset;
++} RNDIS_INDICATE_STATUS, *PRNDIS_INDICATE_STATUS;
++
++
++//
++//  Diagnostic information passed as the status buffer in
++//  RNDIS_INDICATE_STATUS messages signifying error conditions.
++//
++typedef struct _RNDIS_DIAGNOSTIC_INFO
++{
++    RNDIS_STATUS                            DiagStatus;
++    UINT32                                  ErrorOffset;
++} RNDIS_DIAGNOSTIC_INFO, *PRNDIS_DIAGNOSTIC_INFO;
++
++
++
++//
++//  NdisKeepAlive message
++//
++typedef struct _RNDIS_KEEPALIVE_REQUEST
++{
++    RNDIS_REQUEST_ID                        RequestId;
++} RNDIS_KEEPALIVE_REQUEST, *PRNDIS_KEEPALIVE_REQUEST;
++
++
++//
++// Response to NdisKeepAlive
++//
++typedef struct _RNDIS_KEEPALIVE_COMPLETE
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    RNDIS_STATUS                            Status;
++} RNDIS_KEEPALIVE_COMPLETE, *PRNDIS_KEEPALIVE_COMPLETE;
++
++
++//
++//  Data message. All Offset fields contain byte offsets from the beginning
++//  of the RNDIS_PACKET structure. All Length fields are in bytes.
++//  VcHandle is set to 0 for connectionless data, otherwise it
++//  contains the VC handle.
++//
++typedef struct _RNDIS_PACKET
++{
++    UINT32                                  DataOffset;
++    UINT32                                  DataLength;
++    UINT32                                  OOBDataOffset;
++    UINT32                                  OOBDataLength;
++    UINT32                                  NumOOBDataElements;
++    UINT32                                  PerPacketInfoOffset;
++    UINT32                                  PerPacketInfoLength;
++    RNDIS_HANDLE                            VcHandle;
++    UINT32                                  Reserved;
++} RNDIS_PACKET, *PRNDIS_PACKET;
++
++//
++//  Optional Out of Band data associated with a Data message.
++//
++typedef struct _RNDIS_OOBD
++{
++    UINT32                                  Size;
++    RNDIS_CLASS_ID                          Type;
++    UINT32                                  ClassInformationOffset;
++} RNDIS_OOBD, *PRNDIS_OOBD;
++
++//
++//  Packet extension field contents associated with a Data message.
++//
++typedef struct _RNDIS_PER_PACKET_INFO
++{
++    UINT32                                  Size;
++    UINT32                                  Type;
++    UINT32                                  PerPacketInformationOffset;
++} RNDIS_PER_PACKET_INFO, *PRNDIS_PER_PACKET_INFO;
++
++
++//
++//  Format of Information buffer passed in a SetRequest for the OID
++//  OID_GEN_RNDIS_CONFIG_PARAMETER.
++//
++typedef struct _RNDIS_CONFIG_PARAMETER_INFO
++{
++    UINT32                                  ParameterNameOffset;
++    UINT32                                  ParameterNameLength;
++    UINT32                                  ParameterType;
++    UINT32                                  ParameterValueOffset;
++    UINT32                                  ParameterValueLength;
++} RNDIS_CONFIG_PARAMETER_INFO, *PRNDIS_CONFIG_PARAMETER_INFO;
++
++//
++//  Values for ParameterType in RNDIS_CONFIG_PARAMETER_INFO
++//
++#define RNDIS_CONFIG_PARAM_TYPE_INTEGER     0
++#define RNDIS_CONFIG_PARAM_TYPE_STRING      2
++
++
++//
++//  CONDIS Miniport messages for connection oriented devices
++//  that do not implement a call manager.
++//
++
++//
++//  CoNdisMiniportCreateVc message
++//
++typedef struct _RCONDIS_MP_CREATE_VC
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    RNDIS_HANDLE                            NdisVcHandle;
++} RCONDIS_MP_CREATE_VC, *PRCONDIS_MP_CREATE_VC;
++
++//
++//  Response to CoNdisMiniportCreateVc
++//
++typedef struct _RCONDIS_MP_CREATE_VC_COMPLETE
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    RNDIS_HANDLE                            DeviceVcHandle;
++    RNDIS_STATUS                            Status;
++} RCONDIS_MP_CREATE_VC_COMPLETE, *PRCONDIS_MP_CREATE_VC_COMPLETE;
++
++
++//
++//  CoNdisMiniportDeleteVc message
++//
++typedef struct _RCONDIS_MP_DELETE_VC
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    RNDIS_HANDLE                            DeviceVcHandle;
++} RCONDIS_MP_DELETE_VC, *PRCONDIS_MP_DELETE_VC;
++
++//
++//  Response to CoNdisMiniportDeleteVc
++//
++typedef struct _RCONDIS_MP_DELETE_VC_COMPLETE
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    RNDIS_STATUS                            Status;
++} RCONDIS_MP_DELETE_VC_COMPLETE, *PRCONDIS_MP_DELETE_VC_COMPLETE;
++
++
++//
++//  CoNdisMiniportQueryRequest message
++//
++typedef struct _RCONDIS_MP_QUERY_REQUEST
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    RNDIS_REQUEST_TYPE                      RequestType;
++    RNDIS_OID                               Oid;
++    RNDIS_HANDLE                            DeviceVcHandle;
++    UINT32                                  InformationBufferLength;
++    UINT32                                  InformationBufferOffset;
++} RCONDIS_MP_QUERY_REQUEST, *PRCONDIS_MP_QUERY_REQUEST;
++
++
++//
++//  CoNdisMiniportSetRequest message
++//
++typedef struct _RCONDIS_MP_SET_REQUEST
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    RNDIS_REQUEST_TYPE                      RequestType;
++    RNDIS_OID                               Oid;
++    RNDIS_HANDLE                            DeviceVcHandle;
++    UINT32                                  InformationBufferLength;
++    UINT32                                  InformationBufferOffset;
++} RCONDIS_MP_SET_REQUEST, *PRCONDIS_MP_SET_REQUEST;
++
++
++//
++//  CoNdisIndicateStatus message
++//
++typedef struct _RCONDIS_INDICATE_STATUS
++{
++    RNDIS_HANDLE                            NdisVcHandle;
++    RNDIS_STATUS                            Status;
++    UINT32                                  StatusBufferLength;
++    UINT32                                  StatusBufferOffset;
++} RCONDIS_INDICATE_STATUS, *PRCONDIS_INDICATE_STATUS;
++
++
++//
++//  CONDIS Call/VC parameters
++//
++
++typedef struct _RCONDIS_SPECIFIC_PARAMETERS
++{
++    UINT32                                  ParameterType;
++    UINT32                                  ParameterLength;
++    UINT32                                  ParameterOffset;
++} RCONDIS_SPECIFIC_PARAMETERS, *PRCONDIS_SPECIFIC_PARAMETERS;
++
++typedef struct _RCONDIS_MEDIA_PARAMETERS
++{
++    UINT32                                  Flags;
++    UINT32                                  Reserved1;
++    UINT32                                  Reserved2;
++    RCONDIS_SPECIFIC_PARAMETERS             MediaSpecific;
++} RCONDIS_MEDIA_PARAMETERS, *PRCONDIS_MEDIA_PARAMETERS;
++
++
++typedef struct _RNDIS_FLOWSPEC
++{
++    UINT32                                  TokenRate;
++    UINT32                                  TokenBucketSize;
++    UINT32                                  PeakBandwidth;
++    UINT32                                  Latency;
++    UINT32                                  DelayVariation;
++    UINT32                                  ServiceType;
++    UINT32                                  MaxSduSize;
++    UINT32                                  MinimumPolicedSize;
++} RNDIS_FLOWSPEC, *PRNDIS_FLOWSPEC;
++
++typedef struct _RCONDIS_CALL_MANAGER_PARAMETERS
++{
++    RNDIS_FLOWSPEC                          Transmit;
++    RNDIS_FLOWSPEC                          Receive;
++    RCONDIS_SPECIFIC_PARAMETERS             CallMgrSpecific;
++} RCONDIS_CALL_MANAGER_PARAMETERS, *PRCONDIS_CALL_MANAGER_PARAMETERS;
++
++//
++//  CoNdisMiniportActivateVc message
++//
++typedef struct _RCONDIS_MP_ACTIVATE_VC_REQUEST
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    UINT32                                  Flags;
++    RNDIS_HANDLE                            DeviceVcHandle;
++    UINT32                                  MediaParamsOffset;
++    UINT32                                  MediaParamsLength;
++    UINT32                                  CallMgrParamsOffset;
++    UINT32                                  CallMgrParamsLength;
++} RCONDIS_MP_ACTIVATE_VC_REQUEST, *PRCONDIS_MP_ACTIVATE_VC_REQUEST;
++
++//
++//  Response to CoNdisMiniportActivateVc
++//
++typedef struct _RCONDIS_MP_ACTIVATE_VC_COMPLETE
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    RNDIS_STATUS                            Status;
++} RCONDIS_MP_ACTIVATE_VC_COMPLETE, *PRCONDIS_MP_ACTIVATE_VC_COMPLETE;
++
++
++//
++//  CoNdisMiniportDeactivateVc message
++//
++typedef struct _RCONDIS_MP_DEACTIVATE_VC_REQUEST
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    UINT32                                  Flags;
++    RNDIS_HANDLE                            DeviceVcHandle;
++} RCONDIS_MP_DEACTIVATE_VC_REQUEST, *PRCONDIS_MP_DEACTIVATE_VC_REQUEST;
++
++//
++//  Response to CoNdisMiniportDeactivateVc
++//
++typedef struct _RCONDIS_MP_DEACTIVATE_VC_COMPLETE
++{
++    RNDIS_REQUEST_ID                        RequestId;
++    RNDIS_STATUS                            Status;
++} RCONDIS_MP_DEACTIVATE_VC_COMPLETE, *PRCONDIS_MP_DEACTIVATE_VC_COMPLETE;
++
++
++//
++// union with all of the RNDIS messages
++//
++typedef union _RNDIS_MESSAGE_CONTAINER
++{
++    RNDIS_PACKET                        Packet;
++    RNDIS_INITIALIZE_REQUEST            InitializeRequest;
++    RNDIS_HALT_REQUEST                  HaltRequest;
++    RNDIS_QUERY_REQUEST                 QueryRequest;
++    RNDIS_SET_REQUEST                   SetRequest;
++    RNDIS_RESET_REQUEST                 ResetRequest;
++    RNDIS_KEEPALIVE_REQUEST             KeepaliveRequest;
++    RNDIS_INDICATE_STATUS               IndicateStatus;
++    RNDIS_INITIALIZE_COMPLETE           InitializeComplete;
++    RNDIS_QUERY_COMPLETE                QueryComplete;
++    RNDIS_SET_COMPLETE                  SetComplete;
++    RNDIS_RESET_COMPLETE                ResetComplete;
++    RNDIS_KEEPALIVE_COMPLETE            KeepaliveComplete;
++    RCONDIS_MP_CREATE_VC                CoMiniportCreateVc;
++    RCONDIS_MP_DELETE_VC                CoMiniportDeleteVc;
++    RCONDIS_INDICATE_STATUS             CoIndicateStatus;
++    RCONDIS_MP_ACTIVATE_VC_REQUEST      CoMiniportActivateVc;
++    RCONDIS_MP_DEACTIVATE_VC_REQUEST    CoMiniportDeactivateVc;
++    RCONDIS_MP_CREATE_VC_COMPLETE       CoMiniportCreateVcComplete;
++    RCONDIS_MP_DELETE_VC_COMPLETE       CoMiniportDeleteVcComplete;
++    RCONDIS_MP_ACTIVATE_VC_COMPLETE     CoMiniportActivateVcComplete;
++    RCONDIS_MP_DEACTIVATE_VC_COMPLETE   CoMiniportDeactivateVcComplete;
++
++
++} RNDIS_MESSAGE_CONTAINER, *PRNDIS_MESSAGE_CONTAINER;
++
++//
++// Remote NDIS message format
++//
++typedef __struct_bcount(MessageLength) struct _RNDIS_MESSAGE
++{
++    UINT32                                  NdisMessageType;
++
++    //
++    // Total length of this message, from the beginning
++    // of the RNDIS_MESSAGE struct, in bytes.
++    //
++    UINT32                                  MessageLength;
++
++    // Actual message
++    RNDIS_MESSAGE_CONTAINER                 Message;
++
++} RNDIS_MESSAGE, *PRNDIS_MESSAGE;
++
++
++
++//
++// Handy macros
++
++// get the size of an RNDIS message. Pass in the message type,
++// RNDIS_SET_REQUEST, RNDIS_PACKET for example
++#define RNDIS_MESSAGE_SIZE(Message)                             \
++    (sizeof(Message) + (sizeof(RNDIS_MESSAGE) - sizeof(RNDIS_MESSAGE_CONTAINER)))
++
++// get pointer to info buffer with message pointer
++#define MESSAGE_TO_INFO_BUFFER(Message)                         \
++    (((PUCHAR)(Message)) + Message->InformationBufferOffset)
++
++// get pointer to status buffer with message pointer
++#define MESSAGE_TO_STATUS_BUFFER(Message)                       \
++    (((PUCHAR)(Message)) + Message->StatusBufferOffset)
++
++// get pointer to OOBD buffer with message pointer
++#define MESSAGE_TO_OOBD_BUFFER(Message)                         \
++    (((PUCHAR)(Message)) + Message->OOBDataOffset)
++
++// get pointer to data buffer with message pointer
++#define MESSAGE_TO_DATA_BUFFER(Message)                         \
++    (((PUCHAR)(Message)) + Message->PerPacketInfoOffset)
++
++// get pointer to contained message from NDIS_MESSAGE pointer
++#define RNDIS_MESSAGE_PTR_TO_MESSAGE_PTR(RndisMessage)          \
++    ((PVOID) &RndisMessage->Message)
++
++// get pointer to contained message from NDIS_MESSAGE pointer
++#define RNDIS_MESSAGE_RAW_PTR_TO_MESSAGE_PTR(RndisMessage)      \
++    ((PVOID) RndisMessage)
++
++#endif // _RNDIS_H_
+--- /dev/null
++++ b/drivers/staging/hv/include/VmbusChannelInterface.h
+@@ -0,0 +1,131 @@
++/*
++ *
++ * Copyright (c) 2009, Microsoft Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Authors:
++ *   Haiyang Zhang <haiyangz@microsoft.com>
++ *   Hank Janssen  <hjanssen@microsoft.com>
++ *
++ */
++
++
++#pragma once
++// allow nameless unions
++//#pragma warning(disable : 4201)
++
++//
++// A revision number of vmbus that is used for ensuring both ends on a
++// partition are using compatible versions.
++//
++#define VMBUS_REVISION_NUMBER       13
++
++//
++// Make maximum size of pipe payload of 16K
++//
++#define MAX_PIPE_DATA_PAYLOAD                 (sizeof(BYTE) * 16384)
++
++//
++// Define PipeMode values.
++//
++#define VMBUS_PIPE_TYPE_BYTE                    0x00000000
++#define VMBUS_PIPE_TYPE_MESSAGE                 0x00000004
++
++//
++// The size of the user defined data buffer for non-pipe offers.
++//
++#define MAX_USER_DEFINED_BYTES                  120
++
++//
++// The size of the user defined data buffer for pipe offers.
++//
++#define MAX_PIPE_USER_DEFINED_BYTES             116
++
++
++//
++// At the center of the Channel Management library is
++// the Channel Offer. This struct contains the
++// fundamental information about an offer.
++//
++#pragma pack(push,1)
++
++typedef struct
++{
++
++    GUID    InterfaceType;
++    GUID    InterfaceInstance;
++    UINT64  InterruptLatencyIn100nsUnits;
++    UINT32  InterfaceRevision;
++    UINT32  ServerContextAreaSize;  // in bytes
++    UINT16  ChannelFlags;
++    UINT16  MmioMegabytes;          // in bytes * 1024 * 1024
++
++    union
++    {
++        //
++        // Non-pipes: The user has MAX_USER_DEFINED_BYTES bytes.
++        //
++        struct
++        {
++            UCHAR   UserDefined[MAX_USER_DEFINED_BYTES];
++        } Standard;
++
++        //
++        // Pipes: The following sructure is an integrated pipe protocol, which
++        //        is implemented on top of standard user-defined data. Pipe clients
++        //        have MAX_PIPE_USER_DEFINED_BYTES left for their own use.
++        //
++        struct
++        {
++            UINT32  PipeMode;
++            UCHAR   UserDefined[MAX_PIPE_USER_DEFINED_BYTES];
++        } Pipe;
++    } u;
++      UINT32  Padding;
++} VMBUS_CHANNEL_OFFER, *PVMBUS_CHANNEL_OFFER;
++#pragma pack(pop)
++
++
++//
++// Verify the MAX_PIPE_USER_DEFINED_BYTES value.
++//
++//C_ASSERT(MAX_PIPE_USER_DEFINED_BYTES ==
++//         MAX_USER_DEFINED_BYTES -
++//         (FIELD_OFFSET(VMBUS_CHANNEL_OFFER, u.Pipe.UserDefined) -
++//          FIELD_OFFSET(VMBUS_CHANNEL_OFFER, u.Standard.UserDefined)));
++//
++
++typedef UINT32 GPADL_HANDLE;
++
++//
++// Server Flags
++//
++
++#define VMBUS_CHANNEL_ENUMERATE_DEVICE_INTERFACE           1
++#define VMBUS_CHANNEL_SERVER_SUPPORTS_TRANSFER_PAGES       2
++#define VMBUS_CHANNEL_SERVER_SUPPORTS_GPADLS               4
++#define VMBUS_CHANNEL_NAMED_PIPE_MODE                   0x10
++#define VMBUS_CHANNEL_LOOPBACK_OFFER                   0x100
++#define VMBUS_CHANNEL_PARENT_OFFER                     0x200
++#define VMBUS_CHANNEL_REQUEST_MONITORED_NOTIFICATION   0x400
++
++//
++// TEMPTEMP -- move this next define to devioctl.h some day
++//
++
++#ifndef FILE_DEVICE_VMBUS
++#define FILE_DEVICE_VMBUS   0x0000003E
++#endif
++
+--- /dev/null
++++ b/drivers/staging/hv/include/VmbusPacketFormat.h
+@@ -0,0 +1,322 @@
++/*
++ *
++ * Copyright (c) 2009, Microsoft Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Authors:
++ *   Haiyang Zhang <haiyangz@microsoft.com>
++ *   Hank Janssen  <hjanssen@microsoft.com>
++ *
++ */
++
++
++#pragma once
++
++//#ifndef PAGE_SIZE
++//#if defined(_IA64_)
++//#error This does not work for IA64
++//#else
++//#define PAGE_SIZE 0x1000
++//#endif
++//#endif
++
++// allow nameless unions
++//#pragma warning(disable : 4201)
++
++typedef struct
++{
++    union
++    {
++        struct
++        {
++            volatile UINT32  In;        // Offset in bytes from the ring base
++            volatile UINT32  Out;       // Offset in bytes from the ring base
++        };
++        volatile LONGLONG    InOut;
++    };
++
++    //
++    // If the receiving endpoint sets this to some non-zero value, the sending
++    // endpoint should not send any interrupts.
++    //
++
++    volatile UINT32 InterruptMask;
++
++} VMRCB, *PVMRCB;
++
++typedef struct
++{
++    union
++    {
++        struct
++        {
++            VMRCB Control;
++        };
++
++        UINT8 Reserved[PAGE_SIZE];
++    };
++
++    //
++    // Beginning of the ring data.  Note: It must be guaranteed that
++    // this data does not share a page with the control structure.
++    //
++    UINT8 Data[1];
++} VMRING, *PVMRING;
++
++#pragma pack(push, 1)
++
++typedef struct
++{
++    UINT16 Type;
++    UINT16 DataOffset8;
++    UINT16 Length8;
++    UINT16 Flags;
++    UINT64 TransactionId;
++} VMPACKET_DESCRIPTOR, *PVMPACKET_DESCRIPTOR;
++
++typedef UINT32 PREVIOUS_PACKET_OFFSET, *PPREVIOUS_PACKET_OFFSET;
++
++typedef struct
++{
++    PREVIOUS_PACKET_OFFSET  PreviousPacketStartOffset;
++    VMPACKET_DESCRIPTOR     Descriptor;
++} VMPACKET_HEADER, *PVMPACKET_HEADER;
++
++typedef struct
++{
++    UINT32  ByteCount;
++    UINT32  ByteOffset;
++} VMTRANSFER_PAGE_RANGE, *PVMTRANSFER_PAGE_RANGE;
++
++#ifdef __cplusplus
++
++typedef struct _VMTRANSFER_PAGE_PACKET_HEADER : VMPACKET_DESCRIPTOR {
++
++#else
++
++typedef struct VMTRANSFER_PAGE_PACKET_HEADER {
++
++    VMPACKET_DESCRIPTOR d;
++
++#endif
++
++    UINT16                  TransferPageSetId;
++    BOOLEAN                 SenderOwnsSet;
++    UINT8                   Reserved;
++    UINT32                  RangeCount;
++    VMTRANSFER_PAGE_RANGE   Ranges[1];
++
++} VMTRANSFER_PAGE_PACKET_HEADER, *PVMTRANSFER_PAGE_PACKET_HEADER;
++
++
++#ifdef __cplusplus
++
++typedef struct _VMGPADL_PACKET_HEADER : VMPACKET_DESCRIPTOR {
++
++#else
++
++typedef struct _VMGPADL_PACKET_HEADER {
++
++    VMPACKET_DESCRIPTOR d;
++
++#endif
++
++
++    UINT32  Gpadl;
++    UINT32  Reserved;
++
++} VMGPADL_PACKET_HEADER, *PVMGPADL_PACKET_HEADER;
++
++#ifdef __cplusplus
++
++typedef struct _VMADD_REMOVE_TRANSFER_PAGE_SET : VMPACKET_DESCRIPTOR {
++
++#else
++
++typedef struct _VMADD_REMOVE_TRANSFER_PAGE_SET {
++
++    VMPACKET_DESCRIPTOR d;
++
++#endif
++
++    UINT32  Gpadl;
++    UINT16  TransferPageSetId;
++    UINT16  Reserved;
++
++} VMADD_REMOVE_TRANSFER_PAGE_SET, *PVMADD_REMOVE_TRANSFER_PAGE_SET;
++
++#pragma pack(pop)
++
++//
++// This structure defines a range in guest physical space that can be made
++// to look virtually contiguous.
++//
++
++typedef struct _GPA_RANGE {
++
++    UINT32  ByteCount;
++    UINT32  ByteOffset;
++    UINT64  PfnArray[0];
++
++} GPA_RANGE, *PGPA_RANGE;
++
++
++
++#pragma pack(push, 1)
++
++//
++// This is the format for an Establish Gpadl packet, which contains a handle
++// by which this GPADL will be known and a set of GPA ranges associated with
++// it.  This can be converted to a MDL by the guest OS.  If there are multiple
++// GPA ranges, then the resulting MDL will be "chained," representing multiple
++// VA ranges.
++//
++
++#ifdef __cplusplus
++
++typedef struct _VMESTABLISH_GPADL : VMPACKET_DESCRIPTOR {
++
++#else
++
++typedef struct _VMESTABLISH_GPADL {
++
++    VMPACKET_DESCRIPTOR d;
++
++#endif
++
++    UINT32      Gpadl;
++    UINT32      RangeCount;
++    GPA_RANGE   Range[1];
++
++} VMESTABLISH_GPADL, *PVMESTABLISH_GPADL;
++
++
++//
++// This is the format for a Teardown Gpadl packet, which indicates that the
++// GPADL handle in the Establish Gpadl packet will never be referenced again.
++//
++
++#ifdef __cplusplus
++
++typedef struct _VMTEARDOWN_GPADL : VMPACKET_DESCRIPTOR {
++
++#else
++
++typedef struct _VMTEARDOWN_GPADL {
++
++    VMPACKET_DESCRIPTOR d;
++
++#endif
++
++    UINT32  Gpadl;
++    UINT32  Reserved; // for alignment to a 8-byte boundary
++} VMTEARDOWN_GPADL, *PVMTEARDOWN_GPADL;
++
++
++//
++// This is the format for a GPA-Direct packet, which contains a set of GPA
++// ranges, in addition to commands and/or data.
++//
++
++#ifdef __cplusplus
++
++typedef struct _VMDATA_GPA_DIRECT : VMPACKET_DESCRIPTOR {
++
++#else
++
++typedef struct _VMDATA_GPA_DIRECT {
++
++    VMPACKET_DESCRIPTOR d;
++
++#endif
++
++    UINT32      Reserved;
++    UINT32      RangeCount;
++    GPA_RANGE   Range[1];
++
++} VMDATA_GPA_DIRECT, *PVMDATA_GPA_DIRECT;
++
++
++
++//
++// This is the format for a Additional Data Packet.
++//
++
++#ifdef __cplusplus
++
++typedef struct _VMADDITIONAL_DATA : VMPACKET_DESCRIPTOR {
++
++#else
++
++typedef struct _VMADDITIONAL_DATA {
++
++    VMPACKET_DESCRIPTOR d;
++
++#endif
++
++    UINT64  TotalBytes;
++    UINT32  ByteOffset;
++    UINT32  ByteCount;
++    UCHAR   Data[1];
++
++} VMADDITIONAL_DATA, *PVMADDITIONAL_DATA;
++
++
++#pragma pack(pop)
++
++typedef union {
++    VMPACKET_DESCRIPTOR             SimpleHeader;
++    VMTRANSFER_PAGE_PACKET_HEADER   TransferPageHeader;
++    VMGPADL_PACKET_HEADER           GpadlHeader;
++    VMADD_REMOVE_TRANSFER_PAGE_SET  AddRemoveTransferPageHeader;
++    VMESTABLISH_GPADL               EstablishGpadlHeader;
++    VMTEARDOWN_GPADL                TeardownGpadlHeader;
++    VMDATA_GPA_DIRECT               DataGpaDirectHeader;
++} VMPACKET_LARGEST_POSSIBLE_HEADER, *PVMPACKET_LARGEST_POSSIBLE_HEADER;
++
++#define VMPACKET_DATA_START_ADDRESS(__packet)                           \
++    (PVOID)(((PUCHAR)__packet) + ((PVMPACKET_DESCRIPTOR)__packet)->DataOffset8 * 8)
++
++#define VMPACKET_DATA_LENGTH(__packet)                                  \
++    ((((PVMPACKET_DESCRIPTOR)__packet)->Length8 - ((PVMPACKET_DESCRIPTOR)__packet)->DataOffset8) * 8)
++
++#define VMPACKET_TRANSFER_MODE(__packet) ((PVMPACKET_DESCRIPTOR)__packet)->Type
++
++typedef enum {
++    VmbusServerEndpoint = 0,
++    VmbusClientEndpoint,
++    VmbusEndpointMaximum
++} ENDPOINT_TYPE, *PENDPOINT_TYPE;
++
++typedef enum {
++    VmbusPacketTypeInvalid                      = 0x0,
++    VmbusPacketTypeSynch                        = 0x1,
++    VmbusPacketTypeAddTransferPageSet           = 0x2,
++    VmbusPacketTypeRemoveTransferPageSet        = 0x3,
++    VmbusPacketTypeEstablishGpadl               = 0x4,
++    VmbusPacketTypeTearDownGpadl                = 0x5,
++    VmbusPacketTypeDataInBand                   = 0x6,
++    VmbusPacketTypeDataUsingTransferPages       = 0x7,
++    VmbusPacketTypeDataUsingGpadl               = 0x8,
++    VmbusPacketTypeDataUsingGpaDirect           = 0x9,
++    VmbusPacketTypeCancelRequest                = 0xa,
++    VmbusPacketTypeCompletion                   = 0xb,
++    VmbusPacketTypeDataUsingAdditionalPackets   = 0xc,
++    VmbusPacketTypeAdditionalData               = 0xd
++} VMBUS_PACKET_TYPE, *PVMBUS_PACKET_TYPE;
++
++#define VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED    1
++
++
+--- /dev/null
++++ b/drivers/staging/hv/include/vstorage.h
+@@ -0,0 +1,309 @@
++/*
++ *
++ * Copyright (c) 2009, Microsoft Corporation.
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ *
++ * Authors:
++ *   Haiyang Zhang <haiyangz@microsoft.com>
++ *   Hank Janssen  <hjanssen@microsoft.com>
++ *
++ */
++
++
++#pragma once
++
++//#include <vmbuspacketformat.h>
++//#include <ntddscsi.h>
++
++#define C_ASSERT(x)
++//
++//  public interface to the server
++//
++
++//
++//  Storvsp device interface guid
++//
++
++
++//
++//  Protocol versions.
++//
++
++//
++// vstorage.w revision number.  This is used in the case of a version match,
++// to alert the user that structure sizes may be mismatched even though the
++// protocol versions match.
++//
++
++#define REVISION_STRING(REVISION_) #REVISION_
++#define FILL_VMSTOR_REVISION(RESULT_LVALUE_)                     \
++{                                                                \
++    char *revisionString = REVISION_STRING($Revision: 6 $) + 11; \
++    RESULT_LVALUE_ = 0;                                          \
++    while (*revisionString >= '0' && *revisionString <= '9')     \
++    {                                                            \
++        RESULT_LVALUE_ *= 10;                                    \
++        RESULT_LVALUE_ += *revisionString - '0';                 \
++        revisionString++;                                        \
++    }                                                            \
++}
++
++//
++// Major/minor macros.  Minor version is in LSB, meaning that earlier flat
++// version numbers will be interpreted as "0.x" (i.e., 1 becomes 0.1).
++//
++
++#define VMSTOR_PROTOCOL_MAJOR(VERSION_)         (((VERSION_) >> 8) & 0xff)
++#define VMSTOR_PROTOCOL_MINOR(VERSION_)         (((VERSION_)     ) & 0xff)
++#define VMSTOR_PROTOCOL_VERSION(MAJOR_, MINOR_) ((((MAJOR_) & 0xff) << 8) | \
++                                                 (((MINOR_) & 0xff)     ))
++
++//
++// Invalid version.
++//
++
++#define VMSTOR_INVALID_PROTOCOL_VERSION  -1
++
++//
++// Version history:
++// V1 Beta                    0.1
++// V1 RC < 2008/1/31          1.0
++// V1 RC > 2008/1/31          2.0
++//
++#define VMSTOR_PROTOCOL_VERSION_CURRENT VMSTOR_PROTOCOL_VERSION(2, 0)
++
++
++//
++//  This will get replaced with the max transfer length that is possible on
++//  the host adapter.
++//  The max transfer length will be published when we offer a vmbus channel.
++//
++
++#define MAX_TRANSFER_LENGTH 0x40000
++#define DEFAULT_PACKET_SIZE (sizeof(VMDATA_GPA_DIRECT) +                            \
++                             sizeof(VSTOR_PACKET) +                                 \
++                             (sizeof(UINT64) * (MAX_TRANSFER_LENGTH / PAGE_SIZE)))
++
++
++
++//
++//  Packet structure describing virtual storage requests.
++//
++
++typedef enum
++{
++    VStorOperationCompleteIo            = 1,
++    VStorOperationRemoveDevice          = 2,
++    VStorOperationExecuteSRB            = 3,
++    VStorOperationResetLun              = 4,
++    VStorOperationResetAdapter          = 5,
++    VStorOperationResetBus              = 6,
++    VStorOperationBeginInitialization   = 7,
++    VStorOperationEndInitialization     = 8,
++    VStorOperationQueryProtocolVersion  = 9,
++    VStorOperationQueryProperties       = 10,
++    VStorOperationMaximum               = 10
++
++} VSTOR_PACKET_OPERATION;
++
++
++//
++//  Platform neutral description of a scsi request -
++//  this remains the same across the write regardless of 32/64 bit
++//  note: it's patterned off the SCSI_PASS_THROUGH structure
++//
++
++
++#pragma pack(push,1)
++
++
++#define CDB16GENERIC_LENGTH 0x10
++
++#ifndef SENSE_BUFFER_SIZE
++#define SENSE_BUFFER_SIZE 0x12
++#endif
++C_ASSERT(SENSE_BUFFER_SIZE == 0x12);
++
++#define MAX_DATA_BUFFER_LENGTH_WITH_PADDING 0x14
++
++
++typedef struct
++{
++    USHORT Length;
++    UCHAR SrbStatus;
++    UCHAR ScsiStatus;
++
++    UCHAR PortNumber;
++    UCHAR PathId;
++    UCHAR TargetId;
++    UCHAR Lun;
++
++    UCHAR CdbLength;
++    UCHAR SenseInfoLength;
++    UCHAR DataIn;
++    UCHAR Reserved;
++
++    ULONG DataTransferLength;
++
++    union
++    {
++        UCHAR Cdb[CDB16GENERIC_LENGTH];
++
++        UCHAR SenseData[SENSE_BUFFER_SIZE];
++
++        UCHAR ReservedArray[MAX_DATA_BUFFER_LENGTH_WITH_PADDING];
++    };
++
++} VMSCSI_REQUEST, *PVMSCSI_REQUEST;
++
++C_ASSERT((sizeof(VMSCSI_REQUEST) % 4) == 0);
++
++
++//
++//  This structure is sent during the intialization phase to get the different
++//  properties of the channel.
++//
++
++typedef struct
++{
++    USHORT ProtocolVersion;
++    UCHAR  PathId;
++    UCHAR  TargetId;
++
++    //
++    // Note: port number is only really known on the client side
++    //
++    ULONG  PortNumber;
++
++    ULONG  Flags;
++
++    ULONG  MaxTransferBytes;
++
++    //
++    //  This id is unique for each channel and will correspond with
++    //  vendor specific data in the inquirydata
++    //
++
++    ULONGLONG UniqueId;
++
++} VMSTORAGE_CHANNEL_PROPERTIES, *PVMSTORAGE_CHANNEL_PROPERTIES;
++
++C_ASSERT((sizeof(VMSTORAGE_CHANNEL_PROPERTIES) % 4) == 0);
++
++
++//
++//  This structure is sent during the storage protocol negotiations.
++//
++
++typedef struct
++{
++    //
++    // Major (MSW) and minor (LSW) version numbers.
++    //
++
++    USHORT MajorMinor;
++
++
++    //
++    // Revision number is auto-incremented whenever this file is changed
++    // (See FILL_VMSTOR_REVISION macro above).  Mismatch does not definitely
++    // indicate incompatibility--but it does indicate mismatched builds.
++    //
++
++    USHORT Revision;
++
++} VMSTORAGE_PROTOCOL_VERSION, *PVMSTORAGE_PROTOCOL_VERSION;
++
++C_ASSERT((sizeof(VMSTORAGE_PROTOCOL_VERSION) % 4) == 0);
++
++
++//
++// Channel Property Flags
++//
++
++#define STORAGE_CHANNEL_REMOVABLE_FLAG                  0x1
++#define STORAGE_CHANNEL_EMULATED_IDE_FLAG               0x2
++
++
++typedef struct _VSTOR_PACKET
++{
++    //
++    // Requested operation type
++    //
++
++    VSTOR_PACKET_OPERATION Operation;
++
++    //
++    //  Flags - see below for values
++    //
++
++    ULONG     Flags;
++
++    //
++    // Status of the request returned from the server side.
++    //
++
++    ULONG     Status;
++
++    //
++    // Data payload area
++    //
++
++    union
++    {
++        //
++        //  Structure used to forward SCSI commands from the client to the server.
++        //
++
++        VMSCSI_REQUEST VmSrb;
++
++        //
++        // Structure used to query channel properties.
++        //
++
++        VMSTORAGE_CHANNEL_PROPERTIES StorageChannelProperties;
++
++        //
++        // Used during version negotiations.
++        //
++
++        VMSTORAGE_PROTOCOL_VERSION Version;
++    };
++
++} VSTOR_PACKET, *PVSTOR_PACKET;
++
++C_ASSERT((sizeof(VSTOR_PACKET) % 4) == 0);
++
++//
++//  Packet flags
++//
++
++//
++//  This flag indicates that the server should send back a completion for this
++//  packet.
++//
++
++#define REQUEST_COMPLETION_FLAG 0x1
++
++//
++//  This is the set of flags that the vsc can set in any packets it sends
++//
++
++#define VSC_LEGAL_FLAGS (REQUEST_COMPLETION_FLAG)
++
++
++#pragma pack(pop)
++
++