]> git.ipfire.org Git - ipfire-2.x.git/blame - src/patches/suse-2.6.27.39/patches.drivers/staging-hv-add-the-hyper-v-driver-header-files.patch
Fix oinkmaster patch.
[ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.drivers / staging-hv-add-the-hyper-v-driver-header-files.patch
CommitLineData
2cb7cef9
BS
1From bee20ea87b3e6f246b387f707983a0ef47c8a15b Mon Sep 17 00:00:00 2001
2From: Hank Janssen <hjanssen@microsoft.com>
3Date: Mon, 13 Jul 2009 15:19:28 -0700
4Subject: Staging: hv: add the Hyper-V driver header files
5
6From: Hank Janssen <hjanssen@microsoft.com>
7
8These are the header files for the different Linux Hyper-V drivers to
9use.
10
11Signed-off-by: Hank Janssen <hjanssen@microsoft.com>
12Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
13Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
14---
15 drivers/staging/hv/include/NetVscApi.h | 145 +++++++++++++++++
16 drivers/staging/hv/include/StorVscApi.h | 137 ++++++++++++++++
17 drivers/staging/hv/include/VmbusApi.h | 262 +++++++++++++++++++++++++++++++
18 drivers/staging/hv/include/logging.h | 134 ++++++++++++++++
19 drivers/staging/hv/include/osd.h | 263 ++++++++++++++++++++++++++++++++
20 drivers/staging/hv/include/vmbus.h | 111 +++++++++++++
21 6 files changed, 1052 insertions(+)
22 create mode 100644 drivers/staging/hv/include/NetVscApi.h
23 create mode 100644 drivers/staging/hv/include/StorVscApi.h
24 create mode 100644 drivers/staging/hv/include/VmbusApi.h
25 create mode 100644 drivers/staging/hv/include/logging.h
26 create mode 100644 drivers/staging/hv/include/osd.h
27 create mode 100644 drivers/staging/hv/include/vmbus.h
28
29--- /dev/null
30+++ b/drivers/staging/hv/include/logging.h
31@@ -0,0 +1,134 @@
32+/*
33+ *
34+ * Copyright (c) 2009, Microsoft Corporation.
35+ *
36+ * This program is free software; you can redistribute it and/or modify it
37+ * under the terms and conditions of the GNU General Public License,
38+ * version 2, as published by the Free Software Foundation.
39+ *
40+ * This program is distributed in the hope it will be useful, but WITHOUT
41+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
42+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
43+ * more details.
44+ *
45+ * You should have received a copy of the GNU General Public License along with
46+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
47+ * Place - Suite 330, Boston, MA 02111-1307 USA.
48+ *
49+ * Authors:
50+ * Haiyang Zhang <haiyangz@microsoft.com>
51+ * Hank Janssen <hjanssen@microsoft.com>
52+ *
53+ */
54+
55+
56+#ifndef _LOGGING_H_
57+#define _LOGGING_H_
58+
59+//#include <linux/init.h>
60+//#include <linux/module.h>
61+
62+#include "osd.h"
63+
64+#define VMBUS 0x0001
65+#define STORVSC 0x0002
66+#define NETVSC 0x0004
67+#define INPUTVSC 0x0008
68+#define BLKVSC 0x0010
69+#define VMBUS_DRV 0x0100
70+#define STORVSC_DRV 0x0200
71+#define NETVSC_DRV 0x0400
72+#define INPUTVSC_DRV 0x0800
73+#define BLKVSC_DRV 0x1000
74+
75+#define ALL_MODULES (VMBUS |\
76+ STORVSC |\
77+ NETVSC |\
78+ INPUTVSC |\
79+ BLKVSC |\
80+ VMBUS_DRV |\
81+ STORVSC_DRV |\
82+ NETVSC_DRV |\
83+ INPUTVSC_DRV|\
84+ BLKVSC_DRV)
85+
86+// Logging Level
87+#define CRITICAL_LVL 2
88+#define ERROR_LVL 3
89+#define WARNING_LVL 4
90+#define INFO_LVL 6
91+#define DEBUG_LVL 7
92+#define DEBUG_LVL_ENTEREXIT 8
93+#define DEBUG_RING_LVL 9
94+
95+extern unsigned int vmbus_loglevel;
96+
97+#define ASSERT(expr) \
98+ if (!(expr)) { \
99+ LogMsg("<%d>Assertion failed! %s,%s,%s,line=%d\n", CRITICAL_LVL, #expr,__FILE__,__FUNCTION__,__LINE__); \
100+ __asm__ __volatile__("int3"); \
101+ }
102+
103+#define DPRINT(mod, lvl, fmt, args...) do {\
104+ if (mod & (HIWORD(vmbus_loglevel))) \
105+ (lvl <= LOWORD(vmbus_loglevel))?(LogMsg("<%d>" #mod": %s() " fmt "\n", DEBUG_LVL, __FUNCTION__, ## args)):(0);\
106+ } while (0)
107+
108+#define DPRINT_DBG(mod, fmt, args...) do {\
109+ if (mod & (HIWORD(vmbus_loglevel))) \
110+ (DEBUG_LVL <= LOWORD(vmbus_loglevel))?(LogMsg("<%d>" #mod": %s() " fmt "\n", DEBUG_LVL, __FUNCTION__, ## args)):(0);\
111+ } while (0)
112+
113+#define DPRINT_INFO(mod, fmt, args...) do {\
114+ if (mod & (HIWORD(vmbus_loglevel))) \
115+ (INFO_LVL <= LOWORD(vmbus_loglevel))?(LogMsg("<%d>" #mod": " fmt "\n", INFO_LVL, ## args)):(0);\
116+ } while (0)
117+
118+#define DPRINT_WARN(mod, fmt, args...) do {\
119+ if (mod & (HIWORD(vmbus_loglevel))) \
120+ (WARNING_LVL <= LOWORD(vmbus_loglevel))?(LogMsg("<%d>" #mod": WARNING! " fmt "\n", WARNING_LVL, ## args)):(0);\
121+ } while (0)
122+
123+#define DPRINT_ERR(mod, fmt, args...) do {\
124+ if (mod & (HIWORD(vmbus_loglevel))) \
125+ (ERROR_LVL <= LOWORD(vmbus_loglevel))?(LogMsg("<%d>" #mod": %s() ERROR!! " fmt "\n", ERROR_LVL, __FUNCTION__, ## args)):(0);\
126+ } while (0)
127+
128+#ifdef DEBUG
129+#define DPRINT_ENTER(mod) do {\
130+ if (mod & (HIWORD(vmbus_loglevel))) \
131+ (DEBUG_LVL_ENTEREXIT <= LOWORD(vmbus_loglevel))?(LogMsg("<%d>" "["#mod"]: %s() enter\n", DEBUG_LVL, __FUNCTION__)):(0);\
132+ } while (0)
133+
134+#define DPRINT_EXIT(mod) do {\
135+ if (mod & (HIWORD(vmbus_loglevel))) \
136+ (DEBUG_LVL_ENTEREXIT <= LOWORD(vmbus_loglevel))?(LogMsg("<%d>" "["#mod"]: %s() exit\n", DEBUG_LVL, __FUNCTION__)):(0);\
137+ } while (0)
138+#else
139+#define DPRINT_ENTER(mod)
140+#define DPRINT_EXIT(mod)
141+#endif
142+
143+static inline void PrintBytes(const unsigned char* bytes, int len)
144+{
145+ int i=0;
146+
147+ LogMsg("\n<< ");
148+ for (i=0; i< len; i++)
149+ {
150+ LogMsg("0x%x ", bytes[i]);
151+ }
152+ LogMsg(">>\n");
153+}
154+
155+//
156+// Inline
157+//
158+//static inline void GuidToStr(const GUID g, char *str)
159+//{
160+// sprintf(str, "{%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x%02x%02x}",
161+// g[3], g[2], g[1], g[0], g[5], g[4], g[7], g[6], g[8], g[9], g[10], g[11], g[12], g[13], g[14], g[15]);
162+//
163+//}
164+
165+#endif //_LOGGING_H_
166--- /dev/null
167+++ b/drivers/staging/hv/include/NetVscApi.h
168@@ -0,0 +1,145 @@
169+/*
170+ *
171+ * Copyright (c) 2009, Microsoft Corporation.
172+ *
173+ * This program is free software; you can redistribute it and/or modify it
174+ * under the terms and conditions of the GNU General Public License,
175+ * version 2, as published by the Free Software Foundation.
176+ *
177+ * This program is distributed in the hope it will be useful, but WITHOUT
178+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
179+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
180+ * more details.
181+ *
182+ * You should have received a copy of the GNU General Public License along with
183+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
184+ * Place - Suite 330, Boston, MA 02111-1307 USA.
185+ *
186+ * Authors:
187+ * Haiyang Zhang <haiyangz@microsoft.com>
188+ * Hank Janssen <hjanssen@microsoft.com>
189+ *
190+ */
191+
192+
193+#ifndef _NETVSC_API_H_
194+#define _NETVSC_API_H_
195+
196+#include "VmbusApi.h"
197+
198+//
199+// Defines
200+//
201+#define NETVSC_DEVICE_RING_BUFFER_SIZE 64*PAGE_SIZE
202+
203+#define HW_MACADDR_LEN 6
204+
205+//
206+// Fwd declaration
207+//
208+typedef struct _NETVSC_PACKET *PNETVSC_PACKET;
209+
210+
211+//
212+// Data types
213+//
214+
215+typedef int (*PFN_ON_OPEN)(DEVICE_OBJECT *Device);
216+typedef int (*PFN_ON_CLOSE)(DEVICE_OBJECT *Device);
217+
218+typedef void (*PFN_QUERY_LINKSTATUS)(DEVICE_OBJECT *Device);
219+typedef int (*PFN_ON_SEND)(DEVICE_OBJECT *dev, PNETVSC_PACKET packet);
220+typedef void (*PFN_ON_SENDRECVCOMPLETION)(PVOID Context);
221+
222+typedef int (*PFN_ON_RECVCALLBACK)(DEVICE_OBJECT *dev, PNETVSC_PACKET packet);
223+typedef void (*PFN_ON_LINKSTATUS_CHANGED)(DEVICE_OBJECT *dev, UINT32 Status);
224+
225+// Represent the xfer page packet which contains 1 or more netvsc packet
226+typedef struct _XFERPAGE_PACKET {
227+ DLIST_ENTRY ListEntry;
228+
229+ // # of netvsc packets this xfer packet contains
230+ UINT32 Count;
231+} XFERPAGE_PACKET;
232+
233+
234+// The number of pages which are enough to cover jumbo frame buffer.
235+#define NETVSC_PACKET_MAXPAGE 4
236+
237+// Represent netvsc packet which contains 1 RNDIS and 1 ethernet frame within the RNDIS
238+typedef struct _NETVSC_PACKET {
239+ // Bookkeeping stuff
240+ DLIST_ENTRY ListEntry;
241+
242+ DEVICE_OBJECT *Device;
243+ BOOL IsDataPacket;
244+
245+ // Valid only for receives when we break a xfer page packet into multiple netvsc packets
246+ XFERPAGE_PACKET *XferPagePacket;
247+
248+ union {
249+ struct{
250+ UINT64 ReceiveCompletionTid;
251+ PVOID ReceiveCompletionContext;
252+ PFN_ON_SENDRECVCOMPLETION OnReceiveCompletion;
253+ } Recv;
254+ struct{
255+ UINT64 SendCompletionTid;
256+ PVOID SendCompletionContext;
257+ PFN_ON_SENDRECVCOMPLETION OnSendCompletion;
258+ } Send;
259+ } Completion;
260+
261+ // This points to the memory after PageBuffers
262+ PVOID Extension;
263+
264+ UINT32 TotalDataBufferLength;
265+ // Points to the send/receive buffer where the ethernet frame is
266+ UINT32 PageBufferCount;
267+ PAGE_BUFFER PageBuffers[NETVSC_PACKET_MAXPAGE];
268+
269+} NETVSC_PACKET;
270+
271+
272+// Represents the net vsc driver
273+typedef struct _NETVSC_DRIVER_OBJECT {
274+ DRIVER_OBJECT Base; // Must be the first field
275+
276+ UINT32 RingBufferSize;
277+ UINT32 RequestExtSize;
278+
279+ // Additional num of page buffers to allocate
280+ UINT32 AdditionalRequestPageBufferCount;
281+
282+ // This is set by the caller to allow us to callback when we receive a packet
283+ // from the "wire"
284+ PFN_ON_RECVCALLBACK OnReceiveCallback;
285+
286+ PFN_ON_LINKSTATUS_CHANGED OnLinkStatusChanged;
287+
288+ // Specific to this driver
289+ PFN_ON_OPEN OnOpen;
290+ PFN_ON_CLOSE OnClose;
291+ PFN_ON_SEND OnSend;
292+ //PFN_ON_RECVCOMPLETION OnReceiveCompletion;
293+
294+ //PFN_QUERY_LINKSTATUS QueryLinkStatus;
295+
296+ void* Context;
297+} NETVSC_DRIVER_OBJECT;
298+
299+
300+typedef struct _NETVSC_DEVICE_INFO {
301+ UCHAR MacAddr[6];
302+ BOOL LinkState; // 0 - link up, 1 - link down
303+} NETVSC_DEVICE_INFO;
304+
305+//
306+// Interface
307+//
308+int
309+NetVscInitialize(
310+ DRIVER_OBJECT* drv
311+ );
312+
313+#endif // _NETVSC_API_H_
314--- /dev/null
315+++ b/drivers/staging/hv/include/osd.h
316@@ -0,0 +1,263 @@
317+/*
318+ *
319+ * Copyright (c) 2009, Microsoft Corporation.
320+ *
321+ * This program is free software; you can redistribute it and/or modify it
322+ * under the terms and conditions of the GNU General Public License,
323+ * version 2, as published by the Free Software Foundation.
324+ *
325+ * This program is distributed in the hope it will be useful, but WITHOUT
326+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
327+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
328+ * more details.
329+ *
330+ * You should have received a copy of the GNU General Public License along with
331+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
332+ * Place - Suite 330, Boston, MA 02111-1307 USA.
333+ *
334+ * Authors:
335+ * Haiyang Zhang <haiyangz@microsoft.com>
336+ * Hank Janssen <hjanssen@microsoft.com>
337+ *
338+ */
339+
340+
341+#ifndef _OSD_H_
342+#define _OSD_H_
343+
344+//
345+// Defines
346+//
347+
348+#ifndef PAGE_SIZE
349+#define PAGE_SIZE 0x1000
350+#endif
351+
352+#ifndef PAGE_SHIFT
353+#define PAGE_SHIFT 12
354+#endif
355+
356+#ifndef memcpy
357+#define memcpy __builtin_memcpy
358+#endif
359+
360+#ifndef memset
361+#define memset __builtin_memset
362+#endif
363+
364+#ifndef memcmp
365+#define memcmp __builtin_memcmp
366+#endif
367+
368+#ifndef strcpy
369+#define strcpy __builtin_strcpy
370+#endif
371+
372+//
373+//#ifndef sprintf
374+//#define sprintf __builtin_sprintf
375+//#endif
376+
377+#define STRUCT_PACKED __attribute__((__packed__))
378+#define STRUCT_ALIGNED(x) __attribute__((__aligned__(x)))
379+
380+#define UNUSED_VAR(v) v __attribute__((__unused__))
381+
382+#define ALIGN_UP(value, align) ( ((value) & (align-1))? ( ((value) + (align-1)) & ~(align-1) ): (value) )
383+#define ALIGN_DOWN(value, align) ( (value) & ~(align-1) )
384+#define NUM_PAGES_SPANNED(addr, len) ( (ALIGN_UP(addr+len, PAGE_SIZE) - ALIGN_DOWN(addr, PAGE_SIZE)) >> PAGE_SHIFT )
385+
386+#define MIN(a, b) ((a) < (b)? (a): (b))
387+#define MAX(a, b) ((a) > (b)? (a): (b))
388+
389+#define LOWORD(dw) ((unsigned short) (dw))
390+#define HIWORD(dw) ((unsigned short) (((unsigned int) (dw) >> 16) & 0xFFFF))
391+
392+#define FIELD_OFFSET(t, f) ((unsigned int)(unsigned long)&(((t *)0)->f))
393+
394+#ifdef FALSE
395+#undef FALSE
396+#endif
397+#define FALSE 0
398+
399+#ifdef TRUE
400+#undef TRUE
401+#endif
402+#define TRUE 1
403+
404+#ifndef NULL
405+#define NULL (void *)0
406+#endif
407+
408+typedef struct _DLIST_ENTRY {
409+ struct _DLIST_ENTRY *Flink;
410+ struct _DLIST_ENTRY *Blink;
411+} DLIST_ENTRY;
412+
413+//
414+// unsigned types
415+//
416+typedef unsigned char UINT8;
417+typedef unsigned short UINT16;
418+typedef unsigned int UINT32;
419+#ifdef __x86_64__
420+typedef unsigned long UINT64;
421+#else
422+typedef unsigned long long UINT64;
423+#endif
424+
425+typedef unsigned long long ULONGLONG;
426+typedef unsigned int ULONG;
427+typedef unsigned short USHORT;
428+typedef unsigned char UCHAR;
429+
430+//
431+// signed types
432+//
433+typedef char INT8;
434+typedef short INT16;
435+typedef int INT32;
436+#ifdef __x86_64__
437+typedef long INT64;
438+#else
439+typedef long long INT64;
440+#endif
441+
442+typedef int LONG;
443+typedef char CHAR;
444+typedef long long LONGLONG;
445+
446+//
447+// Other types
448+//
449+typedef unsigned long SIZE_T;
450+typedef void VOID;
451+//typedef unsigned char GUID[16];
452+typedef void* PVOID;
453+typedef unsigned char BOOL;
454+typedef unsigned char BOOLEAN;
455+typedef void* HANDLE;
456+typedef UINT32 DWORD;
457+typedef char* PCHAR;
458+typedef unsigned char BYTE;
459+
460+typedef unsigned long ULONG_PTR;
461+
462+typedef struct {
463+ unsigned char Data[16];
464+} GUID;
465+
466+typedef void (*PFN_WORKITEM_CALLBACK)(void* context);
467+typedef void (*PFN_TIMER_CALLBACK)(void* context);
468+
469+
470+#ifdef __x86_64__
471+
472+#define RDMSR(reg, v) { \
473+ UINT32 h, l; \
474+ __asm__ __volatile__("rdmsr" \
475+ : "=a" (l), "=d" (h) \
476+ : "c" (reg)); \
477+ v = (((UINT64)h) << 32) | l; \
478+}
479+
480+#define WRMSR(reg, v) { \
481+ UINT32 h, l; \
482+ l = (UINT32)(((UINT64)(v)) & 0xFFFFFFFF); \
483+ h = (UINT32)((((UINT64)(v)) >> 32) & 0xFFFFFFFF); \
484+ __asm__ __volatile__("wrmsr" \
485+ : /* no outputs */ \
486+ : "c" (reg), "a" (l), "d" (h)); \
487+}
488+
489+#else
490+
491+#define RDMSR(reg, v) \
492+ __asm__ __volatile__("rdmsr" \
493+ : "=A" (v) \
494+ : "c" (reg))
495+
496+#define WRMSR(reg, v) \
497+ __asm__ __volatile__("wrmsr" \
498+ : /* no outputs */ \
499+ : "c" (reg), "A" ((UINT64)v))
500+
501+#endif
502+
503+
504+static inline void do_cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx)
505+{
506+ __asm__ __volatile__("cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "0" (op), "c" (ecx));
507+}
508+
509+//
510+// Osd routines
511+//
512+extern void LogMsg(const char *fmt, ...);
513+
514+extern void BitSet(unsigned int* addr, int value);
515+extern void BitClear(unsigned int* addr, int value);
516+extern int BitTest(unsigned int* addr, int value);
517+extern int BitTestAndClear(unsigned int* addr, int value);
518+extern int BitTestAndSet(unsigned int* addr, int value);
519+
520+extern int InterlockedIncrement(int *val);
521+extern int InterlockedDecrement(int *val);
522+extern int InterlockedCompareExchange(int *val, int new, int curr);
523+
524+extern void Sleep(unsigned long usecs);
525+
526+extern void* VirtualAllocExec(unsigned int size);
527+extern void VirtualFree(void* VirtAddr);
528+
529+extern void* PageAlloc(unsigned int count);
530+extern void PageFree(void* page, unsigned int count);
531+
532+extern void* MemMapIO(unsigned long phys, unsigned long size);
533+extern void MemUnmapIO(void* virt);
534+
535+extern void* MemAlloc(unsigned int size);
536+extern void* MemAllocZeroed(unsigned int size);
537+extern void* MemAllocAtomic(unsigned int size);
538+extern void MemFree(void* buf);
539+extern void MemoryFence(VOID);
540+
541+extern HANDLE TimerCreate(PFN_TIMER_CALLBACK pfnTimerCB, void* context);
542+extern void TimerClose(HANDLE hTimer);
543+extern int TimerStop(HANDLE hTimer);
544+extern void TimerStart(HANDLE hTimer, UINT32 expirationInUs);
545+extern SIZE_T GetTickCount(void);
546+
547+extern HANDLE WaitEventCreate(void);
548+extern void WaitEventClose(HANDLE hWait);
549+extern void WaitEventSet(HANDLE hWait);
550+extern int WaitEventWait(HANDLE hWait);
551+
552+// If >0, hWait got signaled. If ==0, timeout. If < 0, error
553+extern int WaitEventWaitEx(HANDLE hWait, UINT32 TimeoutInMs);
554+
555+extern HANDLE SpinlockCreate(void);
556+extern void SpinlockClose(HANDLE hSpin);
557+extern void SpinlockAcquire(HANDLE hSpin);
558+extern void SpinlockRelease(HANDLE hSpin);
559+
560+
561+#define GetVirtualAddress Physical2LogicalAddr
562+void* Physical2LogicalAddr(ULONG_PTR PhysAddr);
563+
564+#define GetPhysicalAddress Logical2PhysicalAddr
565+ULONG_PTR Logical2PhysicalAddr(PVOID LogicalAddr);
566+
567+ULONG_PTR Virtual2Physical(PVOID VirtAddr);
568+
569+void* PageMapVirtualAddress(unsigned long Pfn);
570+void PageUnmapVirtualAddress(void* VirtAddr);
571+
572+
573+extern HANDLE WorkQueueCreate(char* name);
574+extern void WorkQueueClose(HANDLE hWorkQueue);
575+extern int WorkQueueQueueWorkItem(HANDLE hWorkQueue, PFN_WORKITEM_CALLBACK workItem, void* context);
576+
577+extern void QueueWorkItem(PFN_WORKITEM_CALLBACK workItem, void* context);
578+
579+#endif // _OSD_H_
580--- /dev/null
581+++ b/drivers/staging/hv/include/StorVscApi.h
582@@ -0,0 +1,137 @@
583+/*
584+ *
585+ * Copyright (c) 2009, Microsoft Corporation.
586+ *
587+ * This program is free software; you can redistribute it and/or modify it
588+ * under the terms and conditions of the GNU General Public License,
589+ * version 2, as published by the Free Software Foundation.
590+ *
591+ * This program is distributed in the hope it will be useful, but WITHOUT
592+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
593+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
594+ * more details.
595+ *
596+ * You should have received a copy of the GNU General Public License along with
597+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
598+ * Place - Suite 330, Boston, MA 02111-1307 USA.
599+ *
600+ * Authors:
601+ * Haiyang Zhang <haiyangz@microsoft.com>
602+ * Hank Janssen <hjanssen@microsoft.com>
603+ *
604+ */
605+
606+
607+#ifndef _STORVSC_API_H_
608+#define _STORVSC_API_H_
609+
610+#include "VmbusApi.h"
611+
612+//
613+// Defines
614+//
615+
616+#define STORVSC_RING_BUFFER_SIZE 10*PAGE_SIZE
617+#define BLKVSC_RING_BUFFER_SIZE 20*PAGE_SIZE
618+
619+#define STORVSC_MAX_IO_REQUESTS 64
620+
621+// In Hyper-V, each port/path/target maps to 1 scsi host adapter.
622+// In reality, the path/target is not used (ie always set to 0) so
623+// our scsi host adapter essentially has 1 bus with 1 target that contains
624+// up to 256 luns.
625+
626+#define STORVSC_MAX_LUNS_PER_TARGET 64
627+#define STORVSC_MAX_TARGETS 1
628+#define STORVSC_MAX_CHANNELS 1
629+
630+
631+// Fwd decl
632+//
633+//struct VMBUS_CHANNEL;
634+typedef struct _STORVSC_REQUEST* PSTORVSC_REQUEST;
635+
636+//
637+// Data types
638+//
639+typedef int (*PFN_ON_IO_REQUEST)(PDEVICE_OBJECT Device, PSTORVSC_REQUEST Request);
640+typedef void (*PFN_ON_IO_REQUEST_COMPLTN)(PSTORVSC_REQUEST Request);
641+
642+typedef int (*PFN_ON_HOST_RESET)(PDEVICE_OBJECT Device);
643+typedef void (*PFN_ON_HOST_RESCAN)(PDEVICE_OBJECT Device);
644+
645+
646+// Matches Windows-end
647+typedef enum _STORVSC_REQUEST_TYPE{
648+ WRITE_TYPE,
649+ READ_TYPE,
650+ UNKNOWN_TYPE,
651+} STORVSC_REQUEST_TYPE;
652+
653+
654+typedef struct _STORVSC_REQUEST {
655+ STORVSC_REQUEST_TYPE Type;
656+ UINT32 Host;
657+ UINT32 Bus;
658+ UINT32 TargetId;
659+ UINT32 LunId;
660+ UINT8* Cdb;
661+ UINT32 CdbLen;
662+ UINT32 Status;
663+ UINT32 BytesXfer;
664+
665+ UCHAR* SenseBuffer;
666+ UINT32 SenseBufferSize;
667+
668+ PVOID Context;
669+
670+ PFN_ON_IO_REQUEST_COMPLTN OnIOCompletion;
671+
672+ // This points to the memory after DataBuffer
673+ PVOID Extension;
674+
675+ MULTIPAGE_BUFFER DataBuffer;
676+} STORVSC_REQUEST;
677+
678+
679+// Represents the block vsc driver
680+typedef struct _STORVSC_DRIVER_OBJECT {
681+ DRIVER_OBJECT Base; // Must be the first field
682+
683+ // Set by caller (in bytes)
684+ UINT32 RingBufferSize;
685+
686+ // Allocate this much private extension for each I/O request
687+ UINT32 RequestExtSize;
688+
689+ // Maximum # of requests in flight per channel/device
690+ UINT32 MaxOutstandingRequestsPerChannel;
691+
692+ // Set by the caller to allow us to re-enumerate the bus on the host
693+ PFN_ON_HOST_RESCAN OnHostRescan;
694+
695+ // Specific to this driver
696+ PFN_ON_IO_REQUEST OnIORequest;
697+ PFN_ON_HOST_RESET OnHostReset;
698+
699+} STORVSC_DRIVER_OBJECT;
700+
701+typedef struct _STORVSC_DEVICE_INFO {
702+ ULONG PortNumber;
703+ UCHAR PathId;
704+ UCHAR TargetId;
705+} STORVSC_DEVICE_INFO;
706+
707+//
708+// Interface
709+//
710+int
711+StorVscInitialize(
712+ DRIVER_OBJECT *Driver
713+ );
714+
715+int
716+BlkVscInitialize(
717+ DRIVER_OBJECT *Driver
718+ );
719+#endif // _STORVSC_API_H_
720--- /dev/null
721+++ b/drivers/staging/hv/include/VmbusApi.h
722@@ -0,0 +1,262 @@
723+/*
724+ *
725+ * Copyright (c) 2009, Microsoft Corporation.
726+ *
727+ * This program is free software; you can redistribute it and/or modify it
728+ * under the terms and conditions of the GNU General Public License,
729+ * version 2, as published by the Free Software Foundation.
730+ *
731+ * This program is distributed in the hope it will be useful, but WITHOUT
732+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
733+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
734+ * more details.
735+ *
736+ * You should have received a copy of the GNU General Public License along with
737+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
738+ * Place - Suite 330, Boston, MA 02111-1307 USA.
739+ *
740+ * Authors:
741+ * Haiyang Zhang <haiyangz@microsoft.com>
742+ * Hank Janssen <hjanssen@microsoft.com>
743+ *
744+ */
745+
746+
747+#ifndef _VMBUS_API_H_
748+#define _VMBUS_API_H_
749+
750+#include "osd.h"
751+
752+//
753+// Defines
754+//
755+
756+#define MAX_PAGE_BUFFER_COUNT 16
757+#define MAX_MULTIPAGE_BUFFER_COUNT 32 // 128K
758+
759+
760+//
761+// Fwd declarations
762+//
763+typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
764+typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT;
765+
766+//
767+// Data types
768+//
769+
770+#pragma pack(push,1)
771+
772+// Single-page buffer
773+typedef struct _PAGE_BUFFER {
774+ UINT32 Length;
775+ UINT32 Offset;
776+ UINT64 Pfn;
777+} PAGE_BUFFER;
778+
779+// Multiple-page buffer
780+typedef struct _MULTIPAGE_BUFFER {
781+ // Length and Offset determines the # of pfns in the array
782+ UINT32 Length;
783+ UINT32 Offset;
784+ UINT64 PfnArray[MAX_MULTIPAGE_BUFFER_COUNT];
785+}MULTIPAGE_BUFFER;
786+
787+//0x18 includes the proprietary packet header
788+#define MAX_PAGE_BUFFER_PACKET (0x18 + (sizeof(PAGE_BUFFER) * MAX_PAGE_BUFFER_COUNT))
789+#define MAX_MULTIPAGE_BUFFER_PACKET (0x18 + sizeof(MULTIPAGE_BUFFER))
790+
791+
792+#pragma pack(pop)
793+
794+// All drivers
795+typedef int (*PFN_ON_DEVICEADD)(PDEVICE_OBJECT Device, void* AdditionalInfo);
796+typedef int (*PFN_ON_DEVICEREMOVE)(PDEVICE_OBJECT Device);
797+typedef char** (*PFN_ON_GETDEVICEIDS)(void);
798+typedef void (*PFN_ON_CLEANUP)(PDRIVER_OBJECT Driver);
799+
800+// Vmbus extensions
801+//typedef int (*PFN_ON_MATCH)(PDEVICE_OBJECT dev, PDRIVER_OBJECT drv);
802+//typedef int (*PFN_ON_PROBE)(PDEVICE_OBJECT dev);
803+typedef int (*PFN_ON_ISR)(PDRIVER_OBJECT drv);
804+typedef void (*PFN_ON_DPC)(PDRIVER_OBJECT drv);
805+typedef void (*PFN_GET_CHANNEL_OFFERS)(void);
806+
807+typedef PDEVICE_OBJECT (*PFN_ON_CHILDDEVICE_CREATE)(GUID DeviceType, GUID DeviceInstance, void *Context);
808+typedef void (*PFN_ON_CHILDDEVICE_DESTROY)(PDEVICE_OBJECT Device);
809+typedef int (*PFN_ON_CHILDDEVICE_ADD)(PDEVICE_OBJECT RootDevice, PDEVICE_OBJECT ChildDevice);
810+typedef void (*PFN_ON_CHILDDEVICE_REMOVE)(PDEVICE_OBJECT Device);
811+
812+// Vmbus channel interface
813+typedef void (*VMBUS_CHANNEL_CALLBACK)(PVOID context);
814+
815+typedef int (*VMBUS_CHANNEL_OPEN)(
816+ PDEVICE_OBJECT Device,
817+ UINT32 SendBufferSize,
818+ UINT32 RecvRingBufferSize,
819+ PVOID UserData,
820+ UINT32 UserDataLen,
821+ VMBUS_CHANNEL_CALLBACK ChannelCallback,
822+ PVOID Context
823+ );
824+
825+typedef void (*VMBUS_CHANNEL_CLOSE)(
826+ PDEVICE_OBJECT Device
827+ );
828+
829+typedef int (*VMBUS_CHANNEL_SEND_PACKET)(
830+ PDEVICE_OBJECT Device,
831+ const PVOID Buffer,
832+ UINT32 BufferLen,
833+ UINT64 RequestId,
834+ UINT32 Type,
835+ UINT32 Flags
836+);
837+
838+typedef int (*VMBUS_CHANNEL_SEND_PACKET_PAGEBUFFER)(
839+ PDEVICE_OBJECT Device,
840+ PAGE_BUFFER PageBuffers[],
841+ UINT32 PageCount,
842+ PVOID Buffer,
843+ UINT32 BufferLen,
844+ UINT64 RequestId
845+ );
846+
847+typedef int (*VMBUS_CHANNEL_SEND_PACKET_MULTIPAGEBUFFER)(
848+ PDEVICE_OBJECT Device,
849+ MULTIPAGE_BUFFER *MultiPageBuffer,
850+ PVOID Buffer,
851+ UINT32 BufferLen,
852+ UINT64 RequestId
853+);
854+
855+typedef int (*VMBUS_CHANNEL_RECV_PACKET)(
856+ PDEVICE_OBJECT Device,
857+ PVOID Buffer,
858+ UINT32 BufferLen,
859+ UINT32* BufferActualLen,
860+ UINT64* RequestId
861+ );
862+
863+typedef int (*VMBUS_CHANNEL_RECV_PACKET_PAW)(
864+ PDEVICE_OBJECT Device,
865+ PVOID Buffer,
866+ UINT32 BufferLen,
867+ UINT32* BufferActualLen,
868+ UINT64* RequestId
869+ );
870+
871+typedef int (*VMBUS_CHANNEL_ESTABLISH_GPADL)(
872+ PDEVICE_OBJECT Device,
873+ PVOID Buffer, // from kmalloc()
874+ UINT32 BufferLen, // page-size multiple
875+ UINT32* GpadlHandle
876+ );
877+
878+typedef int (*VMBUS_CHANNEL_TEARDOWN_GPADL)(
879+ PDEVICE_OBJECT Device,
880+ UINT32 GpadlHandle
881+ );
882+
883+
884+typedef struct _PORT_INFO {
885+ UINT32 InterruptMask;
886+ UINT32 ReadIndex;
887+ UINT32 WriteIndex;
888+ UINT32 BytesAvailToRead;
889+ UINT32 BytesAvailToWrite;
890+} PORT_INFO;
891+
892+
893+typedef struct _DEVICE_INFO {
894+ UINT32 ChannelId;
895+ UINT32 ChannelState;
896+ GUID ChannelType;
897+ GUID ChannelInstance;
898+
899+ UINT32 MonitorId;
900+ UINT32 ServerMonitorPending;
901+ UINT32 ServerMonitorLatency;
902+ UINT32 ServerMonitorConnectionId;
903+ UINT32 ClientMonitorPending;
904+ UINT32 ClientMonitorLatency;
905+ UINT32 ClientMonitorConnectionId;
906+
907+ PORT_INFO Inbound;
908+ PORT_INFO Outbound;
909+} DEVICE_INFO;
910+
911+typedef void (*VMBUS_GET_CHANNEL_INFO)(PDEVICE_OBJECT Device, DEVICE_INFO* DeviceInfo);
912+
913+typedef struct _VMBUS_CHANNEL_INTERFACE {
914+ VMBUS_CHANNEL_OPEN Open;
915+ VMBUS_CHANNEL_CLOSE Close;
916+ VMBUS_CHANNEL_SEND_PACKET SendPacket;
917+ VMBUS_CHANNEL_SEND_PACKET_PAGEBUFFER SendPacketPageBuffer;
918+ VMBUS_CHANNEL_SEND_PACKET_MULTIPAGEBUFFER SendPacketMultiPageBuffer;
919+ VMBUS_CHANNEL_RECV_PACKET RecvPacket;
920+ VMBUS_CHANNEL_RECV_PACKET_PAW RecvPacketRaw;
921+ VMBUS_CHANNEL_ESTABLISH_GPADL EstablishGpadl;
922+ VMBUS_CHANNEL_TEARDOWN_GPADL TeardownGpadl;
923+ VMBUS_GET_CHANNEL_INFO GetInfo;
924+} VMBUS_CHANNEL_INTERFACE;
925+
926+typedef void (*VMBUS_GET_CHANNEL_INTERFACE)(VMBUS_CHANNEL_INTERFACE *Interface);
927+
928+// Base driver object
929+typedef struct _DRIVER_OBJECT {
930+ const char* name;
931+ GUID deviceType; // the device type supported by this driver
932+
933+ PFN_ON_DEVICEADD OnDeviceAdd;
934+ PFN_ON_DEVICEREMOVE OnDeviceRemove;
935+ PFN_ON_GETDEVICEIDS OnGetDeviceIds; // device ids supported by this driver
936+ PFN_ON_CLEANUP OnCleanup;
937+
938+ VMBUS_CHANNEL_INTERFACE VmbusChannelInterface;
939+} DRIVER_OBJECT;
940+
941+
942+// Base device object
943+typedef struct _DEVICE_OBJECT {
944+ DRIVER_OBJECT* Driver; // the driver for this device
945+ char name[64];
946+ GUID deviceType; // the device type id of this device
947+ GUID deviceInstance; // the device instance id of this device
948+ void* context;
949+ void* Extension; // Device extension;
950+} DEVICE_OBJECT;
951+
952+
953+// Vmbus driver object
954+typedef struct _VMBUS_DRIVER_OBJECT {
955+ DRIVER_OBJECT Base; // !! Must be the 1st field !!
956+
957+ // Set by the caller
958+ PFN_ON_CHILDDEVICE_CREATE OnChildDeviceCreate;
959+ PFN_ON_CHILDDEVICE_DESTROY OnChildDeviceDestroy;
960+ PFN_ON_CHILDDEVICE_ADD OnChildDeviceAdd;
961+ PFN_ON_CHILDDEVICE_REMOVE OnChildDeviceRemove;
962+
963+ // Set by the callee
964+ //PFN_ON_MATCH OnMatch;
965+ //PFN_ON_PROBE OnProbe;
966+ PFN_ON_ISR OnIsr;
967+ PFN_ON_DPC OnMsgDpc;
968+ PFN_ON_DPC OnEventDpc;
969+ PFN_GET_CHANNEL_OFFERS GetChannelOffers;
970+
971+ VMBUS_GET_CHANNEL_INTERFACE GetChannelInterface;
972+ VMBUS_GET_CHANNEL_INFO GetChannelInfo;
973+} VMBUS_DRIVER_OBJECT;
974+
975+
976+//
977+// Interface
978+//
979+int
980+VmbusInitialize(
981+ DRIVER_OBJECT* drv
982+ );
983+
984+#endif // _VMBUS_API_H_
985--- /dev/null
986+++ b/drivers/staging/hv/include/vmbus.h
987@@ -0,0 +1,111 @@
988+/*
989+ *
990+ * Copyright (c) 2009, Microsoft Corporation.
991+ *
992+ * This program is free software; you can redistribute it and/or modify it
993+ * under the terms and conditions of the GNU General Public License,
994+ * version 2, as published by the Free Software Foundation.
995+ *
996+ * This program is distributed in the hope it will be useful, but WITHOUT
997+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
998+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
999+ * more details.
1000+ *
1001+ * You should have received a copy of the GNU General Public License along with
1002+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
1003+ * Place - Suite 330, Boston, MA 02111-1307 USA.
1004+ *
1005+ * Authors:
1006+ * Haiyang Zhang <haiyangz@microsoft.com>
1007+ * Hank Janssen <hjanssen@microsoft.com>
1008+ *
1009+ */
1010+
1011+
1012+#ifndef _VMBUS_H_
1013+#define _VMBUS_H_
1014+
1015+#include <linux/device.h>
1016+
1017+#include "VmbusApi.h"
1018+
1019+//
1020+// Data types
1021+//
1022+
1023+typedef int (*PFN_DRIVERINITIALIZE)(DRIVER_OBJECT *drv);
1024+typedef int (*PFN_DRIVEREXIT)(DRIVER_OBJECT *drv);
1025+
1026+struct driver_context {
1027+ GUID class_id;
1028+
1029+ struct device_driver driver;
1030+
1031+ // Use these methods instead of the struct device_driver so 2.6 kernel stops complaining
1032+ int (*probe)(struct device *);
1033+ int (*remove)(struct device *);
1034+ void (*shutdown)(struct device *);
1035+};
1036+
1037+struct device_context {
1038+ struct work_struct probe_failed_work_item;
1039+ GUID class_id;
1040+ GUID device_id;
1041+ int probe_error;
1042+ struct device device;
1043+ DEVICE_OBJECT device_obj;
1044+};
1045+
1046+
1047+//
1048+// Global
1049+//
1050+
1051+//
1052+// Inlines
1053+//
1054+static inline struct device_context *to_device_context(DEVICE_OBJECT *device_obj)
1055+{
1056+ return container_of(device_obj, struct device_context, device_obj);
1057+}
1058+
1059+static inline struct device_context *device_to_device_context(struct device *device)
1060+{
1061+ return container_of(device, struct device_context, device);
1062+}
1063+
1064+static inline struct driver_context *driver_to_driver_context(struct device_driver *driver)
1065+{
1066+ return container_of(driver, struct driver_context, driver);
1067+}
1068+
1069+#if defined(KERNEL_2_6_5)
1070+static inline void* kzalloc(int size, int flags)
1071+{
1072+ void *p;
1073+ p = kmalloc(size, flags);
1074+ if (p) memset(p, 0, size);
1075+
1076+ return p;
1077+}
1078+#endif // KERNEL_2_6_5
1079+
1080+//
1081+// Vmbus interface
1082+//
1083+void
1084+vmbus_child_driver_register(
1085+ struct driver_context* driver_ctx
1086+ );
1087+
1088+void
1089+vmbus_child_driver_unregister(
1090+ struct driver_context *driver_ctx
1091+ );
1092+
1093+void
1094+vmbus_get_interface(
1095+ VMBUS_CHANNEL_INTERFACE *interface
1096+ );
1097+
1098+#endif // _VMBUS_H_