• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/staging/hv/
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 */
23
24
25#ifndef _VMBUS_API_H_
26#define _VMBUS_API_H_
27
28#define MAX_PAGE_BUFFER_COUNT				16
29#define MAX_MULTIPAGE_BUFFER_COUNT			32 /* 128K */
30
31#pragma pack(push, 1)
32
33/* Single-page buffer */
34struct hv_page_buffer {
35	u32 Length;
36	u32 Offset;
37	u64 Pfn;
38};
39
40/* Multiple-page buffer */
41struct hv_multipage_buffer {
42	/* Length and Offset determines the # of pfns in the array */
43	u32 Length;
44	u32 Offset;
45	u64 PfnArray[MAX_MULTIPAGE_BUFFER_COUNT];
46};
47
48/* 0x18 includes the proprietary packet header */
49#define MAX_PAGE_BUFFER_PACKET		(0x18 +			\
50					(sizeof(struct hv_page_buffer) * \
51					 MAX_PAGE_BUFFER_COUNT))
52#define MAX_MULTIPAGE_BUFFER_PACKET	(0x18 +			\
53					 sizeof(struct hv_multipage_buffer))
54
55
56#pragma pack(pop)
57
58struct hv_driver;
59struct hv_device;
60
61struct hv_dev_port_info {
62	u32 InterruptMask;
63	u32 ReadIndex;
64	u32 WriteIndex;
65	u32 BytesAvailToRead;
66	u32 BytesAvailToWrite;
67};
68
69struct hv_device_info {
70	u32 ChannelId;
71	u32 ChannelState;
72	struct hv_guid ChannelType;
73	struct hv_guid ChannelInstance;
74
75	u32 MonitorId;
76	u32 ServerMonitorPending;
77	u32 ServerMonitorLatency;
78	u32 ServerMonitorConnectionId;
79	u32 ClientMonitorPending;
80	u32 ClientMonitorLatency;
81	u32 ClientMonitorConnectionId;
82
83	struct hv_dev_port_info Inbound;
84	struct hv_dev_port_info Outbound;
85};
86
87/**
88 * struct vmbus_channel_interface - Contains member functions for vmbus channel
89 * @Open:      Open the channel
90 * @Close:     Close the channel
91 * @SendPacket:        Send a packet over the channel
92 * @SendPacketPageBuffer:      Send a single page buffer over the channel
93 * @SendPacketMultiPageBuffer: Send a multiple page buffers
94 * @RecvPacket:        Receive packet
95 * @RecvPacketRaw:     Receive Raw packet
96 * @EstablishGpadl:    Set up GPADL for ringbuffer
97 * @TeardownGpadl:     Teardown GPADL for ringbuffer
98 * @GetInfo:   Get info about the channel
99 *
100 * This structure contains function pointer to control vmbus channel
101 * behavior. None of these functions is externally callable, but they
102 * are used for normal vmbus channel internal behavior.
103 * Only used by Hyper-V drivers.
104 */
105struct vmbus_channel_interface {
106	int (*Open)(struct hv_device *Device, u32 SendBufferSize,
107		    u32 RecvRingBufferSize, void *UserData, u32 UserDataLen,
108		    void (*ChannelCallback)(void *context),
109		    void *Context);
110	void (*Close)(struct hv_device *device);
111	int (*SendPacket)(struct hv_device *Device, const void *Buffer,
112			  u32 BufferLen, u64 RequestId, u32 Type, u32 Flags);
113	int (*SendPacketPageBuffer)(struct hv_device *dev,
114				    struct hv_page_buffer PageBuffers[],
115				    u32 PageCount, void *Buffer, u32 BufferLen,
116				    u64 RequestId);
117	int (*SendPacketMultiPageBuffer)(struct hv_device *device,
118					 struct hv_multipage_buffer *mpb,
119					 void *Buffer,
120					 u32 BufferLen,
121					 u64 RequestId);
122	int (*RecvPacket)(struct hv_device *dev, void *buf, u32 buflen,
123			  u32 *BufferActualLen, u64 *RequestId);
124	int (*RecvPacketRaw)(struct hv_device *dev, void *buf, u32 buflen,
125			     u32 *BufferActualLen, u64 *RequestId);
126	int (*EstablishGpadl)(struct hv_device *dev, void *buf, u32 buflen,
127			      u32 *GpadlHandle);
128	int (*TeardownGpadl)(struct hv_device *device, u32 GpadlHandle);
129	void (*GetInfo)(struct hv_device *dev, struct hv_device_info *devinfo);
130};
131
132/* Base driver object */
133struct hv_driver {
134	const char *name;
135
136	/* the device type supported by this driver */
137	struct hv_guid deviceType;
138
139	int (*OnDeviceAdd)(struct hv_device *device, void *data);
140	int (*OnDeviceRemove)(struct hv_device *device);
141	void (*OnCleanup)(struct hv_driver *driver);
142
143	struct vmbus_channel_interface VmbusChannelInterface;
144};
145
146/* Base device object */
147struct hv_device {
148	/* the driver for this device */
149	struct hv_driver *Driver;
150
151	char name[64];
152
153	/* the device type id of this device */
154	struct hv_guid deviceType;
155
156	/* the device instance id of this device */
157	struct hv_guid deviceInstance;
158
159	void *context;
160
161	/* Device extension; */
162	void *Extension;
163};
164
165/* Vmbus driver object */
166struct vmbus_driver {
167	/* !! Must be the 1st field !! */
168	struct hv_driver Base;
169
170	/* Set by the caller */
171	struct hv_device * (*OnChildDeviceCreate)(struct hv_guid *DeviceType,
172						struct hv_guid *DeviceInstance,
173						void *Context);
174	void (*OnChildDeviceDestroy)(struct hv_device *device);
175	int (*OnChildDeviceAdd)(struct hv_device *RootDevice,
176				struct hv_device *ChildDevice);
177	void (*OnChildDeviceRemove)(struct hv_device *device);
178
179	/* Set by the callee */
180	int (*OnIsr)(struct hv_driver *driver);
181	void (*OnMsgDpc)(struct hv_driver *driver);
182	void (*OnEventDpc)(struct hv_driver *driver);
183	void (*GetChannelOffers)(void);
184
185	void (*GetChannelInterface)(struct vmbus_channel_interface *i);
186	void (*GetChannelInfo)(struct hv_device *dev,
187			       struct hv_device_info *devinfo);
188};
189
190int VmbusInitialize(struct hv_driver *drv);
191
192#endif /* _VMBUS_API_H_ */
193