3 * Copyright (c) 2009, Microsoft Corporation.
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.
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
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.
19 * Haiyang Zhang <haiyangz@microsoft.com>
20 * Hank Janssen <hjanssen@microsoft.com>
24 #include <linux/kernel.h>
27 #include "VmbusPrivate.h"
31 struct hv_device *Device,
33 u32 RecvRingBufferSize,
36 VMBUS_CHANNEL_CALLBACK ChannelCallback,
40 return VmbusChannelOpen((struct vmbus_channel *)Device->context,
52 struct hv_device *Device
55 VmbusChannelClose((struct vmbus_channel *)Device->context);
60 IVmbusChannelSendPacket(
61 struct hv_device *Device,
69 return VmbusChannelSendPacket((struct vmbus_channel *)Device->context,
78 IVmbusChannelSendPacketPageBuffer(
79 struct hv_device *Device,
80 struct hv_page_buffer PageBuffers[],
87 return VmbusChannelSendPacketPageBuffer((struct vmbus_channel *)Device->context,
96 IVmbusChannelSendPacketMultiPageBuffer(
97 struct hv_device *Device,
98 struct hv_multipage_buffer *MultiPageBuffer,
104 return VmbusChannelSendPacketMultiPageBuffer((struct vmbus_channel *)Device->context,
112 IVmbusChannelRecvPacket (
113 struct hv_device *Device,
116 u32* BufferActualLen,
120 return VmbusChannelRecvPacket((struct vmbus_channel *)Device->context,
128 IVmbusChannelRecvPacketRaw(
129 struct hv_device *Device,
132 u32* BufferActualLen,
136 return VmbusChannelRecvPacketRaw((struct vmbus_channel *)Device->context,
144 IVmbusChannelEstablishGpadl(
145 struct hv_device *Device,
151 return VmbusChannelEstablishGpadl((struct vmbus_channel *)Device->context,
158 IVmbusChannelTeardownGpadl(
159 struct hv_device *Device,
163 return VmbusChannelTeardownGpadl((struct vmbus_channel *)Device->context,
168 void GetChannelInterface(struct vmbus_channel_interface *ChannelInterface)
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;
183 void GetChannelInfo(struct hv_device *Device, struct hv_device_info *DeviceInfo)
185 struct vmbus_channel_debug_info debugInfo;
189 VmbusChannelGetDebugInfo((struct vmbus_channel *)Device->context, &debugInfo);
191 DeviceInfo->ChannelId = debugInfo.RelId;
192 DeviceInfo->ChannelState = debugInfo.State;
193 memcpy(&DeviceInfo->ChannelType, &debugInfo.InterfaceType, sizeof(struct hv_guid));
194 memcpy(&DeviceInfo->ChannelInstance, &debugInfo.InterfaceInstance, sizeof(struct hv_guid));
196 DeviceInfo->MonitorId = debugInfo.MonitorId;
198 DeviceInfo->ServerMonitorPending = debugInfo.ServerMonitorPending;
199 DeviceInfo->ServerMonitorLatency = debugInfo.ServerMonitorLatency;
200 DeviceInfo->ServerMonitorConnectionId = debugInfo.ServerMonitorConnectionId;
202 DeviceInfo->ClientMonitorPending = debugInfo.ClientMonitorPending;
203 DeviceInfo->ClientMonitorLatency = debugInfo.ClientMonitorLatency;
204 DeviceInfo->ClientMonitorConnectionId = debugInfo.ClientMonitorConnectionId;
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;
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;