summaryrefslogtreecommitdiff
path: root/drivers/staging/hv/include/nvspprotocol.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/hv/include/nvspprotocol.h')
-rw-r--r--drivers/staging/hv/include/nvspprotocol.h306
1 files changed, 306 insertions, 0 deletions
diff --git a/drivers/staging/hv/include/nvspprotocol.h b/drivers/staging/hv/include/nvspprotocol.h
new file mode 100644
index 000000000000..2ee9dbf0899a
--- /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 ((u32)0xFFFFFFFF)
+
+#define NVSP_PROTOCOL_VERSION_1 2
+#define NVSP_MIN_PROTOCOL_VERSION NVSP_PROTOCOL_VERSION_1
+#define NVSP_MAX_PROTOCOL_VERSION NVSP_PROTOCOL_VERSION_1
+
+typedef enum _NVSP_MESSAGE_TYPE
+{
+ NvspMessageTypeNone = 0,
+
+
+ /* Init Messages */
+
+ NvspMessageTypeInit = 1,
+ NvspMessageTypeInitComplete = 2,
+
+ NvspVersionMessageStart = 100,
+
+
+ /* Version 1 Messages */
+
+ NvspMessage1TypeSendNdisVersion = NvspVersionMessageStart,
+
+ NvspMessage1TypeSendReceiveBuffer,
+ NvspMessage1TypeSendReceiveBufferComplete,
+ NvspMessage1TypeRevokeReceiveBuffer,
+
+ NvspMessage1TypeSendSendBuffer,
+ NvspMessage1TypeSendSendBufferComplete,
+ NvspMessage1TypeRevokeSendBuffer,
+
+ NvspMessage1TypeSendRNDISPacket,
+ NvspMessage1TypeSendRNDISPacketComplete,
+
+
+ /* This should be set to the number of messages for the version */
+ /* with the maximum number of messages. */
+
+ NvspNumMessagePerVersion = 9,
+
+} NVSP_MESSAGE_TYPE, *PNVSP_MESSAGE_TYPE;
+
+typedef enum _NVSP_STATUS
+{
+ NvspStatusNone = 0,
+ NvspStatusSuccess,
+ NvspStatusFailure,
+ NvspStatusProtocolVersionRangeTooNew,
+ NvspStatusProtocolVersionRangeTooOld,
+ NvspStatusInvalidRndisPacket,
+ NvspStatusBusy,
+ NvspStatusMax,
+} NVSP_STATUS, *PNVSP_STATUS;
+
+#pragma pack(push, 1)
+
+typedef struct _NVSP_MESSAGE_HEADER
+{
+ u32 MessageType;
+} NVSP_MESSAGE_HEADER, *PNVSP_MESSAGE_HEADER;
+
+
+/* Init Messages */
+
+
+
+/* This message is used by the VSC to initialize the channel */
+/* after the channels has been opened. This message should */
+/* never include anything other then versioning (i.e. this */
+/* message will be the same for ever). */
+
+typedef struct _NVSP_MESSAGE_INIT
+{
+ u32 MinProtocolVersion;
+ u32 MaxProtocolVersion;
+} NVSP_MESSAGE_INIT, *PNVSP_MESSAGE_INIT;
+
+
+/* This message is used by the VSP to complete the initialization */
+/* of the channel. This message should never include anything other */
+/* then versioning (i.e. this message will be the same for ever). */
+
+typedef struct _NVSP_MESSAGE_INIT_COMPLETE
+{
+ u32 NegotiatedProtocolVersion;
+ u32 MaximumMdlChainLength;
+ u32 Status;
+} NVSP_MESSAGE_INIT_COMPLETE, *PNVSP_MESSAGE_INIT_COMPLETE;
+
+typedef union _NVSP_MESSAGE_INIT_UBER
+{
+ NVSP_MESSAGE_INIT Init;
+ NVSP_MESSAGE_INIT_COMPLETE InitComplete;
+} NVSP_MESSAGE_INIT_UBER;
+
+
+/* Version 1 Messages */
+
+
+
+/* This message is used by the VSC to send the NDIS version */
+/* to the VSP. The VSP can use this information when handling */
+/* OIDs sent by the VSC. */
+
+typedef struct _NVSP_1_MESSAGE_SEND_NDIS_VERSION
+{
+ u32 NdisMajorVersion;
+ u32 NdisMinorVersion;
+} NVSP_1_MESSAGE_SEND_NDIS_VERSION, *PNVSP_1_MESSAGE_SEND_NDIS_VERSION;
+
+
+/* This message is used by the VSC to send a receive buffer */
+/* to the VSP. The VSP can then use the receive buffer to */
+/* send data to the VSC. */
+
+typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER
+{
+ GPADL_HANDLE GpadlHandle;
+ u16 Id;
+} NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER;
+
+typedef struct _NVSP_1_RECEIVE_BUFFER_SECTION
+{
+ u32 Offset;
+ u32 SubAllocationSize;
+ u32 NumSubAllocations;
+ u32 EndOffset;
+} NVSP_1_RECEIVE_BUFFER_SECTION, *PNVSP_1_RECEIVE_BUFFER_SECTION;
+
+
+/* This message is used by the VSP to acknowledge a receive */
+/* buffer send by the VSC. This message must be sent by the */
+/* VSP before the VSP uses the receive buffer. */
+
+typedef struct _NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE
+{
+ u32 Status;
+ u32 NumSections;
+
+
+ /* The receive buffer is split into two parts, a large */
+ /* suballocation section and a small suballocation */
+ /* section. These sections are then suballocated by a */
+ /* certain size. */
+
+ /* For example, the following break up of the receive */
+ /* buffer has 6 large suballocations and 10 small */
+ /* suballocations. */
+
+ /* | Large Section | | Small Section | */
+ /* ------------------------------------------------------------ */
+ /* | | | | | | | | | | | | | | | | | | */
+ /* | | */
+ /* LargeOffset SmallOffset */
+
+ NVSP_1_RECEIVE_BUFFER_SECTION Sections[1];
+
+} NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE;
+
+
+/* This message is sent by the VSC to revoke the receive buffer. */
+/* After the VSP completes this transaction, the vsp should never */
+/* use the receive buffer again. */
+
+typedef struct _NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER
+{
+ u16 Id;
+} NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER, *PNVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER;
+
+
+/* This message is used by the VSC to send a send buffer */
+/* to the VSP. The VSC can then use the send buffer to */
+/* send data to the VSP. */
+
+typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER
+{
+ GPADL_HANDLE GpadlHandle;
+ u16 Id;
+} NVSP_1_MESSAGE_SEND_SEND_BUFFER, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER;
+
+
+/* This message is used by the VSP to acknowledge a send */
+/* buffer sent by the VSC. This message must be sent by the */
+/* VSP before the VSP uses the sent buffer. */
+
+typedef struct _NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE
+{
+ u32 Status;
+
+
+ /* The VSC gets to choose the size of the send buffer and */
+ /* the VSP gets to choose the sections size of the buffer. */
+ /* This was done to enable dynamic reconfigurations when */
+ /* the cost of GPA-direct buffers decreases. */
+
+ u32 SectionSize;
+} NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE, *PNVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE;
+
+
+/* This message is sent by the VSC to revoke the send buffer. */
+/* After the VSP completes this transaction, the vsp should never */
+/* use the send buffer again. */
+
+typedef struct _NVSP_1_MESSAGE_REVOKE_SEND_BUFFER
+{
+ u16 Id;
+} NVSP_1_MESSAGE_REVOKE_SEND_BUFFER, *PNVSP_1_MESSAGE_REVOKE_SEND_BUFFER;
+
+
+/* This message is used by both the VSP and the VSC to send */
+/* a RNDIS message to the opposite channel endpoint. */
+
+typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET
+{
+
+ /* This field is specified by RNIDS. They assume there's */
+ /* two different channels of communication. However, */
+ /* the Network VSP only has one. Therefore, the channel */
+ /* travels with the RNDIS packet. */
+
+ u32 ChannelType;
+
+
+ /* This field is used to send part or all of the data */
+ /* through a send buffer. This values specifies an */
+ /* index into the send buffer. If the index is */
+ /* 0xFFFFFFFF, then the send buffer is not being used */
+ /* and all of the data was sent through other VMBus */
+ /* mechanisms. */
+
+ u32 SendBufferSectionIndex;
+ u32 SendBufferSectionSize;
+} NVSP_1_MESSAGE_SEND_RNDIS_PACKET, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET;
+
+
+/* This message is used by both the VSP and the VSC to complete */
+/* a RNDIS message to the opposite channel endpoint. At this */
+/* point, the initiator of this message cannot use any resources */
+/* associated with the original RNDIS packet. */
+
+typedef struct _NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE
+{
+ u32 Status;
+} NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE, *PNVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE;
+
+typedef union _NVSP_MESSAGE_1_UBER
+{
+ NVSP_1_MESSAGE_SEND_NDIS_VERSION SendNdisVersion;
+
+ NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER SendReceiveBuffer;
+ NVSP_1_MESSAGE_SEND_RECEIVE_BUFFER_COMPLETE SendReceiveBufferComplete;
+ NVSP_1_MESSAGE_REVOKE_RECEIVE_BUFFER RevokeReceiveBuffer;
+
+ NVSP_1_MESSAGE_SEND_SEND_BUFFER SendSendBuffer;
+ NVSP_1_MESSAGE_SEND_SEND_BUFFER_COMPLETE SendSendBufferComplete;
+ NVSP_1_MESSAGE_REVOKE_SEND_BUFFER RevokeSendBuffer;
+
+ NVSP_1_MESSAGE_SEND_RNDIS_PACKET SendRNDISPacket;
+ NVSP_1_MESSAGE_SEND_RNDIS_PACKET_COMPLETE SendRNDISPacketComplete;
+} NVSP_1_MESSAGE_UBER;
+
+typedef union _NVSP_ALL_MESSAGES
+{
+ NVSP_MESSAGE_INIT_UBER InitMessages;
+ NVSP_1_MESSAGE_UBER Version1Messages;
+
+} NVSP_ALL_MESSAGES;
+
+
+/* ALL Messages */
+
+typedef struct _NVSP_MESSAGE
+{
+ NVSP_MESSAGE_HEADER Header;
+ NVSP_ALL_MESSAGES Messages;
+} NVSP_MESSAGE, *PNVSP_MESSAGE;
+
+#pragma pack(pop)