From 550be882f509b2f72e399b900ff32be3e777580a Mon Sep 17 00:00:00 2001 From: leonidk Date: Sun, 29 Mar 2009 15:31:57 +0000 Subject: [PATCH] [MLX4] MLX4_HCA is returned to its original WDF form. [mlnx: 4103] The old WDM version is kept for now under a preprocessor flag. git-svn-id: svn://openib.tc.cornell.edu/gen1/trunk@2063 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- hw/mlx4/kernel/hca/SOURCES | 3 +- hw/mlx4/kernel/hca/drv.c | 546 ++++++-------------------------- hw/mlx4/kernel/hca/drv.h | 7 +- hw/mlx4/kernel/hca/mlx4_hca.inx | 9 +- 4 files changed, 108 insertions(+), 457 deletions(-) diff --git a/hw/mlx4/kernel/hca/SOURCES b/hw/mlx4/kernel/hca/SOURCES index 4a257917..cb3caf72 100644 --- a/hw/mlx4/kernel/hca/SOURCES +++ b/hw/mlx4/kernel/hca/SOURCES @@ -42,7 +42,8 @@ NTTARGETFILE0=mofcomp KMDF_VERSION=1 -C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS -D__LITTLE_ENDIAN -DUSE_WDM_FRAMEWORK -DUSE_WDM_INTERRUPTS +C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS -D__LITTLE_ENDIAN +#-DUSE_WDM_FRAMEWORK TARGETLIBS= \ $(TARGETPATH)\*\complib.lib \ diff --git a/hw/mlx4/kernel/hca/drv.c b/hw/mlx4/kernel/hca/drv.c index baf318c8..cb4d757f 100644 --- a/hw/mlx4/kernel/hca/drv.c +++ b/hw/mlx4/kernel/hca/drv.c @@ -42,9 +42,6 @@ #include "drv.tmh" #endif -#define DRV_VERSION "1.0" -#define DRV_RELDATE "02/01/2008" - GLOBALS g; /* @@ -53,16 +50,6 @@ GLOBALS g; */ char mlnx_uvp_lib_name[MAX_LIB_NAME] = {"mlx4u"}; - -static void -__put_ifc( - IN PINTERFACE p_ifc ) -{ - HCA_ENTER( HCA_DBG_PNP ); - p_ifc->InterfaceDereference( p_ifc->Context ); - HCA_EXIT( HCA_DBG_PNP ); -} - static int __get_dev_info(PFDO_DEVICE_DATA p_fdo, __be64 *node_guid, u32 *hw_id) { struct ib_device_attr device_attr; @@ -94,173 +81,6 @@ static int __get_dev_info(PFDO_DEVICE_DATA p_fdo, __be64 *node_guid, u32 *hw_id) // -static NTSTATUS -__get_ci_interface( - IN PFDO_DEVICE_DATA p_fdo ) -{ - NTSTATUS status; - IRP *p_irp; - IO_STATUS_BLOCK ioStatus; - IO_STACK_LOCATION *pIoStack; - KEVENT event; - - HCA_ENTER( HCA_DBG_PNP ); - - KeInitializeEvent( &event, NotificationEvent, FALSE ); - - /* Query for the verbs interface. */ - p_irp = IoBuildSynchronousFsdRequest( IRP_MJ_PNP, p_fdo->p_al_dev, - NULL, 0, NULL, &event, &ioStatus ); - if( !p_irp ) - { - HCA_PRINT( TRACE_LEVEL_ERROR, HCA_DBG_PNP, - ("IoBuildSynchronousFsdRequest failed.\n")); - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* Format the IRP. */ - pIoStack = IoGetNextIrpStackLocation( p_irp ); - pIoStack->MinorFunction = IRP_MN_QUERY_INTERFACE; - pIoStack->Parameters.QueryInterface.Version = IB_CI_INTERFACE_VERSION; - pIoStack->Parameters.QueryInterface.Size = sizeof(ib_ci_ifc_t); - pIoStack->Parameters.QueryInterface.Interface = - (INTERFACE*)&p_fdo->ci_ifc; - pIoStack->Parameters.QueryInterface.InterfaceSpecificData = NULL; - pIoStack->Parameters.QueryInterface.InterfaceType = - &GUID_IB_CI_INTERFACE; - p_irp->IoStatus.Status = STATUS_NOT_SUPPORTED; - - /* Send the IRP. */ - status = IoCallDriver( p_fdo->p_al_dev, p_irp ); - if( status == STATUS_PENDING ) - { - KeWaitForSingleObject( &event, Executive, KernelMode, - FALSE, NULL ); - - status = ioStatus.Status; - } - - if( !NT_SUCCESS( status ) ) - { - HCA_PRINT( TRACE_LEVEL_ERROR,HCA_DBG_PNP, - ("Query interface for verbs returned %08x.\n", status)); - return status; - } - - HCA_EXIT( HCA_DBG_PNP ); - return status; -} - - -static NTSTATUS -__pnp_notify_target( - IN void *pNotifyStruct, - IN void *context ) -{ - NTSTATUS status = STATUS_SUCCESS; - PFDO_DEVICE_DATA p_fdo = context; - PDEVICE_OBJECT p_dev_obj = WdfDeviceWdmGetDeviceObject(p_fdo->FdoDevice); - TARGET_DEVICE_REMOVAL_NOTIFICATION *pNotify; - - HCA_ENTER( HCA_DBG_PNP ); - - pNotify = (TARGET_DEVICE_REMOVAL_NOTIFICATION*)pNotifyStruct; - - if( IsEqualGUID( &pNotify->Event, &GUID_TARGET_DEVICE_QUERY_REMOVE ) ) - { - if ( p_fdo->state == HCA_REGISTERED) { - /* Release AL's CI interface. */ - p_fdo->ci_ifc.wdm.InterfaceDereference( p_fdo->ci_ifc.wdm.Context ); - p_fdo->state = HCA_IFC_DEREFERENCED; - } - - /* Release AL's file object so that it can unload. */ - CL_ASSERT( p_fdo->p_al_dev ); - CL_ASSERT( p_fdo->p_al_file_obj ); - CL_ASSERT( p_fdo->p_al_file_obj == pNotify->FileObject ); - if( p_fdo->p_al_file_obj ) { - ObDereferenceObject( p_fdo->p_al_file_obj ); - p_fdo->p_al_file_obj = NULL; - p_fdo->p_al_dev = NULL; - } - } - else if( IsEqualGUID( &pNotify->Event, - &GUID_TARGET_DEVICE_REMOVE_COMPLETE ) ) - { - if (p_fdo->ci_ifc.deregister_ca) { - /* Notify AL that the CA is being removed. */ - p_fdo->ci_ifc.deregister_ca( p_fdo->hca.guid ); - p_fdo->ci_ifc.deregister_ca = NULL; - } - - if ( p_fdo->state == HCA_REGISTERED) { - /* Release AL's CI interface. */ - p_fdo->ci_ifc.wdm.InterfaceDereference( p_fdo->ci_ifc.wdm.Context ); - } - p_fdo->state = HCA_STARTED; - - /* Release AL's file object so that it can unload. */ - if( p_fdo->p_al_file_obj ) - { - ObDereferenceObject( p_fdo->p_al_file_obj ); - p_fdo->p_al_file_obj = NULL; - p_fdo->p_al_dev = NULL; - } - - /* Cancel our target device change registration. */ - if (p_fdo->pnp_target_entry) { - IoUnregisterPlugPlayNotification( p_fdo->pnp_target_entry ); - p_fdo->pnp_target_entry = NULL; - } - - } - else if( IsEqualGUID( &pNotify->Event, - &GUID_TARGET_DEVICE_REMOVE_CANCELLED ) ) - { - /* Cancel our target device change registration. */ - if (p_fdo->pnp_target_entry) { - IoUnregisterPlugPlayNotification( p_fdo->pnp_target_entry ); - p_fdo->pnp_target_entry = NULL; - } - - /* Get the device object pointer for the AL. */ - CL_ASSERT( !p_fdo->p_al_file_obj ); - CL_ASSERT( !p_fdo->p_al_dev ); - /* Get the AL device object. */ - HCA_PRINT( TRACE_LEVEL_INFORMATION ,HCA_DBG_SHIM ,("Calling IoGetDeviceObjectPointer.\n")); - status = IoGetDeviceObjectPointer( &p_fdo->al_sym_name, - FILE_ALL_ACCESS, &p_fdo->p_al_file_obj, &p_fdo->p_al_dev ); - if( !NT_SUCCESS( status ) ) - { - HCA_PRINT( TRACE_LEVEL_ERROR, HCA_DBG_SHIM, - ("IoGetDeviceObjectPointer returned %08x.\n", status )); - return STATUS_SUCCESS; - } - - /* Register for removal notification of the IB Fabric root device. */ - status = IoRegisterPlugPlayNotification( - EventCategoryTargetDeviceChange, 0, p_fdo->p_al_file_obj, - p_dev_obj->DriverObject, __pnp_notify_target, p_fdo, - &p_fdo->pnp_target_entry ); - if( !NT_SUCCESS( status ) ) - { - HCA_PRINT( TRACE_LEVEL_ERROR, HCA_DBG_PNP, - ("IoRegisterPlugPlayNotification returned %08x.\n", status)); - return status; - } - - CL_ASSERT( p_fdo->state == HCA_IFC_DEREFERENCED ); - if ( p_fdo->state == HCA_IFC_DEREFERENCED) { - /* Release AL's CI interface. */ - p_fdo->ci_ifc.wdm.InterfaceReference( p_fdo->ci_ifc.wdm.Context ); - p_fdo->state = HCA_REGISTERED; - } - } - - HCA_EXIT( HCA_DBG_PNP ); - return status; -} - static ci_interface_t* __alloc_hca_ifc( @@ -282,8 +102,7 @@ __alloc_hca_ifc( setup_ci_interface( p_fdo->hca.guid, !!hca_is_livefish(p_fdo), pIfc ); - pIfc->p_hca_dev = WdfDeviceWdmGetPhysicalDevice(p_fdo->FdoDevice); - ASSERT(pIfc->p_hca_dev); + pIfc->p_hca_obj = &p_fdo->hca; pIfc->vend_id = (uint32_t)p_fdo->bus_ib_ifc.pdev->ven_id; pIfc->dev_id = (uint16_t)p_fdo->bus_ib_ifc.pdev->dev_id; pIfc->dev_revision = (uint16_t)p_fdo->hca.hw_ver; @@ -292,191 +111,6 @@ __alloc_hca_ifc( return pIfc; } -static void -__hca_deregister( - IN PFDO_DEVICE_DATA p_fdo ) -{ - HCA_ENTER( HCA_DBG_PNP ); - - if ( p_fdo->state == HCA_REGISTERED) { - if (p_fdo->ci_ifc.deregister_ca) { - /* Notify AL that the CA is being removed. */ - p_fdo->ci_ifc.deregister_ca( p_fdo->hca.guid ); - p_fdo->ci_ifc.deregister_ca = NULL; - /* Release AL's CI interface. */ - p_fdo->ci_ifc.wdm.InterfaceDereference( p_fdo->ci_ifc.wdm.Context ); - p_fdo->state = HCA_STARTED; - HCA_PRINT( TRACE_LEVEL_INFORMATION ,HCA_DBG_PNP, - ("***** HCA deregistered \n")); - } - } - - HCA_EXIT( HCA_DBG_PNP ); -} - -static NTSTATUS -__hca_register( - IN PFDO_DEVICE_DATA p_fdo ) -{ - NTSTATUS status; - ib_api_status_t ib_status; - ci_interface_t *p_hca_ifc; - - HCA_ENTER( HCA_DBG_PNP ); - - ASSERT( p_fdo->state == HCA_STARTED ); - ASSERT( p_fdo->p_al_dev ); - - /* Get the AL's lower interface. */ - status = __get_ci_interface( p_fdo ); - if( !NT_SUCCESS( status ) ) - { - HCA_PRINT( TRACE_LEVEL_ERROR,HCA_DBG_PNP, - ("__get_ci_interface returned %08x.\n", status)); - goto exit; - } - - /* Allocate and populate our HCA interface structure. */ - p_hca_ifc = __alloc_hca_ifc( p_fdo ); - if( !p_hca_ifc ) - { - HCA_PRINT( TRACE_LEVEL_ERROR ,HCA_DBG_PNP ,("__alloc_hca_ifc failed.\n")); - status = STATUS_NO_MEMORY; - goto exit; - } - - /* Notify AL that we're available... */ - ib_status = p_fdo->ci_ifc.register_ca( p_hca_ifc ); - ExFreePool( p_hca_ifc ); - if( ib_status != IB_SUCCESS ) - { - p_fdo->ci_ifc.wdm.InterfaceDereference( p_fdo->ci_ifc.wdm.Context ); - status = STATUS_INSUFFICIENT_RESOURCES; - goto exit; - } - - p_fdo->state = HCA_REGISTERED; - HCA_PRINT( TRACE_LEVEL_INFORMATION ,HCA_DBG_PNP, - ("***** HCA registered \n")); -exit: - HCA_EXIT( HCA_DBG_PNP ); - return status; -} - -static NTSTATUS -__pnp_notify_ifc( - IN void *pNotifyStruct, - IN void *context ) -{ - NTSTATUS status = STATUS_SUCCESS; - DEVICE_INTERFACE_CHANGE_NOTIFICATION *pNotify; - PFDO_DEVICE_DATA p_fdo = context; - PDEVICE_OBJECT p_dev_obj = WdfDeviceWdmGetDeviceObject(p_fdo->FdoDevice); - - HCA_ENTER( HCA_DBG_PNP ); - - pNotify = (DEVICE_INTERFACE_CHANGE_NOTIFICATION*)pNotifyStruct; - - if( !IsEqualGUID( &pNotify->Event, &GUID_DEVICE_INTERFACE_ARRIVAL ) ) - goto done; - - /* - * Sanity check. We should only be getting notifications of the - * CI interface exported by AL. - */ - ASSERT( - IsEqualGUID( &pNotify->InterfaceClassGuid, &GUID_IB_CI_INTERFACE ) ); - - if( p_fdo->state != HCA_STARTED ) - { - HCA_PRINT( TRACE_LEVEL_ERROR ,HCA_DBG_PNP ,("Invalid state: %d\n", p_fdo->state)); - goto done; - } - - /* save symbolic name of IBAL for a case of cancelled IBAL removal */ - if (!p_fdo->al_sym_name.Buffer) { - p_fdo->al_sym_name.Length = pNotify->SymbolicLinkName->Length; - p_fdo->al_sym_name.MaximumLength = pNotify->SymbolicLinkName->MaximumLength; - p_fdo->al_sym_name.Buffer = ExAllocatePoolWithTag( NonPagedPool, - p_fdo->al_sym_name.MaximumLength * sizeof(wchar_t), MT_TAG_KERNEL ); - if (!p_fdo->al_sym_name.Buffer) - { - HCA_PRINT( TRACE_LEVEL_ERROR ,HCA_DBG_PNP ,("allocation of sym IBAL name failed.\n")); - goto done; - } - RtlCopyUnicodeString( &p_fdo->al_sym_name, pNotify->SymbolicLinkName ); - } - - ASSERT( !p_fdo->p_al_dev ); - ASSERT( !p_fdo->p_al_file_obj ); - - /* Get the AL device object. */ - HCA_PRINT( TRACE_LEVEL_INFORMATION ,HCA_DBG_PNP ,("Calling IoGetDeviceObjectPointer.\n")); - status = IoGetDeviceObjectPointer( pNotify->SymbolicLinkName, - FILE_ALL_ACCESS, &p_fdo->p_al_file_obj, &p_fdo->p_al_dev ); - if( !NT_SUCCESS( status ) ) - { - HCA_PRINT( TRACE_LEVEL_ERROR, HCA_DBG_PNP, - ("IoGetDeviceObjectPointer returned %08x.\n", status )); - goto done; - } - - /* Register for removal notification of the IB Fabric root device. */ - HCA_PRINT( TRACE_LEVEL_INFORMATION, HCA_DBG_PNP, - ("Registering for target notifications.\n")); - status = IoRegisterPlugPlayNotification( - EventCategoryTargetDeviceChange, 0, p_fdo->p_al_file_obj, - p_dev_obj->DriverObject, __pnp_notify_target, p_fdo, - &p_fdo->pnp_target_entry ); - if( !NT_SUCCESS( status ) ) - { - HCA_PRINT( TRACE_LEVEL_ERROR, HCA_DBG_PNP, - ("IoRegisterPlugPlayNotification returned %08x.\n", status)); - goto err_reg_notify; - } - - status = __hca_register( p_fdo ); - if( !NT_SUCCESS( status ) ) - { - HCA_PRINT( TRACE_LEVEL_ERROR, HCA_DBG_PNP, - ("__get_ci_interface returned %08x.\n", status)); - goto err_reg_hca; - } - goto done; - -err_reg_hca: - IoUnregisterPlugPlayNotification( p_fdo->pnp_target_entry ); - p_fdo->pnp_target_entry = NULL; -err_reg_notify: - ObDereferenceObject( p_fdo->p_al_file_obj ); - p_fdo->p_al_file_obj = NULL; - p_fdo->p_al_dev = NULL; -done: - HCA_EXIT( HCA_DBG_PNP ); - return status; -} - -/* Forwards the request to the HCA's PDO. */ -static NTSTATUS -__get_ifc( - IN WDFDEVICE const FdoDevice, - IN const GUID* const p_guid, - IN USHORT size, - IN USHORT Version, - IN OUT PVOID InterfaceSpecificData, - OUT PINTERFACE p_ifc ) -{ - NTSTATUS status; - - HCA_ENTER( HCA_DBG_PNP ); - - status = WdfFdoQueryForInterface( FdoDevice, p_guid, p_ifc, - size, Version, InterfaceSpecificData ); - - HCA_EXIT( HCA_DBG_PNP ); - return status; -} - static void __unmap_hca_memory( IN PFDO_DEVICE_DATA const p_fdo ) @@ -507,71 +141,66 @@ __hca_release_resources( switch( p_fdo->state ) { - case HCA_REGISTERED: - __hca_deregister( p_fdo ); - - /* Fall through. */ case HCA_STARTED: /* dequeue HCA */ mlnx_hca_remove( &p_fdo->hca ); } - - if (p_fdo->al_sym_name.Buffer) { - ExFreePool( p_fdo->al_sym_name.Buffer ); - p_fdo->al_sym_name.Buffer = NULL; - } - if( p_fdo->pnp_target_entry ) - { - ASSERT( p_fdo->pnp_ifc_entry ); - IoUnregisterPlugPlayNotification( p_fdo->pnp_target_entry ); - p_fdo->pnp_target_entry = NULL; - } + __unmap_hca_memory( p_fdo ); - if( p_fdo->pnp_ifc_entry ) { - IoUnregisterPlugPlayNotification( p_fdo->pnp_ifc_entry ); - p_fdo->pnp_ifc_entry = NULL; - } + p_fdo->state = HCA_ADDED; - if( p_fdo->p_al_file_obj ) { - ObDereferenceObject( p_fdo->p_al_file_obj ); - p_fdo->p_al_file_obj = NULL; - } + HCA_EXIT( HCA_DBG_PNP ); +} - __unmap_hca_memory( p_fdo ); +static void +__ref_ifc( + IN DEVICE_OBJECT* p_dev_obj ) +{ + PFDO_DEVICE_DATA p_fdo = (PFDO_DEVICE_DATA)p_dev_obj->DeviceExtension; - p_fdo->state = HCA_ADDED; + HCA_ENTER( HCA_DBG_PNP ); + + cl_atomic_inc( &p_fdo->n_hca_ifc_ref ); + ObReferenceObject( p_dev_obj ); + + HCA_PRINT( TRACE_LEVEL_ERROR, HCA_DBG_PNP, + ("MLX4_HCA: CA_guid %I64x, hca_ifc_ref %d\n", + p_fdo->hca.guid, p_fdo->n_hca_ifc_ref) ); HCA_EXIT( HCA_DBG_PNP ); } +static void +__deref_ifc( + IN DEVICE_OBJECT* p_dev_obj ) +{ + PFDO_DEVICE_DATA p_fdo = (PFDO_DEVICE_DATA)p_dev_obj->DeviceExtension; + + HCA_ENTER( HCA_DBG_PNP ); + + cl_atomic_dec( &p_fdo->n_hca_ifc_ref ); + ObDereferenceObject( p_dev_obj ); + + HCA_PRINT( TRACE_LEVEL_ERROR, HCA_DBG_PNP, + ("MLX4_HCA: CA_guid %I64x, hca_ifc_ref %d\n", + p_fdo->hca.guid, p_fdo->n_hca_ifc_ref) ); + + HCA_EXIT( HCA_DBG_PNP ); +} + + + NTSTATUS EvtDeviceD0Entry( IN WDFDEVICE Device, IN WDF_POWER_DEVICE_STATE PreviousState ) { - PFDO_DEVICE_DATA p_fdo = FdoGetData(Device); - NTSTATUS status = STATUS_SUCCESS; - + UNUSED_PARAM(Device); UNUSED_PARAM(PreviousState); HCA_ENTER( HCA_DBG_PNP ); - HCA_PRINT(TRACE_LEVEL_INFORMATION, HCA_DBG_PNP, ("EvtDeviceD0Entry: PreviousState 0x%x\n", PreviousState)); - - /* Connect to IBAL */ - HCA_PRINT( TRACE_LEVEL_INFORMATION, HCA_DBG_PO, - ("***** Connect to IBAL, IRQL %d\n", KeGetCurrentIrql())); - - if( p_fdo->p_al_dev && p_fdo->state == HCA_STARTED) { - status = __hca_register( p_fdo ); - if( !NT_SUCCESS( status ) ) { - HCA_PRINT( TRACE_LEVEL_ERROR, HCA_DBG_PO, - ("!!! __hca_register failed (%#x) \n", status)); - status = STATUS_UNSUCCESSFUL; - } - } - HCA_EXIT( HCA_DBG_PNP ); return STATUS_SUCCESS; } @@ -598,7 +227,6 @@ EvtDeviceD0Exit( } /* Fall through. */ default: - __hca_deregister( p_fdo ); status = STATUS_SUCCESS; break; } @@ -617,8 +245,10 @@ EvtDevicePrepareHardware( int err; NTSTATUS status; PFDO_DEVICE_DATA p_fdo = FdoGetData(Device); - PDEVICE_OBJECT p_dev_obj = WdfDeviceWdmGetDeviceObject(Device); BUS_INTERFACE_STANDARD bus_pci_ifc; + ci_interface_t *p_hca_ifc; + RDMA_INTERFACE_VERBS rdma_ifc, *p_ifc = &rdma_ifc; + WDF_QUERY_INTERFACE_CONFIG qiConfig; UNUSED_PARAM(ResourcesRaw); UNUSED_PARAM(ResourcesTranslated); @@ -627,11 +257,9 @@ EvtDevicePrepareHardware( HCA_PRINT(TRACE_LEVEL_INFORMATION, HCA_DBG_PNP, ("EvtPrepareHardware: \n")); - ASSERT(p_dev_obj); - /* get PCI BUS interface */ - status = __get_ifc( Device, &GUID_BUS_INTERFACE_STANDARD, - sizeof(BUS_INTERFACE_STANDARD), 1, NULL, (PINTERFACE)&bus_pci_ifc); + status = WdfFdoQueryForInterface( Device, &GUID_BUS_INTERFACE_STANDARD, + (PINTERFACE)&bus_pci_ifc, sizeof(BUS_INTERFACE_STANDARD), 1, NULL ); if( !NT_SUCCESS( status ) ) { HCA_PRINT(TRACE_LEVEL_ERROR, HCA_DBG_PNP, ("Getting PCI BUS interface failed: status=0x%x\n", status)); return status; @@ -640,8 +268,8 @@ EvtDevicePrepareHardware( p_fdo->bus_pci_ifc_taken = TRUE; /* get MLX4_BUS IB interface */ - status = __get_ifc( Device, &MLX4_BUS_IB_INTERFACE_GUID, - sizeof(MLX4_BUS_IB_INTERFACE), MLX4_BUS_IB_INTERFACE_VERSION, NULL, (PINTERFACE)&p_fdo->bus_ib_ifc); + status = WdfFdoQueryForInterface( Device, &MLX4_BUS_IB_INTERFACE_GUID, + (PINTERFACE)&p_fdo->bus_ib_ifc, sizeof(MLX4_BUS_IB_INTERFACE), MLX4_BUS_IB_INTERFACE_VERSION, NULL ); if( !NT_SUCCESS( status ) ) { HCA_PRINT(TRACE_LEVEL_ERROR, HCA_DBG_PNP, ("Getting MLX4 BUS interface failed: status=0x%x\n", status)); return status; @@ -665,27 +293,40 @@ EvtDevicePrepareHardware( /* queue HCA */ mlnx_hca_insert( &p_fdo->hca ); + /* Allocate and populate our HCA interface structure. */ + p_hca_ifc = __alloc_hca_ifc( p_fdo ); + if( !p_hca_ifc ) { + HCA_PRINT( TRACE_LEVEL_ERROR ,HCA_DBG_PNP ,("__alloc_hca_ifc failed.\n")); + return STATUS_NO_MEMORY; + } + + /* fill interface fields */ + p_ifc->InterfaceHeader.Size = sizeof(RDMA_INTERFACE_VERBS); + p_ifc->InterfaceHeader.Version = VerbsVersion(VERBS_MAJOR_VER, VERBS_MINOR_VER); + p_ifc->InterfaceHeader.Context = p_fdo->p_dev_obj; + p_ifc->InterfaceHeader.InterfaceReference = __ref_ifc; + p_ifc->InterfaceHeader.InterfaceDereference = __deref_ifc; + p_ifc->Verbs = *p_hca_ifc; + ExFreePool( p_hca_ifc ); + + /* create an upper interface */ + WDF_QUERY_INTERFACE_CONFIG_INIT( &qiConfig, (PINTERFACE)p_ifc, + &GUID_RDMA_INTERFACE_VERBS, NULL); + + status = WdfDeviceAddQueryInterface( Device, &qiConfig ); + if (!NT_SUCCESS(status)) { + HCA_PRINT( TRACE_LEVEL_ERROR ,HCA_DBG_PNP ,("WdfDeviceAddQueryInterface failed %#x\n", status)); + return status; + } + /* * Change the state since the PnP callback can happen * before the callback returns. */ p_fdo->state = HCA_STARTED; - /* Register for interface arrival of the IB_AL device. */ - status = IoRegisterPlugPlayNotification( - EventCategoryDeviceInterfaceChange, - PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES, - (void*)&GUID_IB_CI_INTERFACE, p_dev_obj->DriverObject, - __pnp_notify_ifc, p_fdo, &p_fdo->pnp_ifc_entry ); - if( !NT_SUCCESS( status ) ) - { - p_fdo->state = HCA_ADDED; - HCA_PRINT( TRACE_LEVEL_ERROR, HCA_DBG_PNP, - ("IoRegisterPlugPlayNotification returned %08x.\n", status)); - } - HCA_EXIT( HCA_DBG_PNP ); - return status; + return STATUS_SUCCESS; } @@ -708,14 +349,16 @@ EvtDeviceReleaseHardware( // release MLX4_BUS resources if(p_fdo->bus_ib_ifc_taken) { + PINTERFACE p_ifc = (PINTERFACE)&p_fdo->bus_ib_ifc; + p_ifc->InterfaceDereference( p_ifc->Context ); p_fdo->bus_ib_ifc_taken = FALSE; - __put_ifc( (PINTERFACE)&p_fdo->bus_ib_ifc ); } // release PCI BUS resources if(p_fdo->bus_pci_ifc_taken) { + PINTERFACE p_ifc = (PINTERFACE)&p_fdo->bus_pci_ifc; + p_ifc->InterfaceDereference( p_ifc->Context ); p_fdo->bus_pci_ifc_taken = FALSE; - __put_ifc( (PINTERFACE)&p_fdo->bus_pci_ifc ); } HCA_EXIT( HCA_DBG_PNP ); @@ -730,7 +373,7 @@ EvtDeviceQueryRemove( PFDO_DEVICE_DATA p_fdo = FdoGetData(Device); HCA_ENTER( HCA_DBG_PNP ); if (atomic_read(&p_fdo->usecnt)) { - cl_dbg_out( "MLX4: Can't get unloaded. %d applications are still in work\n", p_fdo->usecnt); + cl_dbg_out( "MLX4_HCA: Can't get unloaded. %d applications are still in work\n", p_fdo->usecnt); return STATUS_UNSUCCESSFUL; } HCA_EXIT( HCA_DBG_PNP ); @@ -739,14 +382,14 @@ EvtDeviceQueryRemove( NTSTATUS -EvtDeviceAdd( +EvtDriverDeviceAdd( IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit ) /*++ Routine Description: - EvtDeviceAdd is called by the framework in response to AddDevice + EvtDriverDeviceAdd is called by the framework in response to AddDevice call from the PnP manager. We create and initialize a device object to represent a new instance of mxe bus. @@ -772,7 +415,7 @@ Return Value: PAGED_CODE (); - HCA_PRINT(TRACE_LEVEL_INFORMATION, HCA_DBG_PNP, ("EvtDeviceAdd: 0x%p\n", Driver)); + HCA_PRINT(TRACE_LEVEL_INFORMATION, HCA_DBG_PNP, ("EvtDriverDeviceAdd: 0x%p\n", Driver)); // // register PnP & Power stuff // @@ -806,7 +449,7 @@ Return Value: // status = WdfDeviceCreate(&DeviceInit, &attributes, &device); if (!NT_SUCCESS(status)) { - HCA_PRINT(TRACE_LEVEL_VERBOSE, HCA_DBG_PNP, ("EvtDeviceAdd: WdfDeviceCreate failed with 0x%x\n", status)); + HCA_PRINT(TRACE_LEVEL_VERBOSE, HCA_DBG_PNP, ("EvtDriverDeviceAdd: WdfDeviceCreate failed with 0x%x\n", status)); goto end; } @@ -816,6 +459,7 @@ Return Value: p_fdo = FdoGetData(device); RtlZeroMemory(p_fdo, sizeof(FDO_DEVICE_DATA)); p_fdo->FdoDevice = device; + p_fdo->p_dev_obj = WdfDeviceWdmGetDeviceObject( device ); spin_lock_init( &p_fdo->uctx_lock ); cl_qlist_init( &p_fdo->uctx_list ); atomic_set(&p_fdo->usecnt, 0); @@ -887,9 +531,7 @@ Return Value: g.DebugPrintLevel = TRACE_LEVEL_VERBOSE; g.DebugPrintFlags = 0xffff; HCA_ENTER( HCA_DBG_PNP ); - HCA_PRINT(TRACE_LEVEL_INFORMATION, HCA_DBG_PNP, - ("Built %s %s, Version %s, RelDate %s\n", - __DATE__, __TIME__, DRV_VERSION, DRV_RELDATE)); + status = mlnx_hcas_init(); if( status != STATUS_SUCCESS ) { HCA_PRINT( TRACE_LEVEL_ERROR ,HCA_DBG_PNP , @@ -906,7 +548,7 @@ Return Value: // WDF_DRIVER_CONFIG_INIT( - &config, EvtDeviceAdd ); + &config, EvtDriverDeviceAdd ); config.EvtDriverUnload = EvtDriverUnload; // @@ -949,6 +591,8 @@ Return Value: } end: + HCA_PRINT( TRACE_LEVEL_ERROR ,HCA_DBG_PNP , + ("exit status %#x.\n", status)); HCA_EXIT( HCA_DBG_PNP ); return status; @@ -1133,6 +777,15 @@ hca_add_device( return status; } +static void +__put_ifc( + IN PINTERFACE p_ifc ) +{ + HCA_ENTER( HCA_DBG_PNP ); + p_ifc->InterfaceDereference( p_ifc->Context ); + HCA_EXIT( HCA_DBG_PNP ); +} + /* Forwards the request to the HCA's PDO. */ static NTSTATUS __get_ifc( @@ -1215,8 +868,7 @@ __alloc_hca_ifc( setup_ci_interface( p_fdo->hca.guid, !!hca_is_livefish(p_fdo), pIfc ); - pIfc->p_hca_dev = p_fdo->cl_ext.p_pdo; - ASSERT(pIfc->p_hca_dev); + pIfc->p_hca_obj = &p_fdo->hca; pIfc->vend_id = (uint32_t)p_fdo->bus_ib_ifc.pdev->ven_id; pIfc->dev_id = (uint16_t)p_fdo->bus_ib_ifc.pdev->dev_id; pIfc->dev_revision = (uint16_t)p_fdo->hca.hw_ver; @@ -1641,7 +1293,6 @@ __query_ci_ifc( p_ifc->InterfaceHeader.InterfaceReference = __ref_ifc; p_ifc->InterfaceHeader.InterfaceDereference = __deref_ifc; p_ifc->Verbs = *p_hca_ifc; - p_ifc->p_hca_obj = &p_fdo->hca; /* take the reference before returning. */ __ref_ifc( p_dev_obj ); @@ -2301,9 +1952,6 @@ DriverEntry( g.DebugPrintFlags = 0xffff; HCA_ENTER( HCA_DBG_PNP ); - HCA_PRINT(TRACE_LEVEL_INFORMATION, HCA_DBG_PNP, - ("Built %s %s, Version %s, RelDate %s\n", - __DATE__, __TIME__, DRV_VERSION, DRV_RELDATE)); status = mlnx_hcas_init(); if( status != STATUS_SUCCESS ) { diff --git a/hw/mlx4/kernel/hca/drv.h b/hw/mlx4/kernel/hca/drv.h index 0b42e6ab..732d9fd7 100644 --- a/hw/mlx4/kernel/hca/drv.h +++ b/hw/mlx4/kernel/hca/drv.h @@ -150,16 +150,19 @@ typedef struct _FDO_DEVICE_DATA * WDF DATA * ------------------------------------------------ */ WDFDEVICE FdoDevice; + DEVICE_OBJECT * p_dev_obj; /* WDM dev object */ #endif HCA_WMI_STD_DATA WmiData; +#ifdef USE_WDM_FRAMEWORK /* ------------------------------------------------- * PNP DATA * ------------------------------------------------ */ void * pnp_ifc_entry; /* Notification entry for PnP interface events. */ void * pnp_target_entry; /* Notification entry for PnP target events. */ PNP_DEVICE_STATE pnpState; /* state for PnP Manager */ +#endif /* ------------------------------------------------- * IBAL DATA @@ -167,9 +170,11 @@ typedef struct _FDO_DEVICE_DATA /* Number of references on the upper interface. */ atomic32_t n_hca_ifc_ref; hca_reg_state_t state; /* State for tracking registration with AL */ +#ifdef USE_WDM_FRAMEWORK DEVICE_OBJECT * p_al_dev; /* IB_AL FDO */ FILE_OBJECT * p_al_file_obj; /* IB_AL file object */ UNICODE_STRING al_sym_name; /* IB_AL symbolic name */ +#endif /* ------------------------------------------------- * SHIM DATA @@ -300,7 +305,7 @@ EvtDriverUnload( ); NTSTATUS -EvtDeviceAdd( +EvtDriverDeviceAdd( IN WDFDRIVER Driver, IN PWDFDEVICE_INIT Device ); diff --git a/hw/mlx4/kernel/hca/mlx4_hca.inx b/hw/mlx4/kernel/hca/mlx4_hca.inx index e3d7ece7..046a70cc 100644 --- a/hw/mlx4/kernel/hca/mlx4_hca.inx +++ b/hw/mlx4/kernel/hca/mlx4_hca.inx @@ -391,12 +391,6 @@ DelService = WinVerbs,%SPSVCINST_STOPSERVICE% DelService = Ibbus,%SPSVCINST_STOPSERVICE% DelService = mlx4_hca,%SPSVCINST_STOPSERVICE% - -; -; It should be uncommented after returning MLX4_HCA to WDF model. -; WinVerbs is a WDF, KMDF driver. -; - ;***************************************** ; WDF Coinstaller installation section ;***************************************** @@ -420,14 +414,17 @@ HKR,,CoInstallers32,0x00010000, "WdfCoInstaller01007.dll,WdfCoInstaller" WdfCoInstaller01007.dll [MLX4HCA.DDInstall.ntx86.Wdf] +KmdfService = mlx4_hca,WvWdfSect KmdfService = WinVerbs,WvWdfSect KmdfService = WinMad,WvWdfSect [MLX4HCA.DDInstall.ntamd64.Wdf] +KmdfService = mlx4_hca,WvWdfSect KmdfService = WinVerbs,WvWdfSect KmdfService = WinMad,WvWdfSect [MLX4HCA.DDInstall.ntia64.Wdf] +KmdfService = mlx4_hca,WvWdfSect KmdfService = WinVerbs,WvWdfSect KmdfService = WinMad,WvWdfSect -- 2.17.1