]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
winverbs: add ability to query kernel interface version
authorSean Hefty <sean.hefty@intel.com>
Tue, 13 Jul 2010 19:02:21 +0000 (12:02 -0700)
committerSean Hefty <sean.hefty@intel.com>
Thu, 15 Jul 2010 20:51:17 +0000 (13:51 -0700)
Define IOCTL to support querying what version of the ioctl interface
is supported.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
trunk/core/winverbs/kernel/wv_driver.c
trunk/core/winverbs/user/wv_provider.cpp
trunk/core/winverbs/user/wv_provider.h
trunk/core/winverbs/wv_ioctl.h

index d5321602cb8f05d3237f723c8a1b19f3db9c22ed..281fdf6956c879471301aaf345cd7d79460b0f82 100644 (file)
@@ -127,6 +127,20 @@ void WvCompleteRequestsWithInformation(WDFQUEUE Queue, NTSTATUS ReqStatus)
        }\r
 }\r
 \r
+static void WvVersionQuery(WDFREQUEST Request)\r
+{\r
+       size_t          len = 0;\r
+       UINT64          *version;\r
+       NTSTATUS        status;\r
+\r
+       status = WdfRequestRetrieveOutputBuffer(Request, sizeof(UINT64), &version, &len);\r
+       if (NT_SUCCESS(status)) {\r
+               *version = WV_KERNEL_VERSION;\r
+       }\r
+       \r
+       WdfRequestCompleteWithInformation(Request, status, len);\r
+}\r
+\r
 static void WvGuidQuery(WDFREQUEST Request)\r
 {\r
        WV_IO_GUID_LIST *list;\r
@@ -212,6 +226,9 @@ static VOID WvIoDeviceControl(WDFQUEUE Queue, WDFREQUEST Request,
 \r
        // TODO: verify this compiles as a jump table, or use function pointers\r
        switch (IoControlCode) {\r
+       case WV_IO_FUNCTION_VERSION_QUERY:\r
+               WvVersionQuery(Request);\r
+               break;\r
        case WV_IOCTL_GUID_QUERY:\r
                WvGuidQuery(Request);\r
                break;\r
index 65b0c878754b432b52faaed3eecdaf0d8df075b1..e4fdf581000a6ef5a0dbecc8b5d79a1d5415cc44 100644 (file)
@@ -40,6 +40,7 @@ CWVProvider::CWVProvider()
 {\r
        InterlockedIncrement(&WvRef);\r
        m_hFile = INVALID_HANDLE_VALUE;\r
+       m_KernelVersion = WV_KERNEL_VERSION;\r
 }\r
 \r
 CWVProvider::~CWVProvider()\r
@@ -81,6 +82,20 @@ GetFileHandle(void)
        return m_hFile;\r
 }\r
 \r
+/*\r
+ * Version query was not supported in initial version 1 release.\r
+ */\r
+void CWVProvider::\r
+SetKernelVersion(void)\r
+{\r
+       DWORD                   bytes;\r
+\r
+       if (!WvDeviceIoControl(m_hFile, WV_IOCTL_VERSION_QUERY, NULL, 0,\r
+                                                  &m_KernelVersion, sizeof(m_KernelVersion), &bytes, NULL)) {\r
+               m_KernelVersion = 1;\r
+       }\r
+}\r
+\r
 STDMETHODIMP CWVProvider::\r
 QueryDeviceList(NET64* pGuidList, SIZE_T* pBufferSize)\r
 {\r
index 5daa4c77ea942f2f2bf4121dabf7cdea52dd5e9b..fc637acac05060d664961e1c3a85887128586887 100644 (file)
@@ -91,6 +91,7 @@ public:
                        hr = HRESULT_FROM_WIN32(GetLastError());\r
                        goto err2;\r
                }\r
+               wv->SetKernelVersion();\r
                *ppProvider = wv;\r
                return WV_SUCCESS;\r
 \r
@@ -100,6 +101,11 @@ public:
                *ppProvider = NULL;\r
                return hr;\r
        }\r
+\r
+       UINT64 m_KernelVersion;\r
+\r
+private:\r
+       void SetKernelVersion();\r
 };\r
 \r
 #endif // _WV_PROVIDER_H_
\ No newline at end of file
index 7a8701f1b8ec187228944347bba45b43cc3cce3d..ce091d10a226b437d15e17d0b255d3cf30610e9d 100644 (file)
@@ -36,6 +36,8 @@ typedef UINT16 NET16;
 typedef UINT32 NET32;\r
 typedef UINT64 NET64;\r
 \r
+#define WV_KERNEL_VERSION 1\r
+\r
 #define WV_IOCTL(f)    CTL_CODE(FILE_DEVICE_INFINIBAND, f, METHOD_BUFFERED,\\r
                                                         FILE_READ_DATA | FILE_WRITE_DATA)\r
 \r
@@ -44,7 +46,7 @@ typedef UINT64 NET64;
 #define WV_IO_FUNCTION_BASE                            0x800\r
 \r
 enum {\r
-       WV_IO_FUNCTION_MIN,\r
+       WV_IO_FUNCTION_VERSION_QUERY,\r
        WV_IO_FUNCTION_GUID_QUERY,\r
        WV_IO_FUNCTION_LIBRARY_QUERY,\r
        WV_IO_FUNCTION_DEVICE_OPEN,\r
@@ -100,6 +102,10 @@ enum {
        WV_IO_FUNCTION_PD_CANCEL\r
 };\r
 \r
+// none / UINT64 Version\r
+#define WV_IOCTL_VERSION_QUERY                 WV_IOCTL(WV_IO_FUNCTION_BASE + \\r
+                                                                                                WV_IO_FUNCTION_VERSION_QUERY)\r
+\r
 // none / WV_IO_GUID_LIST\r
 #define WV_IOCTL_GUID_QUERY                            WV_IOCTL(WV_IO_FUNCTION_BASE + \\r
                                                                                                 WV_IO_FUNCTION_GUID_QUERY)\r