[ofw][patch][mlx4] MLX4_HCA in WDF form

Leonid Keller leonid at mellanox.co.il
Wed Mar 25 06:50:16 PDT 2009


This patch is a logical successor to one, removing registration of HCA
with IBAL (2019).
It returns MLX4_HCA to its original WDF form, but still keeps the
current WDM form under preprocessor flag.
 
 
Index: hw/mlx4/kernel/hca/drv.c
===================================================================
--- hw/mlx4/kernel/hca/drv.c (revision 2055)
+++ hw/mlx4/kernel/hca/drv.c (working copy)
@@ -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 @@
  */
 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,174 +81,7 @@
 //
 
 
-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(
  IN    PFDO_DEVICE_DATA const  p_fdo )
@@ -293,191 +113,6 @@
 }
 
 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 +142,66 @@
 
  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 +228,6 @@
   }
   /* Fall through. */
  default:
-  __hca_deregister( p_fdo );
   status = STATUS_SUCCESS;
   break;
  }
@@ -617,8 +246,10 @@
  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 +258,9 @@
  
  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 +269,8 @@
  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 +294,41 @@
  /* 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;
+ p_ifc->p_hca_obj = &p_fdo->hca;
+ 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 +351,16 @@
 
  // 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 +375,7 @@
  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 +384,14 @@
 
 
 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 +417,7 @@
 
  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 +451,7 @@
  //
  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 +461,7 @@
  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 +533,7 @@
  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 +550,7 @@
  //
 
  WDF_DRIVER_CONFIG_INIT(
-  &config, EvtDeviceAdd );
+  &config, EvtDriverDeviceAdd );
  config.EvtDriverUnload = EvtDriverUnload;
 
  //
@@ -949,6 +593,8 @@
  }
 
 end:
+ HCA_PRINT( TRACE_LEVEL_ERROR ,HCA_DBG_PNP ,
+  ("exit status %#x.\n", status));
  HCA_EXIT( HCA_DBG_PNP );
  return status;
 
@@ -1133,6 +779,15 @@
  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(
@@ -2301,9 +1956,6 @@
  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 ) {
Index: hw/mlx4/kernel/hca/drv.h
===================================================================
--- hw/mlx4/kernel/hca/drv.h (revision 2055)
+++ hw/mlx4/kernel/hca/drv.h (working copy)
@@ -150,16 +150,19 @@
  *  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 @@
  /* 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 @@
  );
 
 NTSTATUS
-EvtDeviceAdd(
+EvtDriverDeviceAdd(
  IN WDFDRIVER Driver,
  IN PWDFDEVICE_INIT Device
  );
Index: hw/mlx4/kernel/hca/mlx4_hca.inx
===================================================================
--- hw/mlx4/kernel/hca/mlx4_hca.inx (revision 2055)
+++ hw/mlx4/kernel/hca/mlx4_hca.inx (working copy)
@@ -391,12 +391,6 @@
 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 @@
 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
 
Index: hw/mlx4/kernel/hca/SOURCES
===================================================================
--- hw/mlx4/kernel/hca/SOURCES (revision 2055)
+++ hw/mlx4/kernel/hca/SOURCES (working copy)
@@ -42,7 +42,8 @@
 
 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 \

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20090325/8507b078/attachment.html>


More information about the ofw mailing list