blob: 117b2e1bb7c9e18cbde78105f89c53dc89ce12dc [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
28#include "osd.h"
29#include "ChannelMgmt.h"
30
31#pragma pack(push,1)
32
33
34// The format must be the same as VMDATA_GPA_DIRECT
35typedef struct _VMBUS_CHANNEL_PACKET_PAGE_BUFFER {
36 UINT16 Type;
37 UINT16 DataOffset8;
38 UINT16 Length8;
39 UINT16 Flags;
40 UINT64 TransactionId;
41 UINT32 Reserved;
42 UINT32 RangeCount;
43 PAGE_BUFFER Range[MAX_PAGE_BUFFER_COUNT];
44} VMBUS_CHANNEL_PACKET_PAGE_BUFFER;
45
46
47// The format must be the same as VMDATA_GPA_DIRECT
48typedef struct _VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER {
49 UINT16 Type;
50 UINT16 DataOffset8;
51 UINT16 Length8;
52 UINT16 Flags;
53 UINT64 TransactionId;
54 UINT32 Reserved;
55 UINT32 RangeCount; // Always 1 in this case
56 MULTIPAGE_BUFFER Range;
57} VMBUS_CHANNEL_PACKET_MULITPAGE_BUFFER;
58
59#pragma pack(pop)
60
61//
62// Routines
63//
64
65INTERNAL int
66VmbusChannelOpen(
67 VMBUS_CHANNEL *Channel,
68 UINT32 SendRingBufferSize,
69 UINT32 RecvRingBufferSize,
70 PVOID UserData,
71 UINT32 UserDataLen,
72 PFN_CHANNEL_CALLBACK pfnOnChannelCallback,
73 PVOID Context
74 );
75
76INTERNAL void
77VmbusChannelClose(
78 VMBUS_CHANNEL *Channel
79 );
80
81INTERNAL int
82VmbusChannelSendPacket(
83 VMBUS_CHANNEL *Channel,
84 const PVOID Buffer,
85 UINT32 BufferLen,
86 UINT64 RequestId,
87 VMBUS_PACKET_TYPE Type,
88 UINT32 Flags
89);
90
91INTERNAL int
92VmbusChannelSendPacketPageBuffer(
93 VMBUS_CHANNEL *Channel,
94 PAGE_BUFFER PageBuffers[],
95 UINT32 PageCount,
96 PVOID Buffer,
97 UINT32 BufferLen,
98 UINT64 RequestId
99 );
100
101INTERNAL int
102VmbusChannelSendPacketMultiPageBuffer(
103 VMBUS_CHANNEL *Channel,
104 MULTIPAGE_BUFFER *MultiPageBuffer,
105 PVOID Buffer,
106 UINT32 BufferLen,
107 UINT64 RequestId
108);
109
110INTERNAL int
111VmbusChannelEstablishGpadl(
112 VMBUS_CHANNEL *Channel,
113 PVOID Kbuffer, // from kmalloc()
114 UINT32 Size, // page-size multiple
115 UINT32 *GpadlHandle
116 );
117
118INTERNAL int
119VmbusChannelTeardownGpadl(
120 VMBUS_CHANNEL *Channel,
121 UINT32 GpadlHandle
122 );
123
124INTERNAL int
125VmbusChannelRecvPacket(
126 VMBUS_CHANNEL *Channel,
127 PVOID Buffer,
128 UINT32 BufferLen,
129 UINT32* BufferActualLen,
130 UINT64* RequestId
131 );
132
133INTERNAL int
134VmbusChannelRecvPacketRaw(
135 VMBUS_CHANNEL *Channel,
136 PVOID Buffer,
137 UINT32 BufferLen,
138 UINT32* BufferActualLen,
139 UINT64* RequestId
140 );
141
142INTERNAL void
143VmbusChannelOnChannelEvent(
144 VMBUS_CHANNEL *Channel
145 );
146
147INTERNAL void
148VmbusChannelGetDebugInfo(
149 VMBUS_CHANNEL *Channel,
150 VMBUS_CHANNEL_DEBUG_INFO *DebugInfo
151 );
152
153INTERNAL void
154VmbusChannelOnTimer(
155 void *Context
156 );
157#endif //_CHANNEL_H_