Index: hw/mlx4/kernel/hca/drv.c
===================================================================
--- hw/mlx4/kernel/hca/drv.c	(revision 3414)
+++ hw/mlx4/kernel/hca/drv.c	(working copy)
@@ -66,24 +66,13 @@
 	return 0;
 }
 
-static ci_interface_t*
-__alloc_hca_ifc(
-	IN				PFDO_DEVICE_DATA const		p_fdo )
+static void
+__setup_hca_ifc(
+    IN              PFDO_DEVICE_DATA const      p_fdo,
+    OUT             ci_interface_t*             pIfc )
 {
-	ci_interface_t	*pIfc;
-
 	HCA_ENTER( HCA_DBG_PNP );
 
-	pIfc =
-		(ci_interface_t*)ExAllocatePoolWithTag( NonPagedPool, sizeof(ci_interface_t), MT_TAG_KERNEL );
-	if( !pIfc )
-	{
-		HCA_PRINT( TRACE_LEVEL_ERROR,HCA_DBG_PNP, 
-			("Failed to allocate ci_interface_t (%d bytes).\n",
-			sizeof(ci_interface_t)));
-		return NULL;
-	}
-
 	setup_ci_interface( p_fdo->hca.guid, pIfc );
 
 	pIfc->p_hca_obj = &p_fdo->hca;
@@ -92,21 +81,18 @@
 	pIfc->dev_revision = (uint16_t)p_fdo->hca.hw_ver;
 
 	HCA_EXIT( HCA_DBG_PNP );
-	return pIfc;
 }
 
 static void
 __unmap_hca_memory(
 	IN				PFDO_DEVICE_DATA const p_fdo )
 {
-	struct pci_dev *pdev;
+    struct pci_dev *pdev = p_fdo->bus_ib_ifc.pdev;
 	int				i;
 
 	HCA_ENTER( HCA_DBG_PNP );
 
 	if (p_fdo->bus_ib_ifc_taken) {
-		pdev = p_fdo->bus_ib_ifc.pdev;
-
 		for( i = 0; i < HCA_BAR_TYPE_MAX; i++ ) {
 			if (pdev->bar[i].virt) {
 				MmUnmapIoSpace( pdev->bar[i].virt, pdev->bar[i].size );
@@ -118,6 +104,7 @@
 	HCA_EXIT( HCA_DBG_PNP );
 }
 
+
 /* release the resources, allocated in hca_start */
 static void
 __hca_release_resources(
@@ -296,6 +283,7 @@
 	return STATUS_SUCCESS;
 }
 
+
 NTSTATUS
 EvtDeviceD0Exit(
 	IN WDFDEVICE  Device,
@@ -356,7 +344,6 @@
 	NTSTATUS status;
 	PFDO_DEVICE_DATA p_fdo  = FdoGetData(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;
 	RDMA_INTERFACE_VERBS_EX rdma_ifc_ex;
@@ -427,11 +414,6 @@
 	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);
@@ -439,8 +421,7 @@
 	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 );
+    __setup_hca_ifc( p_fdo, &p_ifc->Verbs );
 
 	/* create an upper interface */
 	WDF_QUERY_INTERFACE_CONFIG_INIT( &qiConfig, (PINTERFACE)p_ifc,
