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
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
\r
file = WdfRequestGetFileObject(Request);\r
prov = WmProviderGetContext(file);\r
-\r
WmProviderRead(prov, Request);\r
}\r
\r
\r
file = WdfRequestGetFileObject(Request);\r
prov = WmProviderGetContext(file);\r
-\r
WmProviderWrite(prov, Request);\r
}\r
\r
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
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
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
}\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
if (create) {\r
WmCreateControlDevice(WdfGetDriver());\r
}\r
-\r
return STATUS_SUCCESS;\r
}\r
\r
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
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
pProvider->MadHead = (ib_mad_element_t *) mad->p_next;\r
mad->p_next = NULL;\r
}\r
-\r
return mad;\r
}\r
\r
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
WM_REGISTRATION *reg;\r
\r
while ((reg = IndexListRemoveHead(&pProvider->RegIndex)) != NULL) {\r
- RemoveEntryList(®->Entry);\r
WmRegFree(reg);\r
}\r
\r
{\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
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
\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
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
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
\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
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
WmProviderEnableRemove(pProvider);\r
}\r
KeReleaseGuardedMutex(&pProvider->Lock);\r
-\r
return reg;\r
}\r
\r
}\r
}\r
}\r
-\r
return unsolicited;\r
}\r
\r
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
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
&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
}\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