diff options
Diffstat (limited to 'drivers/staging/hv/VmbusPrivate.h')
-rw-r--r-- | drivers/staging/hv/VmbusPrivate.h | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/drivers/staging/hv/VmbusPrivate.h b/drivers/staging/hv/VmbusPrivate.h new file mode 100644 index 000000000000..906736bfd9eb --- /dev/null +++ b/drivers/staging/hv/VmbusPrivate.h @@ -0,0 +1,173 @@ +/* + * + * 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 _VMBUS_PRIVATE_H_ +#define _VMBUS_PRIVATE_H_ + +#include "Hv.h" +#include "include/VmbusApi.h" +#include "Channel.h" +#include "ChannelMgmt.h" +#include "ChannelInterface.h" +/* #include "ChannelMessages.h" */ +#include "RingBuffer.h" +/* #include "Packet.h" */ +#include "include/List.h" + + +/* Defines */ + + +/* + * Maximum channels is determined by the size of the interrupt page + * which is PAGE_SIZE. 1/2 of PAGE_SIZE is for send endpoint interrupt + * and the other is receive endpoint interrupt + */ +#define MAX_NUM_CHANNELS (PAGE_SIZE >> 1) << 3 /* 16348 channels */ + +/* The value here must be in multiple of 32 */ +/* TODO: Need to make this configurable */ +#define MAX_NUM_CHANNELS_SUPPORTED 256 + + +/* Data types */ + + +enum VMBUS_CONNECT_STATE { + Disconnected, + Connecting, + Connected, + Disconnecting +}; + +#define MAX_SIZE_CHANNEL_MESSAGE HV_MESSAGE_PAYLOAD_BYTE_COUNT + +struct VMBUS_CONNECTION { + + enum VMBUS_CONNECT_STATE ConnectState; + + atomic_t NextGpadlHandle; + + /* + * Represents channel interrupts. Each bit position represents + * a channel. When a channel sends an interrupt via VMBUS, it + * finds its bit in the sendInterruptPage, set it and calls Hv + * to generate a port event. The other end receives the port + * event and parse the recvInterruptPage to see which bit is + * set + */ + void * InterruptPage; + void * SendInterruptPage; + void * RecvInterruptPage; + + /* + * 2 pages - 1st page for parent->child notification and 2nd + * is child->parent notification + */ + void * MonitorPages; + LIST_ENTRY ChannelMsgList; + spinlock_t channelmsg_lock; + + /* List of channels */ + LIST_ENTRY ChannelList; + spinlock_t channel_lock; + + struct workqueue_struct *WorkQueue; +}; + + +struct VMBUS_MSGINFO { + /* Bookkeeping stuff */ + LIST_ENTRY MsgListEntry; + + /* Synchronize the request/response if needed */ + struct osd_waitevent *WaitEvent; + + /* The message itself */ + unsigned char Msg[0]; +}; + + + +/* Externs */ + +extern struct VMBUS_CONNECTION gVmbusConnection; + + +/* General vmbus interface */ + +static struct hv_device* +VmbusChildDeviceCreate( + GUID deviceType, + GUID deviceInstance, + void *context); + +static int +VmbusChildDeviceAdd( + struct hv_device *Device); + +static void +VmbusChildDeviceRemove( + struct hv_device *Device); + +/* static void */ +/* VmbusChildDeviceDestroy( */ +/* struct hv_device *); */ + +static VMBUS_CHANNEL* +GetChannelFromRelId( + u32 relId + ); + + +/* Connection interface */ + +static int +VmbusConnect( + void + ); + +static int +VmbusDisconnect( + void + ); + +static int +VmbusPostMessage( + void * buffer, + size_t bufSize + ); + +static int +VmbusSetEvent( + u32 childRelId + ); + +static void +VmbusOnEvents( + void + ); + + +#endif /* _VMBUS_PRIVATE_H_ */ |