/* * * 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 * Hank Janssen * */ #include #include #include "osd.h" #include "VmbusPrivate.h" static int IVmbusChannelOpen(struct hv_device *device, u32 SendBufferSize, u32 RecvRingBufferSize, void *UserData, u32 UserDataLen, void (*ChannelCallback)(void *context), void *Context) { return VmbusChannelOpen(device->context, SendBufferSize, RecvRingBufferSize, UserData, UserDataLen, ChannelCallback, Context); } static void IVmbusChannelClose(struct hv_device *device) { VmbusChannelClose(device->context); } static int IVmbusChannelSendPacket(struct hv_device *device, const void *Buffer, u32 BufferLen, u64 RequestId, u32 Type, u32 Flags) { return VmbusChannelSendPacket(device->context, Buffer, BufferLen, RequestId, Type, Flags); } static int IVmbusChannelSendPacketPageBuffer(struct hv_device *device, struct hv_page_buffer PageBuffers[], u32 PageCount, void *Buffer, u32 BufferLen, u64 RequestId) { return VmbusChannelSendPacketPageBuffer(device->context, PageBuffers, PageCount, Buffer, BufferLen, RequestId); } static int IVmbusChannelSendPacketMultiPageBuffer(struct hv_device *device, struct hv_multipage_buffer *MultiPageBuffer, void *Buffer, u32 BufferLen, u64 RequestId) { return VmbusChannelSendPacketMultiPageBuffer(device->context, MultiPageBuffer, Buffer, BufferLen, RequestId); } static int IVmbusChannelRecvPacket(struct hv_device *device, void *Buffer, u32 BufferLen, u32 *BufferActualLen, u64 *RequestId) { return VmbusChannelRecvPacket(device->context, Buffer, BufferLen, BufferActualLen, RequestId); } static int IVmbusChannelRecvPacketRaw(struct hv_device *device, void *Buffer, u32 BufferLen, u32 *BufferActualLen, u64 *RequestId) { return VmbusChannelRecvPacketRaw(device->context, Buffer, BufferLen, BufferActualLen, RequestId); } static int IVmbusChannelEstablishGpadl(struct hv_device *device, void *Buffer, u32 BufferLen, u32 *GpadlHandle) { return VmbusChannelEstablishGpadl(device->context, Buffer, BufferLen, GpadlHandle); } static int IVmbusChannelTeardownGpadl(struct hv_device *device, u32 GpadlHandle) { return VmbusChannelTeardownGpadl(device->context, GpadlHandle); } void GetChannelInterface(struct vmbus_channel_interface *iface) { iface->Open = IVmbusChannelOpen; iface->Close = IVmbusChannelClose; iface->SendPacket = IVmbusChannelSendPacket; iface->SendPacketPageBuffer = IVmbusChannelSendPacketPageBuffer; iface->SendPacketMultiPageBuffer = IVmbusChannelSendPacketMultiPageBuffer; iface->RecvPacket = IVmbusChannelRecvPacket; iface->RecvPacketRaw = IVmbusChannelRecvPacketRaw; iface->EstablishGpadl = IVmbusChannelEstablishGpadl; iface->TeardownGpadl = IVmbusChannelTeardownGpadl; iface->GetInfo = GetChannelInfo; } void GetChannelInfo(struct hv_device *device, struct hv_device_info *info) { struct vmbus_channel_debug_info debugInfo; if (!device->context) return; VmbusChannelGetDebugInfo(device->context, &debugInfo); info->ChannelId = debugInfo.RelId; info->ChannelState = debugInfo.State; memcpy(&info->ChannelType, &debugInfo.InterfaceType, sizeof(struct hv_guid)); memcpy(&info->ChannelInstance, &debugInfo.InterfaceInstance, sizeof(struct hv_guid)); info->MonitorId = debugInfo.MonitorId; info->ServerMonitorPending = debugInfo.ServerMonitorPending; info->ServerMonitorLatency = debugInfo.ServerMonitorLatency; info->ServerMonitorConnectionId = debugInfo.ServerMonitorConnectionId; info->ClientMonitorPending = debugInfo.ClientMonitorPending; info->ClientMonitorLatency = debugInfo.ClientMonitorLatency; info->ClientMonitorConnectionId = debugInfo.ClientMonitorConnectionId; info->Inbound.InterruptMask = debugInfo.Inbound.CurrentInterruptMask; info->Inbound.ReadIndex = debugInfo.Inbound.CurrentReadIndex; info->Inbound.WriteIndex = debugInfo.Inbound.CurrentWriteIndex; info->Inbound.BytesAvailToRead = debugInfo.Inbound.BytesAvailToRead; info->Inbound.BytesAvailToWrite = debugInfo.Inbound.BytesAvailToWrite; info->Outbound.InterruptMask = debugInfo.Outbound.CurrentInterruptMask; info->Outbound.ReadIndex = debugInfo.Outbound.CurrentReadIndex; info->Outbound.WriteIndex = debugInfo.Outbound.CurrentWriteIndex; info->Outbound.BytesAvailToRead = debugInfo.Outbound.BytesAvailToRead; info->Outbound.BytesAvailToWrite = debugInfo.Outbound.BytesAvailToWrite; }