blob: 0d6bef16c747f399fc72229c3bb5b8b31787aa90 [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
Greg Kroah-Hartmana0086dc2009-08-17 17:22:08 -070024#include <linux/kernel.h>
25#include <linux/mm.h>
Greg Kroah-Hartman4983b392009-08-19 16:14:47 -070026#include "osd.h"
Hank Janssen3e7ee492009-07-13 16:02:34 -070027#include "VmbusPrivate.h"
28
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -070029static int
Hank Janssen3e7ee492009-07-13 16:02:34 -070030IVmbusChannelOpen(
Nicolas Palix3d3b5512009-07-28 17:32:53 +020031 struct hv_device *Device,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -070032 u32 SendBufferSize,
33 u32 RecvRingBufferSize,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -070034 void * UserData,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -070035 u32 UserDataLen,
Hank Janssen3e7ee492009-07-13 16:02:34 -070036 VMBUS_CHANNEL_CALLBACK ChannelCallback,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -070037 void * Context
Hank Janssen3e7ee492009-07-13 16:02:34 -070038 )
39{
Greg Kroah-Hartmanaded71652009-08-18 15:21:19 -070040 return VmbusChannelOpen((struct vmbus_channel *)Device->context,
Hank Janssen3e7ee492009-07-13 16:02:34 -070041 SendBufferSize,
42 RecvRingBufferSize,
43 UserData,
44 UserDataLen,
45 ChannelCallback,
46 Context);
47}
48
49
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -070050static void
Hank Janssen3e7ee492009-07-13 16:02:34 -070051IVmbusChannelClose(
Nicolas Palix3d3b5512009-07-28 17:32:53 +020052 struct hv_device *Device
Hank Janssen3e7ee492009-07-13 16:02:34 -070053 )
54{
Greg Kroah-Hartmanaded71652009-08-18 15:21:19 -070055 VmbusChannelClose((struct vmbus_channel *)Device->context);
Hank Janssen3e7ee492009-07-13 16:02:34 -070056}
57
58
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -070059static int
Hank Janssen3e7ee492009-07-13 16:02:34 -070060IVmbusChannelSendPacket(
Nicolas Palix3d3b5512009-07-28 17:32:53 +020061 struct hv_device *Device,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -070062 const void * Buffer,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -070063 u32 BufferLen,
Greg Kroah-Hartman59471432009-07-14 15:10:26 -070064 u64 RequestId,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -070065 u32 Type,
66 u32 Flags
Hank Janssen3e7ee492009-07-13 16:02:34 -070067 )
68{
Greg Kroah-Hartmanaded71652009-08-18 15:21:19 -070069 return VmbusChannelSendPacket((struct vmbus_channel *)Device->context,
Hank Janssen3e7ee492009-07-13 16:02:34 -070070 Buffer,
71 BufferLen,
72 RequestId,
73 Type,
74 Flags);
75}
76
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -070077static int
Hank Janssen3e7ee492009-07-13 16:02:34 -070078IVmbusChannelSendPacketPageBuffer(
Nicolas Palix3d3b5512009-07-28 17:32:53 +020079 struct hv_device *Device,
Hank Janssen3e7ee492009-07-13 16:02:34 -070080 PAGE_BUFFER PageBuffers[],
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -070081 u32 PageCount,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -070082 void * Buffer,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -070083 u32 BufferLen,
Greg Kroah-Hartman59471432009-07-14 15:10:26 -070084 u64 RequestId
Hank Janssen3e7ee492009-07-13 16:02:34 -070085 )
86{
Greg Kroah-Hartmanaded71652009-08-18 15:21:19 -070087 return VmbusChannelSendPacketPageBuffer((struct vmbus_channel *)Device->context,
Hank Janssen3e7ee492009-07-13 16:02:34 -070088 PageBuffers,
89 PageCount,
90 Buffer,
91 BufferLen,
92 RequestId);
93}
94
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -070095static int
Hank Janssen3e7ee492009-07-13 16:02:34 -070096IVmbusChannelSendPacketMultiPageBuffer(
Nicolas Palix3d3b5512009-07-28 17:32:53 +020097 struct hv_device *Device,
Hank Janssen3e7ee492009-07-13 16:02:34 -070098 MULTIPAGE_BUFFER *MultiPageBuffer,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -070099 void * Buffer,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -0700100 u32 BufferLen,
Greg Kroah-Hartman59471432009-07-14 15:10:26 -0700101 u64 RequestId
Hank Janssen3e7ee492009-07-13 16:02:34 -0700102 )
103{
Greg Kroah-Hartmanaded71652009-08-18 15:21:19 -0700104 return VmbusChannelSendPacketMultiPageBuffer((struct vmbus_channel *)Device->context,
Hank Janssen3e7ee492009-07-13 16:02:34 -0700105 MultiPageBuffer,
106 Buffer,
107 BufferLen,
108 RequestId);
109}
110
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -0700111static int
Hank Janssen3e7ee492009-07-13 16:02:34 -0700112IVmbusChannelRecvPacket (
Nicolas Palix3d3b5512009-07-28 17:32:53 +0200113 struct hv_device *Device,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -0700114 void * Buffer,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -0700115 u32 BufferLen,
116 u32* BufferActualLen,
Greg Kroah-Hartman59471432009-07-14 15:10:26 -0700117 u64* RequestId
Hank Janssen3e7ee492009-07-13 16:02:34 -0700118 )
119{
Greg Kroah-Hartmanaded71652009-08-18 15:21:19 -0700120 return VmbusChannelRecvPacket((struct vmbus_channel *)Device->context,
Hank Janssen3e7ee492009-07-13 16:02:34 -0700121 Buffer,
122 BufferLen,
123 BufferActualLen,
124 RequestId);
125}
126
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -0700127static int
Hank Janssen3e7ee492009-07-13 16:02:34 -0700128IVmbusChannelRecvPacketRaw(
Nicolas Palix3d3b5512009-07-28 17:32:53 +0200129 struct hv_device *Device,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -0700130 void * Buffer,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -0700131 u32 BufferLen,
132 u32* BufferActualLen,
Greg Kroah-Hartman59471432009-07-14 15:10:26 -0700133 u64* RequestId
Hank Janssen3e7ee492009-07-13 16:02:34 -0700134 )
135{
Greg Kroah-Hartmanaded71652009-08-18 15:21:19 -0700136 return VmbusChannelRecvPacketRaw((struct vmbus_channel *)Device->context,
Hank Janssen3e7ee492009-07-13 16:02:34 -0700137 Buffer,
138 BufferLen,
139 BufferActualLen,
140 RequestId);
141}
142
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -0700143static int
Hank Janssen3e7ee492009-07-13 16:02:34 -0700144IVmbusChannelEstablishGpadl(
Nicolas Palix3d3b5512009-07-28 17:32:53 +0200145 struct hv_device *Device,
Greg Kroah-Hartman8282c402009-07-14 15:06:28 -0700146 void * Buffer,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -0700147 u32 BufferLen,
148 u32* GpadlHandle
Hank Janssen3e7ee492009-07-13 16:02:34 -0700149 )
150{
Greg Kroah-Hartmanaded71652009-08-18 15:21:19 -0700151 return VmbusChannelEstablishGpadl((struct vmbus_channel *)Device->context,
Hank Janssen3e7ee492009-07-13 16:02:34 -0700152 Buffer,
153 BufferLen,
154 GpadlHandle);
155}
156
Greg Kroah-Hartman2be13012009-07-14 15:05:36 -0700157static int
Hank Janssen3e7ee492009-07-13 16:02:34 -0700158IVmbusChannelTeardownGpadl(
Nicolas Palix3d3b5512009-07-28 17:32:53 +0200159 struct hv_device *Device,
Greg Kroah-Hartman4d643112009-07-14 15:09:36 -0700160 u32 GpadlHandle
Hank Janssen3e7ee492009-07-13 16:02:34 -0700161 )
162{
Greg Kroah-Hartmanaded71652009-08-18 15:21:19 -0700163 return VmbusChannelTeardownGpadl((struct vmbus_channel *)Device->context,
Hank Janssen3e7ee492009-07-13 16:02:34 -0700164 GpadlHandle);
165
166}
167
Greg Kroah-Hartmane89ce622009-08-17 17:22:08 -0700168void GetChannelInterface(VMBUS_CHANNEL_INTERFACE *ChannelInterface)
Hank Janssen3e7ee492009-07-13 16:02:34 -0700169{
170 ChannelInterface->Open = IVmbusChannelOpen;
171 ChannelInterface->Close = IVmbusChannelClose;
172 ChannelInterface->SendPacket = IVmbusChannelSendPacket;
173 ChannelInterface->SendPacketPageBuffer = IVmbusChannelSendPacketPageBuffer;
174 ChannelInterface->SendPacketMultiPageBuffer = IVmbusChannelSendPacketMultiPageBuffer;
175 ChannelInterface->RecvPacket = IVmbusChannelRecvPacket;
176 ChannelInterface->RecvPacketRaw = IVmbusChannelRecvPacketRaw;
177 ChannelInterface->EstablishGpadl = IVmbusChannelEstablishGpadl;
178 ChannelInterface->TeardownGpadl = IVmbusChannelTeardownGpadl;
179 ChannelInterface->GetInfo = GetChannelInfo;
180}
181
182
Greg Kroah-Hartmane89ce622009-08-17 17:22:08 -0700183void GetChannelInfo(struct hv_device *Device, DEVICE_INFO *DeviceInfo)
Hank Janssen3e7ee492009-07-13 16:02:34 -0700184{
Greg Kroah-Hartmanaded71652009-08-18 15:21:19 -0700185 struct vmbus_channel_debug_info debugInfo;
Hank Janssen3e7ee492009-07-13 16:02:34 -0700186
187 if (Device->context)
188 {
Greg Kroah-Hartmanaded71652009-08-18 15:21:19 -0700189 VmbusChannelGetDebugInfo((struct vmbus_channel *)Device->context, &debugInfo);
Hank Janssen3e7ee492009-07-13 16:02:34 -0700190
191 DeviceInfo->ChannelId = debugInfo.RelId;
192 DeviceInfo->ChannelState = debugInfo.State;
Greg Kroah-Hartmancaf26a32009-08-19 16:17:03 -0700193 memcpy(&DeviceInfo->ChannelType, &debugInfo.InterfaceType, sizeof(struct hv_guid));
194 memcpy(&DeviceInfo->ChannelInstance, &debugInfo.InterfaceInstance, sizeof(struct hv_guid));
Hank Janssen3e7ee492009-07-13 16:02:34 -0700195
196 DeviceInfo->MonitorId = debugInfo.MonitorId;
197
198 DeviceInfo->ServerMonitorPending = debugInfo.ServerMonitorPending;
199 DeviceInfo->ServerMonitorLatency = debugInfo.ServerMonitorLatency;
200 DeviceInfo->ServerMonitorConnectionId = debugInfo.ServerMonitorConnectionId;
201
202 DeviceInfo->ClientMonitorPending = debugInfo.ClientMonitorPending;
203 DeviceInfo->ClientMonitorLatency = debugInfo.ClientMonitorLatency;
204 DeviceInfo->ClientMonitorConnectionId = debugInfo.ClientMonitorConnectionId;
205
206 DeviceInfo->Inbound.InterruptMask = debugInfo.Inbound.CurrentInterruptMask;
207 DeviceInfo->Inbound.ReadIndex = debugInfo.Inbound.CurrentReadIndex;
208 DeviceInfo->Inbound.WriteIndex = debugInfo.Inbound.CurrentWriteIndex;
209 DeviceInfo->Inbound.BytesAvailToRead = debugInfo.Inbound.BytesAvailToRead;
210 DeviceInfo->Inbound.BytesAvailToWrite = debugInfo.Inbound.BytesAvailToWrite;
211
212 DeviceInfo->Outbound.InterruptMask = debugInfo.Outbound.CurrentInterruptMask;
213 DeviceInfo->Outbound.ReadIndex = debugInfo.Outbound.CurrentReadIndex;
214 DeviceInfo->Outbound.WriteIndex = debugInfo.Outbound.CurrentWriteIndex;
215 DeviceInfo->Outbound.BytesAvailToRead = debugInfo.Outbound.BytesAvailToRead;
216 DeviceInfo->Outbound.BytesAvailToWrite = debugInfo.Outbound.BytesAvailToWrite;
217 }
218}