linux/drivers/staging/hv/include/nvspprotocol.h

307 lines
9.9 KiB
C

/*
*
* 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)