blob: 54b79f083fbf9b2a43ce130d879ce70dd67a0211 [file] [log] [blame]
Hank Janssen3e7ee492009-07-13 16:02:34 -07001/*
2 *
3 * Copyright (c) 2009, Microsoft Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
16 * Place - Suite 330, Boston, MA 02111-1307 USA.
17 *
18 * Authors:
19 * Haiyang Zhang <haiyangz@microsoft.com>
20 * Hank Janssen <hjanssen@microsoft.com>
21 *
22 */
23
24
25#ifndef _CHANNEL_H_
26#define _CHANNEL_H_
27
Greg Kroah-Hartman09d50ff2009-07-13 17:09:34 -070028#include "include/osd.h"
Hank Janssen3e7ee492009-07-13 16:02:34 -070029#include "ChannelMgmt.h"
30
31#pragma pack(push,1)
32
33
Bill Pemberton454f18a2009-07-27 16:47:24 -040034/* The format must be the same as VMDATA_GPA_DIRECT */
Bill Pemberton0cf4fa82009-07-27 16:47:39 -040035struct VMBUS_CHANNEL_PACKET_PAGE_BUFFER {
Greg Kroah-Hartman5cd508b2009-07-14 15:09:10 -070036 u16 Type;
37 u16 DataOffset8;
38 u16 Length8;
39 u16 Flags;
Greg Kroah-Hartman59471432009-07-14 15:10:26 -070040 u64 TransactionId;
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -070041 u32 Reserved;
42 u32 RangeCount;
Hank Janssen3e7ee492009-07-13 16:02:34 -070043 PAGE_BUFFER Range[MAX_PAGE_BUFFER_COUNT];
Bill Pemberton0cf4fa82009-07-27 16:47:39 -040044};
Hank Janssen3e7ee492009-07-13 16:02:34 -070045
46
Bill Pemberton454f18a2009-07-27 16:47:24 -040047/* The format must be the same as VMDATA_GPA_DIRECT */
Hank Janssen3e7ee492009-07-13 16:02:34 -070048typedef struct _VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER {
Greg Kroah-Hartman5cd508b2009-07-14 15:09:10 -070049 u16 Type;
50 u16 DataOffset8;
51 u16 Length8;
52 u16 Flags;
Greg Kroah-Hartman59471432009-07-14 15:10:26 -070053 u64 TransactionId;
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -070054 u32 Reserved;
Bill Pemberton454f18a2009-07-27 16:47:24 -040055 u32 RangeCount; /* Always 1 in this case */
Hank Janssen3e7ee492009-07-13 16:02:34 -070056 MULTIPAGE_BUFFER Range;
57} VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER;
58
59#pragma pack(pop)
60
Bill Pemberton454f18a2009-07-27 16:47:24 -040061
62/* Routines */
63
Hank Janssen3e7ee492009-07-13 16:02:34 -070064
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -070065static int
Hank Janssen3e7ee492009-07-13 16:02:34 -070066VmbusChannelOpen(
67 VMBUS_CHANNEL *Channel,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -070068 u32 SendRingBufferSize,
69 u32 RecvRingBufferSize,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -070070 void * UserData,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -070071 u32 UserDataLen,
Hank Janssen3e7ee492009-07-13 16:02:34 -070072 PFN_CHANNEL_CALLBACK pfnOnChannelCallback,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -070073 void * Context
Hank Janssen3e7ee492009-07-13 16:02:34 -070074 );
75
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -070076static void
Hank Janssen3e7ee492009-07-13 16:02:34 -070077VmbusChannelClose(
78 VMBUS_CHANNEL *Channel
79 );
80
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -070081static int
Hank Janssen3e7ee492009-07-13 16:02:34 -070082VmbusChannelSendPacket(
83 VMBUS_CHANNEL *Channel,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -070084 const void * Buffer,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -070085 u32 BufferLen,
Greg Kroah-Hartman59471432009-07-14 15:10:26 -070086 u64 RequestId,
Hank Janssen3e7ee492009-07-13 16:02:34 -070087 VMBUS_PACKET_TYPE Type,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -070088 u32 Flags
Hank Janssen3e7ee492009-07-13 16:02:34 -070089);
90
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -070091static int
Hank Janssen3e7ee492009-07-13 16:02:34 -070092VmbusChannelSendPacketPageBuffer(
93 VMBUS_CHANNEL *Channel,
94 PAGE_BUFFER PageBuffers[],
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -070095 u32 PageCount,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -070096 void * Buffer,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -070097 u32 BufferLen,
Greg Kroah-Hartman59471432009-07-14 15:10:26 -070098 u64 RequestId
Hank Janssen3e7ee492009-07-13 16:02:34 -070099 );
100
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -0700101static int
Hank Janssen3e7ee492009-07-13 16:02:34 -0700102VmbusChannelSendPacketMultiPageBuffer(
103 VMBUS_CHANNEL *Channel,
104 MULTIPAGE_BUFFER *MultiPageBuffer,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -0700105 void * Buffer,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -0700106 u32 BufferLen,
Greg Kroah-Hartman59471432009-07-14 15:10:26 -0700107 u64 RequestId
Hank Janssen3e7ee492009-07-13 16:02:34 -0700108);
109
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -0700110static int
Hank Janssen3e7ee492009-07-13 16:02:34 -0700111VmbusChannelEstablishGpadl(
112 VMBUS_CHANNEL *Channel,
Bill Pemberton454f18a2009-07-27 16:47:24 -0400113 void * Kbuffer, /* from kmalloc() */
114 u32 Size, /* page-size multiple */
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -0700115 u32 *GpadlHandle
Hank Janssen3e7ee492009-07-13 16:02:34 -0700116 );
117
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -0700118static int
Hank Janssen3e7ee492009-07-13 16:02:34 -0700119VmbusChannelTeardownGpadl(
120 VMBUS_CHANNEL *Channel,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -0700121 u32 GpadlHandle
Hank Janssen3e7ee492009-07-13 16:02:34 -0700122 );
123
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -0700124static int
Hank Janssen3e7ee492009-07-13 16:02:34 -0700125VmbusChannelRecvPacket(
126 VMBUS_CHANNEL *Channel,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -0700127 void * Buffer,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -0700128 u32 BufferLen,
129 u32* BufferActualLen,
Greg Kroah-Hartman59471432009-07-14 15:10:26 -0700130 u64* RequestId
Hank Janssen3e7ee492009-07-13 16:02:34 -0700131 );
132
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -0700133static int
Hank Janssen3e7ee492009-07-13 16:02:34 -0700134VmbusChannelRecvPacketRaw(
135 VMBUS_CHANNEL *Channel,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -0700136 void * Buffer,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -0700137 u32 BufferLen,
138 u32* BufferActualLen,
Greg Kroah-Hartman59471432009-07-14 15:10:26 -0700139 u64* RequestId
Hank Janssen3e7ee492009-07-13 16:02:34 -0700140 );
141
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -0700142static void
Hank Janssen3e7ee492009-07-13 16:02:34 -0700143VmbusChannelOnChannelEvent(
144 VMBUS_CHANNEL *Channel
145 );
146
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -0700147static void
Hank Janssen3e7ee492009-07-13 16:02:34 -0700148VmbusChannelGetDebugInfo(
149 VMBUS_CHANNEL *Channel,
150 VMBUS_CHANNEL_DEBUG_INFO *DebugInfo
151 );
152
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -0700153static void
Hank Janssen3e7ee492009-07-13 16:02:34 -0700154VmbusChannelOnTimer(
155 void *Context
156 );
Bill Pemberton454f18a2009-07-27 16:47:24 -0400157#endif /* _CHANNEL_H_ */