Commit | Line | Data |
---|---|---|
3e7ee490 HJ |
1 | /* |
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 | */ | |
a0086dc5 GKH |
23 | #include <linux/kernel.h> |
24 | #include <linux/mm.h> | |
4983b39a | 25 | #include "osd.h" |
72daf320 | 26 | #include "vmbus_private.h" |
3e7ee490 | 27 | |
490707d2 GKH |
28 | static int IVmbusChannelOpen(struct hv_device *device, u32 SendBufferSize, |
29 | u32 RecvRingBufferSize, void *UserData, | |
30 | u32 UserDataLen, | |
74982610 | 31 | void (*ChannelCallback)(void *context), |
490707d2 | 32 | void *Context) |
3e7ee490 | 33 | { |
fff41b2e | 34 | return vmbus_open(device->context, SendBufferSize, |
490707d2 GKH |
35 | RecvRingBufferSize, UserData, UserDataLen, |
36 | ChannelCallback, Context); | |
3e7ee490 HJ |
37 | } |
38 | ||
490707d2 | 39 | static void IVmbusChannelClose(struct hv_device *device) |
3e7ee490 | 40 | { |
fff41b2e | 41 | vmbus_close(device->context); |
3e7ee490 HJ |
42 | } |
43 | ||
490707d2 GKH |
44 | static int IVmbusChannelSendPacket(struct hv_device *device, const void *Buffer, |
45 | u32 BufferLen, u64 RequestId, u32 Type, | |
46 | u32 Flags) | |
3e7ee490 | 47 | { |
fff41b2e | 48 | return vmbus_sendpacket(device->context, Buffer, BufferLen, |
490707d2 | 49 | RequestId, Type, Flags); |
3e7ee490 HJ |
50 | } |
51 | ||
490707d2 GKH |
52 | static int IVmbusChannelSendPacketPageBuffer(struct hv_device *device, |
53 | struct hv_page_buffer PageBuffers[], | |
54 | u32 PageCount, void *Buffer, | |
55 | u32 BufferLen, u64 RequestId) | |
3e7ee490 | 56 | { |
fff41b2e | 57 | return vmbus_sendpacket_pagebuffer(device->context, PageBuffers, |
490707d2 GKH |
58 | PageCount, Buffer, BufferLen, |
59 | RequestId); | |
3e7ee490 HJ |
60 | } |
61 | ||
490707d2 GKH |
62 | static int IVmbusChannelSendPacketMultiPageBuffer(struct hv_device *device, |
63 | struct hv_multipage_buffer *MultiPageBuffer, | |
64 | void *Buffer, u32 BufferLen, u64 RequestId) | |
3e7ee490 | 65 | { |
fff41b2e | 66 | return vmbus_sendpacket_multipagebuffer(device->context, |
490707d2 GKH |
67 | MultiPageBuffer, Buffer, |
68 | BufferLen, RequestId); | |
3e7ee490 HJ |
69 | } |
70 | ||
490707d2 GKH |
71 | static int IVmbusChannelRecvPacket(struct hv_device *device, void *Buffer, |
72 | u32 BufferLen, u32 *BufferActualLen, | |
73 | u64 *RequestId) | |
3e7ee490 | 74 | { |
fff41b2e | 75 | return vmbus_recvpacket(device->context, Buffer, BufferLen, |
490707d2 | 76 | BufferActualLen, RequestId); |
3e7ee490 HJ |
77 | } |
78 | ||
490707d2 GKH |
79 | static int IVmbusChannelRecvPacketRaw(struct hv_device *device, void *Buffer, |
80 | u32 BufferLen, u32 *BufferActualLen, | |
81 | u64 *RequestId) | |
3e7ee490 | 82 | { |
fff41b2e | 83 | return vmbus_recvpacket_raw(device->context, Buffer, BufferLen, |
490707d2 | 84 | BufferActualLen, RequestId); |
3e7ee490 HJ |
85 | } |
86 | ||
490707d2 GKH |
87 | static int IVmbusChannelEstablishGpadl(struct hv_device *device, void *Buffer, |
88 | u32 BufferLen, u32 *GpadlHandle) | |
3e7ee490 | 89 | { |
fff41b2e | 90 | return vmbus_establish_gpadl(device->context, Buffer, BufferLen, |
490707d2 | 91 | GpadlHandle); |
3e7ee490 HJ |
92 | } |
93 | ||
490707d2 | 94 | static int IVmbusChannelTeardownGpadl(struct hv_device *device, u32 GpadlHandle) |
3e7ee490 | 95 | { |
fff41b2e | 96 | return vmbus_teardown_gpadl(device->context, GpadlHandle); |
3e7ee490 HJ |
97 | |
98 | } | |
99 | ||
3e7ee490 | 100 | |
490707d2 | 101 | void GetChannelInfo(struct hv_device *device, struct hv_device_info *info) |
3e7ee490 | 102 | { |
aded7165 | 103 | struct vmbus_channel_debug_info debugInfo; |
3e7ee490 | 104 | |
490707d2 GKH |
105 | if (!device->context) |
106 | return; | |
107 | ||
fff41b2e | 108 | vmbus_get_debug_info(device->context, &debugInfo); |
490707d2 GKH |
109 | |
110 | info->ChannelId = debugInfo.RelId; | |
111 | info->ChannelState = debugInfo.State; | |
112 | memcpy(&info->ChannelType, &debugInfo.InterfaceType, | |
113 | sizeof(struct hv_guid)); | |
114 | memcpy(&info->ChannelInstance, &debugInfo.InterfaceInstance, | |
115 | sizeof(struct hv_guid)); | |
116 | ||
117 | info->MonitorId = debugInfo.MonitorId; | |
118 | ||
119 | info->ServerMonitorPending = debugInfo.ServerMonitorPending; | |
120 | info->ServerMonitorLatency = debugInfo.ServerMonitorLatency; | |
121 | info->ServerMonitorConnectionId = debugInfo.ServerMonitorConnectionId; | |
122 | ||
123 | info->ClientMonitorPending = debugInfo.ClientMonitorPending; | |
124 | info->ClientMonitorLatency = debugInfo.ClientMonitorLatency; | |
125 | info->ClientMonitorConnectionId = debugInfo.ClientMonitorConnectionId; | |
126 | ||
127 | info->Inbound.InterruptMask = debugInfo.Inbound.CurrentInterruptMask; | |
128 | info->Inbound.ReadIndex = debugInfo.Inbound.CurrentReadIndex; | |
129 | info->Inbound.WriteIndex = debugInfo.Inbound.CurrentWriteIndex; | |
130 | info->Inbound.BytesAvailToRead = debugInfo.Inbound.BytesAvailToRead; | |
131 | info->Inbound.BytesAvailToWrite = debugInfo.Inbound.BytesAvailToWrite; | |
132 | ||
133 | info->Outbound.InterruptMask = debugInfo.Outbound.CurrentInterruptMask; | |
134 | info->Outbound.ReadIndex = debugInfo.Outbound.CurrentReadIndex; | |
135 | info->Outbound.WriteIndex = debugInfo.Outbound.CurrentWriteIndex; | |
136 | info->Outbound.BytesAvailToRead = debugInfo.Outbound.BytesAvailToRead; | |
137 | info->Outbound.BytesAvailToWrite = debugInfo.Outbound.BytesAvailToWrite; | |
3e7ee490 | 138 | } |
9e795a52 HZ |
139 | |
140 | ||
141 | /* vmbus interface function pointer table */ | |
142 | const struct vmbus_channel_interface vmbus_ops = { | |
143 | .Open = IVmbusChannelOpen, | |
144 | .Close = IVmbusChannelClose, | |
145 | .SendPacket = IVmbusChannelSendPacket, | |
146 | .SendPacketPageBuffer = IVmbusChannelSendPacketPageBuffer, | |
147 | .SendPacketMultiPageBuffer = IVmbusChannelSendPacketMultiPageBuffer, | |
148 | .RecvPacket = IVmbusChannelRecvPacket, | |
149 | .RecvPacketRaw = IVmbusChannelRecvPacketRaw, | |
150 | .EstablishGpadl = IVmbusChannelEstablishGpadl, | |
151 | .TeardownGpadl = IVmbusChannelTeardownGpadl, | |
152 | .GetInfo = GetChannelInfo, | |
153 | }; |