]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
winmad: initial working kernel driver
authorshefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Thu, 11 Dec 2008 21:32:27 +0000 (21:32 +0000)
committershefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Thu, 11 Dec 2008 21:32:27 +0000 (21:32 +0000)
git-svn-id: svn://openib.tc.cornell.edu/gen1@1779 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

branches/winverbs/core/winmad/kernel/winmad.inx
branches/winverbs/core/winmad/kernel/wm_driver.c
branches/winverbs/core/winmad/kernel/wm_driver.h
branches/winverbs/core/winmad/kernel/wm_provider.c
branches/winverbs/core/winmad/kernel/wm_provider.h
branches/winverbs/core/winmad/kernel/wm_reg.c
branches/winverbs/core/winmad/kernel/wm_reg.h

index 18cbe7353e2a5ab2bf29600c9804f0cffab1bf6d..89427ae9e49432a2c245a12c089fd13686b2db8c 100644 (file)
@@ -29,7 +29,7 @@
 \r
 [Version]\r
 Signature = "$WINDOWS NT$"\r
-Class = InfiniBandHca\r
+Class = InfiniBandController\r
 ClassGUID = {58517E00-D3CF-40c9-A679-CEE5752F4491}\r
 Provider = %OFA%\r
 DriverVer = 05/20/2008\r
index dc5ee20e789b631374a6d89950824f7b79844047..8ac92b66bca138add8aa9af5c4a3227306855ade 100644 (file)
@@ -56,20 +56,30 @@ static EVT_WDF_DEVICE_FILE_CREATE                   WmFileCreate;
 static EVT_WDF_FILE_CLEANUP                                    WmFileCleanup;\r
 static EVT_WDF_FILE_CLOSE                                      WmFileClose;\r
 \r
-WM_IB_DEVICE *WmIbDeviceGet(NET64 Guid)\r
+static WM_IB_DEVICE *WmIbDeviceFind(NET64 Guid)\r
 {\r
        WM_IB_DEVICE    *cur_dev, *dev = NULL;\r
        LIST_ENTRY              *entry;\r
 \r
-       KeAcquireGuardedMutex(&Lock);\r
        for (entry = DevList.Flink; entry != &DevList; entry = entry->Flink) {\r
                cur_dev = CONTAINING_RECORD(entry, WM_IB_DEVICE, Entry);\r
                if (cur_dev->Guid == Guid) {\r
-                       InterlockedIncrement(&cur_dev->Ref);\r
                        dev = cur_dev;\r
                        break;\r
                }\r
        }\r
+       return dev;\r
+}\r
+\r
+WM_IB_DEVICE *WmIbDeviceGet(NET64 Guid)\r
+{\r
+       WM_IB_DEVICE *dev;\r
+\r
+       KeAcquireGuardedMutex(&Lock);\r
+       dev = WmIbDeviceFind(Guid);\r
+       if (dev != NULL) {\r
+                       InterlockedIncrement(&dev->Ref);\r
+       }\r
        KeReleaseGuardedMutex(&Lock);\r
        return dev;\r
 }\r
@@ -101,8 +111,7 @@ static VOID WmIoDeviceControl(WDFQUEUE Queue, WDFREQUEST Request,
                WmDeregister(prov, Request);\r
                break;\r
        case WM_IOCTL_CANCEL:\r
-               // TODO!!!\r
-               WdfRequestComplete(Request, STATUS_NOT_IMPLEMENTED);\r
+               WmProviderCancel(prov, Request);\r
                break;\r
        default:\r
                WdfRequestComplete(Request, STATUS_PROCEDURE_NOT_FOUND);\r
@@ -118,7 +127,6 @@ static VOID WmIoRead(WDFQUEUE Queue, WDFREQUEST Request, size_t Length)
 \r
        file = WdfRequestGetFileObject(Request);\r
        prov = WmProviderGetContext(file);\r
-\r
        WmProviderRead(prov, Request);\r
 }\r
 \r
@@ -130,7 +138,6 @@ static VOID WmIoWrite(WDFQUEUE Queue, WDFREQUEST Request, size_t Length)
 \r
        file = WdfRequestGetFileObject(Request);\r
        prov = WmProviderGetContext(file);\r
-\r
        WmProviderWrite(prov, Request);\r
 }\r
 \r
@@ -221,29 +228,47 @@ err1:
        WdfDeviceInitFree(pinit);\r
 }\r
 \r
-static NTSTATUS WmInitIbPorts(WM_IB_DEVICE *pDevice)\r
+static ib_ca_attr_t *WmQueryCaAttributes(WM_IB_DEVICE *pDevice)\r
 {\r
-       NTSTATUS                status;\r
-       ib_api_status_t ib_status;\r
        ib_ca_attr_t    *attr;\r
        UINT32                  size;\r
-       UINT8                   i;\r
+       ib_api_status_t ib_status;\r
 \r
        size = 0;\r
-       ib_status = pDevice->IbInterface.query_ca(pDevice->hDevice, NULL, &size);\r
+       ib_status = pDevice->VerbsInterface.Verbs.\r
+                               query_ca(pDevice->VerbsInterface.Verbs.p_hca_dev, NULL, &size, NULL);\r
        if (ib_status != IB_INSUFFICIENT_MEMORY) {\r
-               return STATUS_UNSUCCESSFUL;\r
+               attr = NULL;\r
+               goto out;\r
        }\r
 \r
        attr = ExAllocatePoolWithTag(PagedPool, size, 'acmw');\r
        if (attr == NULL) {\r
-               return STATUS_NO_MEMORY;\r
+               goto out;\r
        }\r
 \r
-       ib_status = pDevice->IbInterface.query_ca(pDevice->hDevice, attr, &size);\r
+       ib_status = pDevice->VerbsInterface.Verbs.\r
+                               query_ca(pDevice->VerbsInterface.Verbs.p_hca_dev, attr, &size, NULL);\r
        if (ib_status != IB_SUCCESS) {\r
-               status = STATUS_UNSUCCESSFUL;\r
-               goto out;\r
+               ExFreePool(attr);\r
+               attr = NULL;\r
+       }\r
+\r
+out:\r
+       return attr;\r
+}\r
+\r
+static NTSTATUS WmAddCa(WM_IB_DEVICE *pDevice)\r
+{\r
+       NTSTATUS                status;\r
+       ib_api_status_t ib_status;\r
+       ib_ca_attr_t    *attr;\r
+       UINT32                  size;\r
+       UINT8                   i;\r
+\r
+       attr = WmQueryCaAttributes(pDevice);\r
+       if (attr == NULL) {\r
+               return STATUS_NO_MEMORY;\r
        }\r
 \r
        size = sizeof(WM_IB_PORT) * attr->num_ports;\r
@@ -264,55 +289,6 @@ out:
        return status;\r
 }\r
 \r
-static NTSTATUS WmInitIbDevice(WDFDEVICE Device, WM_IB_DEVICE *pDevice)\r
-{\r
-       NTSTATUS status;\r
-       ib_api_status_t ib_status;\r
-\r
-       status = WdfFdoQueryForInterface(Device, &GUID_IB_AL_INTERFACE,\r
-                                                                        (PINTERFACE) &pDevice->IbInterface,\r
-                                                                        sizeof(pDevice->IbInterface),\r
-                                                                        AL_INTERFACE_VERSION, NULL);\r
-       if (!NT_SUCCESS(status)) {\r
-               return status;\r
-       }\r
-\r
-       ib_status = pDevice->IbInterface.open_al(&pDevice->hIbal);\r
-       if (ib_status != IB_SUCCESS) {\r
-               goto err1;\r
-       }\r
-\r
-       ib_status = pDevice->IbInterface.open_ca(pDevice->hIbal, pDevice->Guid,\r
-                                                                                        NULL, pDevice, &pDevice->hDevice);\r
-       if (ib_status != IB_SUCCESS) {\r
-               goto err2;\r
-       }\r
-\r
-       ib_status = pDevice->IbInterface.alloc_pd(pDevice->hDevice, IB_PDT_ALIAS,\r
-                                                                                         pDevice, &pDevice->hPd);\r
-       if (ib_status != IB_SUCCESS) {\r
-               goto err3;\r
-       }\r
-\r
-       status = WmInitIbPorts(pDevice);\r
-       if (!NT_SUCCESS(status)) {\r
-               goto err4;\r
-       }\r
-\r
-       return STATUS_SUCCESS;\r
-\r
-err4:\r
-       pDevice->IbInterface.dealloc_pd(pDevice->hPd, NULL);\r
-err3:\r
-       pDevice->IbInterface.close_ca(pDevice->hDevice, NULL);\r
-err2:\r
-       pDevice->IbInterface.close_al(pDevice->hIbal);\r
-       pDevice->hIbal = NULL;\r
-err1:\r
-       pDevice->IbInterface.wdm.InterfaceDereference(pDevice->IbInterface.wdm.Context);\r
-       return STATUS_UNSUCCESSFUL;\r
-}\r
-\r
 static NTSTATUS WmPowerD0Entry(WDFDEVICE Device, WDF_POWER_DEVICE_STATE PreviousState)\r
 {\r
        WM_IB_DEVICE    *dev;\r
@@ -320,10 +296,6 @@ static NTSTATUS WmPowerD0Entry(WDFDEVICE Device, WDF_POWER_DEVICE_STATE Previous
        NTSTATUS                status;\r
 \r
        dev = WmIbDeviceGetContext(Device);\r
-       if (dev->hIbal != NULL) {\r
-               return STATUS_SUCCESS;\r
-       }\r
-\r
        status = WdfFdoQueryForInterface(Device, &GUID_RDMA_INTERFACE_VERBS,\r
                                                                         (PINTERFACE) &dev->VerbsInterface,\r
                                                                         sizeof(dev->VerbsInterface), VerbsVersion(2, 0),\r
@@ -333,9 +305,18 @@ static NTSTATUS WmPowerD0Entry(WDFDEVICE Device, WDF_POWER_DEVICE_STATE Previous
        }\r
 \r
        dev->Guid = dev->VerbsInterface.Verbs.guid;\r
-       dev->IbInterface.wdm.InterfaceDereference(dev->IbInterface.wdm.Context);\r
+       status = WmAddCa(dev);\r
+\r
+       dev->VerbsInterface.InterfaceHeader.InterfaceDereference(dev->VerbsInterface.\r
+                                                                                                                        InterfaceHeader.Context);\r
+       if (!NT_SUCCESS(status)) {\r
+               return status;\r
+       }\r
 \r
-       status = WmInitIbDevice(Device, dev);\r
+       status = WdfFdoQueryForInterface(Device, &GUID_IB_AL_INTERFACE,\r
+                                                                        (PINTERFACE) &dev->IbInterface,\r
+                                                                        sizeof(dev->IbInterface),\r
+                                                                        AL_INTERFACE_VERSION, NULL);\r
        if (!NT_SUCCESS(status)) {\r
                return status;\r
        }\r
@@ -348,7 +329,6 @@ static NTSTATUS WmPowerD0Entry(WDFDEVICE Device, WDF_POWER_DEVICE_STATE Previous
        if (create) {\r
                WmCreateControlDevice(WdfGetDriver());\r
        }\r
-\r
        return STATUS_SUCCESS;\r
 }\r
 \r
@@ -391,10 +371,7 @@ static VOID WmIbDeviceCleanup(WDFDEVICE Device)
        BOOLEAN                         destroy;\r
        WDFDEVICE                       ctrldev;\r
 \r
-       pdev = WmIbDeviceGetContext(Device);\r
-       if (pdev->hIbal == NULL) {\r
-               return;\r
-       }\r
+       pdev = (WmIbDeviceGetContext(Device));\r
 \r
        KeAcquireGuardedMutex(&Lock);\r
        RemoveEntryList(&pdev->Entry);\r
@@ -404,19 +381,17 @@ static VOID WmIbDeviceCleanup(WDFDEVICE Device)
        for (entry = ProvList.Flink; entry != &ProvList; entry = entry->Flink) {\r
                prov = CONTAINING_RECORD(entry, WM_PROVIDER, Entry);\r
                WmProviderRemoveHandler(prov, pdev);\r
-       }\r
-\r
+       } \r
        KeReleaseGuardedMutex(&Lock);\r
 \r
        if (InterlockedDecrement(&pdev->Ref) > 0) {\r
                KeWaitForSingleObject(&pdev->Event, Executive, KernelMode, FALSE, NULL);\r
        }\r
 \r
-       ExFreePool(pdev->pPortArray);\r
-       pdev->IbInterface.dealloc_pd(pdev->hPd, NULL);\r
-       pdev->IbInterface.close_ca(pdev->hDevice, NULL);\r
-       pdev->IbInterface.close_al(pdev->hIbal);\r
        pdev->IbInterface.wdm.InterfaceDereference(pdev->IbInterface.wdm.Context);\r
+       if (pdev->pPortArray != NULL) {\r
+               ExFreePool(pdev->pPortArray);\r
+       }\r
 \r
        if (destroy) {\r
                WdfObjectDelete(ctrldev);\r
index c1c308ae911012fd417d7f95971a9fa1a49faeef..423b1bf8b6d66da72ccd49dc5d06551c0216ec50 100644 (file)
@@ -67,8 +67,9 @@ typedef struct _WM_IB_DEVICE
                ib_al_ifc_t                             IbInterface;\r
        };\r
        ib_al_handle_t                  hIbal;\r
-       ib_ca_handle_t                  hDevice;\r
-       ib_pd_handle_t                  hPd;\r
+       ib_pnp_handle_t                 hPnp;\r
+       //ib_ca_handle_t                        hDevice;\r
+       //ib_pd_handle_t                        hPd;\r
        int                                             PortCount;\r
        WM_IB_PORT                              *pPortArray;\r
 \r
index 372e501cb7760a82395bf05f8bcfc198c1976a0b..7efdba3d4e7caeaeb99acf40e159880b3066c1c2 100644 (file)
@@ -89,7 +89,6 @@ static ib_mad_element_t *WmRemoveMad(WM_PROVIDER *pProvider)
                pProvider->MadHead = (ib_mad_element_t *) mad->p_next;\r
                mad->p_next = NULL;\r
        }\r
-\r
        return mad;\r
 }\r
 \r
@@ -105,7 +104,7 @@ void WmProviderFlushReceives(WM_PROVIDER *pProvider, WM_REGISTRATION *pRegistrat
                next = mad->p_next;\r
                mad->p_next = NULL;\r
 \r
-               if (mad->context1 == pRegistration) {\r
+               if (mad->send_context1 == pRegistration) {\r
                        pRegistration->pDevice->IbInterface.put_mad(mad);\r
                } else {\r
                        WmInsertMad(pProvider, mad);\r
@@ -119,7 +118,6 @@ void WmProviderCleanup(WM_PROVIDER *pProvider)
        WM_REGISTRATION         *reg;\r
 \r
        while ((reg = IndexListRemoveHead(&pProvider->RegIndex)) != NULL) {\r
-               RemoveEntryList(&reg->Entry);\r
                WmRegFree(reg);\r
        }\r
 \r
@@ -220,7 +218,7 @@ static NTSTATUS WmCopyRead(WM_PROVIDER *pProvider, WM_IO_MAD *pIoMad,
 {\r
        WM_REGISTRATION         *reg;\r
 \r
-       reg = (WM_REGISTRATION *) pMad->context1;\r
+       reg = (WM_REGISTRATION *) pMad->send_context1;\r
        pIoMad->Id = reg->Id;\r
 \r
        pIoMad->Status = pMad->status;\r
@@ -280,7 +278,7 @@ void WmProviderRead(WM_PROVIDER *pProvider, WDFREQUEST Request)
        len = outlen;\r
        status = WmCopyRead(pProvider, wmad, pProvider->MadHead, &len);\r
        if (NT_SUCCESS(status)) {\r
-               reg = (WM_REGISTRATION *) pProvider->MadHead->context1;\r
+               reg = (WM_REGISTRATION *) pProvider->MadHead->send_context1;\r
                reg->pDevice->IbInterface.put_mad(WmRemoveMad(pProvider));\r
        }\r
        WdfObjectReleaseLock(pProvider->ReadQueue);\r
@@ -304,7 +302,6 @@ static NTSTATUS WmSendMad(WM_REGISTRATION *pRegistration, WM_IO_MAD *pIoMad, UIN
 \r
        mad->context1 = pRegistration;\r
        RtlCopyMemory(mad->p_mad_buf, pIoMad + 1, size);\r
-       mad->size = size;\r
        mad->remote_qp = pIoMad->Address.Qpn;\r
        mad->remote_qkey = pIoMad->Address.Qkey;\r
        mad->resp_expected = (pIoMad->Timeout > 0);\r
@@ -323,6 +320,7 @@ static NTSTATUS WmSendMad(WM_REGISTRATION *pRegistration, WM_IO_MAD *pIoMad, UIN
        mad->remote_sl = pIoMad->Address.ServiceLevel;\r
        mad->pkey_index = pIoMad->Address.PkeyIndex;\r
        mad->path_bits = pIoMad->Address.PathBits;\r
+       mad->p_mad_buf->trans_id &= 0xFFFFFFFF00000000;\r
 \r
        ib_status = pifc->send_mad(pRegistration->hService, mad, NULL);\r
        if (ib_status != IB_SUCCESS) {\r
@@ -344,7 +342,7 @@ void WmProviderWrite(WM_PROVIDER *pProvider, WDFREQUEST Request)
        WM_IO_MAD                       *wmad;\r
        size_t                          inlen;\r
 \r
-       status = WdfRequestRetrieveInputBuffer(Request, sizeof(WM_IO_MAD) + 256,\r
+       status = WdfRequestRetrieveInputBuffer(Request, sizeof(WM_IO_MAD) + 24,\r
                                                                                   &wmad, &inlen);\r
        if (!NT_SUCCESS(status)) {\r
                goto out;\r
@@ -385,14 +383,14 @@ void WmReceiveHandler(ib_mad_svc_handle_t hService, void *Context,
 \r
        status = WdfRequestRetrieveOutputBuffer(request, sizeof(WM_IO_MAD), &wmad, &len);\r
        if (!NT_SUCCESS(status)) {\r
-               reg = (WM_REGISTRATION *) pMad->context1;\r
+               reg = (WM_REGISTRATION *) pMad->send_context1;\r
                reg->pDevice->IbInterface.put_mad(pMad);\r
                goto out;\r
        }\r
 \r
        status = WmCopyRead(prov, wmad, pMad, &len);\r
        if (NT_SUCCESS(status)) {\r
-               reg = (WM_REGISTRATION *) pMad->context1;\r
+               reg = (WM_REGISTRATION *) pMad->send_context1;\r
                reg->pDevice->IbInterface.put_mad(pMad);\r
        } else {\r
                WmInsertMad(prov, pMad);\r
@@ -406,9 +404,12 @@ out:
 void WmSendHandler(ib_mad_svc_handle_t hService, void *Context,\r
                                   ib_mad_element_t *pMad)\r
 {\r
-       WM_PROVIDER *prov = Context;\r
-       UNREFERENCED_PARAMETER(hService);\r
-       pMad;\r
+       if (pMad->status == IB_SUCCESS) {\r
+               ((WM_REGISTRATION *) pMad->context1)->pDevice->IbInterface.put_mad(pMad);\r
+       } else {\r
+               pMad->send_context1 = (void*) pMad->context1;\r
+               WmReceiveHandler(hService, Context, pMad);\r
+       }\r
 }\r
 \r
 void WmProviderCancel(WM_PROVIDER *pProvider, WDFREQUEST Request)\r
index 0873b075e8012a12f2f6580a4b1068322dbe8516..d35b87fbd37f4b2129f99fc46a4c6687d17ca950 100644 (file)
@@ -77,5 +77,6 @@ void WmSendHandler(ib_mad_svc_handle_t hService, void *Context,
                                   ib_mad_element_t *pMad);\r
 void WmProviderFlushReceives(WM_PROVIDER *pProvider,\r
                                                         struct _WM_REGISTRATION *pRegistration);\r
+void WmProviderCancel(WM_PROVIDER *pProvider, WDFREQUEST Request);\r
 \r
 #endif // _WM_PROVIDER_H_\r
index 8b9ca84bcdd5f180d9b32ce5d16b966b892688d4..94d61915a33761fd4cbc99fc0bb57f27b2e68515 100644 (file)
@@ -46,7 +46,6 @@ WM_REGISTRATION *WmRegAcquire(WM_PROVIDER *pProvider, UINT64 Id)
                WmProviderEnableRemove(pProvider);\r
        }\r
        KeReleaseGuardedMutex(&pProvider->Lock);\r
-\r
        return reg;\r
 }\r
 \r
@@ -85,7 +84,6 @@ static int WmConvertMethods(ib_mad_svc_t *svc, WM_IO_REGISTER *pAttributes)
                        }\r
                }\r
        }\r
-\r
        return unsolicited;\r
 }\r
 \r
@@ -97,6 +95,7 @@ static NTSTATUS WmRegInit(WM_REGISTRATION *pRegistration, WM_IO_REGISTER *pAttri
        ib_api_status_t ib_status;\r
        NTSTATUS                status;\r
 \r
+       RtlZeroMemory(&attr, sizeof attr);\r
        if (pAttributes->Qpn == 0) {\r
                attr.qp_type = IB_QPT_QP0_ALIAS;\r
        } else if (pAttributes->Qpn == IB_QP1) {\r
@@ -115,19 +114,36 @@ static NTSTATUS WmRegInit(WM_REGISTRATION *pRegistration, WM_IO_REGISTER *pAttri
                goto err1;\r
        }\r
 \r
-       RtlZeroMemory(&attr, sizeof attr);\r
+       ib_status = dev->IbInterface.open_al(&pRegistration->hIbal);\r
+       if (ib_status != IB_SUCCESS) {\r
+               status = STATUS_UNSUCCESSFUL;\r
+               goto err1;\r
+       }\r
+\r
+       ib_status = dev->IbInterface.open_ca(pRegistration->hIbal, pAttributes->Guid,\r
+                                                                                NULL, NULL, &pRegistration->hCa);\r
+       if (ib_status != IB_SUCCESS) {\r
+               goto err2;\r
+       }\r
+\r
+       ib_status = dev->IbInterface.alloc_pd(pRegistration->hCa, IB_PDT_ALIAS,\r
+                                                                                 NULL, &pRegistration->hPd);\r
+       if (ib_status != IB_SUCCESS) {\r
+               goto err3;\r
+       }\r
+\r
        attr.sq_depth = attr.rq_depth = 1;\r
        attr.sq_sge = attr.rq_sge = 1;\r
        attr.sq_signaled = 1;\r
 \r
-       ib_status = dev->IbInterface.get_spl_qp(dev->hPd,\r
+       ib_status = dev->IbInterface.get_spl_qp(pRegistration->hPd,\r
                                                                                        dev->pPortArray[pAttributes->Port].Guid,\r
                                                                                        &attr, pRegistration, NULL,\r
                                                                                        &pRegistration->hMadPool,\r
                                                                                        &pRegistration->hQp);\r
        if (ib_status != IB_SUCCESS) {\r
                status = STATUS_UNSUCCESSFUL;\r
-               goto err1;\r
+               goto err4;\r
        }\r
 \r
        svc.mad_svc_context = pRegistration->pProvider;\r
@@ -142,14 +158,20 @@ static NTSTATUS WmRegInit(WM_REGISTRATION *pRegistration, WM_IO_REGISTER *pAttri
                                                                                         &pRegistration->hService);\r
        if (ib_status != IB_SUCCESS) {\r
                status = STATUS_UNSUCCESSFUL;\r
-               goto err2;\r
+               goto err5;\r
        }\r
 \r
        pRegistration->pDevice = dev;\r
        return STATUS_SUCCESS;\r
 \r
-err2:\r
+err5:\r
        dev->IbInterface.destroy_qp(pRegistration->hQp, NULL);\r
+err4:\r
+       dev->IbInterface.dealloc_pd(pRegistration->hPd, NULL);\r
+err3:\r
+       dev->IbInterface.close_ca(pRegistration->hCa, NULL);\r
+err2:\r
+       dev->IbInterface.close_al(pRegistration->hIbal);\r
 err1:\r
        WmIbDevicePut(dev);\r
        pRegistration->pDevice = NULL;\r
@@ -253,6 +275,10 @@ void WmRegRemoveHandler(WM_REGISTRATION *pRegistration)
        }\r
 \r
        pRegistration->pDevice->IbInterface.destroy_qp(pRegistration->hQp, NULL);\r
+       pRegistration->pDevice->IbInterface.dealloc_pd(pRegistration->hPd, NULL);\r
+       pRegistration->pDevice->IbInterface.close_ca(pRegistration->hCa, NULL);\r
+       pRegistration->pDevice->IbInterface.close_al(pRegistration->hIbal);\r
+\r
        WmProviderFlushReceives(pRegistration->pProvider, pRegistration);\r
        WmIbDevicePut(pRegistration->pDevice);\r
        pRegistration->pDevice = NULL;\r
index 4dd03ccb111391ac73252e7af0718f871fd08f01..7de4acc6c1282ac790ab355b4edee10bd095e20f 100644 (file)
@@ -43,8 +43,10 @@ typedef struct _WM_REGISTRATION
 {\r
        WM_PROVIDER                             *pProvider;\r
        WM_IB_DEVICE                    *pDevice;\r
-       LIST_ENTRY                              Entry;\r
 \r
+       ib_al_handle_t                  hIbal;\r
+       ib_ca_handle_t                  hCa;\r
+       ib_pd_handle_t                  hPd;\r
        ib_qp_handle_t                  hQp;\r
        ib_pool_key_t                   hMadPool;\r
        ib_mad_svc_handle_t             hService;\r