// Provides the driver entry points for the Access Layer.\r
//\r
\r
-#include "complib/cl_types.h"\r
-#include "complib/cl_memory.h"\r
+#include <complib/cl_init.h>\r
#include "al_init.h"\r
#include "al_mgr.h"\r
#include "al_debug.h"\r
\r
AL_ENTER( AL_DBG_DEV );\r
\r
+ status = CL_INIT;\r
+ if( !NT_SUCCESS(status) )\r
+ {\r
+ AL_TRACE_EXIT( AL_DBG_ERROR,\r
+ ("cl_init returned %08X.\n", status) );\r
+ return status;\r
+ }\r
+\r
/* Get the registry values. */\r
status = __read_registry( p_registry_path );\r
if( !NT_SUCCESS(status) )\r
{\r
+ CL_DEINIT;\r
AL_TRACE_EXIT( AL_DBG_ERROR, \r
("__read_registry returned %08x.\n", status) );\r
return status;\r
{\r
AL_ENTER( AL_DBG_DEV );\r
\r
+ CL_DEINIT;\r
+\r
AL_EXIT( AL_DBG_DEV );\r
return STATUS_SUCCESS;\r
}\r
\r
INCLUDES=..\..\..\inc;..\..\..\inc\kernel;..\..\al;..\..\al\kernel;\r
\r
-C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS\r
+C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS -DNEED_CL_OBJ\r
\r
TARGETLIBS= \\r
$(TARGETPATH)\*\complib.lib \\r
*/\r
\r
\r
-\r
-\r
/*\r
* Provides the driver entry points for the InfiniBand Bus Driver.\r
*/\r
\r
-#include "complib/cl_types.h"\r
+#include <complib/cl_types.h>\r
#include "bus_driver.h"\r
#include "bus_pnp.h"\r
#include "al_mgr.h"\r
#include "al_dev.h"\r
-#include "complib/cl_memory.h"\r
+#include <complib/cl_init.h>\r
+\r
\r
bus_globals_t bus_globals = {\r
BUS_DBG_ERROR,\r
\r
UNUSED_PARAM( p_driver_obj );\r
\r
+ CL_DEINIT;\r
+\r
BUS_EXIT( BUS_DBG_DRV );\r
}\r
\r
\r
BUS_ENTER( BUS_DBG_DRV );\r
\r
+ status = CL_INIT;\r
+ if( !NT_SUCCESS(status) )\r
+ {\r
+ BUS_TRACE_EXIT( BUS_DBG_ERROR,\r
+ ("cl_init returned %08X.\n", status) );\r
+ return status;\r
+ }\r
+\r
/* Store the driver object pointer in the global parameters. */\r
bus_globals.p_driver_obj = p_driver_obj;\r
\r
status = __read_registry( p_registry_path );\r
if( !NT_SUCCESS(status) )\r
{\r
+ CL_DEINIT;\r
BUS_TRACE_EXIT( BUS_DBG_ERROR, \r
("__read_registry returned %08x.\n", status) );\r
return status;\r
ClassGuid={4D36E97D-E325-11CE-BFC1-08002BE10318}\r
Provider=%SST%\r
CatalogFile=ibbus.cat\r
-DriverVer=05/10/2005,3.0.0031.0\r
+DriverVer=07/28/2005,3.0.0034.0\r
\r
\r
; ================= Device Install section =====================\r
1=%DiskId%,,,\ia64\r
\r
[SourceDisksFiles.x86]\r
-complib.sys=1\r
ibal.sys=1\r
ibbus.sys=1\r
ibiou.sys=1\r
dapl.dll=1\r
\r
[SourceDisksFiles.amd64]\r
-complib.sys=1\r
ibal.sys=1\r
ibbus.sys=1\r
ibiou.sys=1\r
dapl32.dll=1\r
\r
[SourceDisksFiles.ia64]\r
-complib.sys=1\r
ibal.sys=1\r
ibbus.sys=1\r
ibiou.sys=1\r
AddService = ibiou,%SPSVCINST_ASSOCSERVICE%,Iou.ServiceInstall\r
\r
[Ibbus.CopyFiles]\r
-complib.sys\r
ibal.sys\r
ibbus.sys\r
\r
\r
\r
#include "cl_memtrack.h"\r
+#include <complib/cl_atomic.h>\r
\r
\r
cl_mem_tracker_t *gp_mem_tracker = NULL;\r
+atomic32_t g_mem_trk_ref = 0;\r
\r
\r
/*\r
cl_status_t status;\r
\r
if( gp_mem_tracker )\r
+ {\r
+ cl_atomic_inc( &g_mem_trk_ref );\r
return;\r
+ }\r
\r
/* Allocate the memory tracker object. */\r
gp_mem_tracker = (cl_mem_tracker_t*)\r
return;\r
}\r
\r
+ cl_atomic_inc( &g_mem_trk_ref );\r
+\r
cl_msg_out( "\n\n\n*** Memory tracker object address = %p ***\n\n\n",\r
gp_mem_tracker );\r
}\r
if( !gp_mem_tracker )\r
return;\r
\r
+ if( cl_atomic_dec( &g_mem_trk_ref ) )\r
+ return;\r
+\r
if( cl_qmap_count( &gp_mem_tracker->alloc_map ) )\r
{\r
/* There are still items in the list. Print them out. */\r
cl_malloc_hdr_t *p_hdr;\r
cl_list_item_t *p_list_item;\r
void *p_mem;\r
- char temp_buf[FILE_NAME_LENGTH];\r
+ uint64_t temp_buf[FILE_NAME_LENGTH/sizeof(uint64_t)];\r
int32_t temp_line;\r
\r
/*\r
* parameters are in paged pool.\r
*/\r
temp_line = line_num;\r
- strncpy( temp_buf, p_file_name, FILE_NAME_LENGTH );\r
+ strncpy( (char*)temp_buf, p_file_name, FILE_NAME_LENGTH );\r
/* Make sure the string is null terminated. */\r
- temp_buf[FILE_NAME_LENGTH - 1] = '\0';\r
+ ((char*)temp_buf)[FILE_NAME_LENGTH - 1] = '\0';\r
\r
cl_spinlock_acquire( &gp_mem_tracker->lock );\r
\r
\r
/* The global object manager. */\r
cl_obj_mgr_t *gp_obj_mgr = NULL;\r
+atomic32_t g_cl_obj_ref = 0;\r
\r
\r
\r
\r
/* See if the object manager has already been created. */\r
if( gp_obj_mgr )\r
+ {\r
+ cl_atomic_inc( &g_cl_obj_ref );\r
return CL_SUCCESS;\r
+ }\r
\r
/* Allocate the object manager. */\r
gp_obj_mgr = cl_zalloc( sizeof( cl_obj_mgr_t ) );\r
cl_async_proc_construct( &gp_obj_mgr->async_proc_mgr );\r
cl_qpool_construct( &gp_obj_mgr->rel_pool );\r
\r
+ cl_atomic_inc( &g_cl_obj_ref );\r
+\r
/* Initialize the spinlock. */\r
status = cl_spinlock_init( &gp_obj_mgr->lock );\r
if( status != CL_SUCCESS )\r
if( !gp_obj_mgr )\r
return;\r
\r
+ /* See if this is the last call. */\r
+ if( cl_atomic_dec( &g_cl_obj_ref ) )\r
+ return;\r
+\r
/* Verify that all object's have been destroyed. */\r
for( p_list_item = cl_qlist_head( &gp_obj_mgr->obj_list );\r
p_list_item != cl_qlist_end( &gp_obj_mgr->obj_list );\r
TARGETNAME=complib\r
TARGETPATH=..\..\..\bin\kernel\obj$(BUILD_ALT_DIR)\r
-TARGETTYPE=EXPORT_DRIVER\r
+TARGETTYPE=DRIVER_LIBRARY\r
\r
DLLDEF=cl_exports.def\r
\r
#include "complib/comp_lib.h"\r
\r
\r
-NTSTATUS \r
-DriverEntry( \r
- IN DRIVER_OBJECT *pDevObj, \r
- IN UNICODE_STRING *RegistryPath )\r
-{\r
- UNUSED_PARAM( pDevObj );\r
- UNUSED_PARAM( RegistryPath );\r
- return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-NTSTATUS\r
-DllInitialize(\r
- IN UNICODE_STRING *RegistryPath )\r
-{\r
- cl_status_t status;\r
- UNUSED_PARAM( RegistryPath );\r
-\r
- __cl_mem_track( TRUE );\r
-\r
- status = cl_obj_mgr_create();\r
-\r
- return cl_to_ntstatus( status );\r
-}\r
-\r
-\r
-NTSTATUS\r
-DllUnload(void)\r
-{\r
- cl_obj_mgr_destroy();\r
-\r
- __cl_mem_track( FALSE );\r
-\r
- return STATUS_SUCCESS;\r
-}\r
-\r
-\r
CL_EXPORT NTSTATUS\r
cl_to_ntstatus(\r
IN cl_status_t status )\r
\r
INCLUDES=..\..\..\inc;..\..\..\inc\kernel;\r
\r
-C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS\r
+C_DEFINES=$(C_DEFINES) -DDRIVER -DDEPRECATE_DDK_FUNCTIONS -DNEED_CL_OBJ\r
\r
TARGETLIBS= \\r
$(TARGETPATH)\*\complib.lib\r
* Provides the driver entry points for the InfiniBand I/O Unit Bus Driver.\r
*/\r
\r
-#include "complib/cl_types.h"\r
+#include <complib/cl_types.h>\r
#include "iou_driver.h"\r
#include "iou_pnp.h"\r
-#include "complib/cl_memory.h"\r
+#include <complib/cl_init.h>\r
\r
\r
iou_globals_t iou_globals = {\r
\r
UNUSED_PARAM( p_driver_obj );\r
\r
+ CL_DEINIT;\r
+\r
IOU_EXIT( IOU_DBG_DRV );\r
}\r
\r
\r
IOU_ENTER( IOU_DBG_DRV );\r
\r
+ status = CL_INIT;\r
+ if( !NT_SUCCESS(status) )\r
+ {\r
+ IOU_TRACE_EXIT( IOU_DBG_ERROR,\r
+ ("cl_init returned %08X.\n", status) );\r
+ return status;\r
+ }\r
+\r
/* Store the driver object pointer in the global parameters. */\r
iou_globals.p_driver_obj = p_driver_obj;\r
\r
status = __read_registry( p_registry_path );\r
if( !NT_SUCCESS(status) )\r
{\r
+ CL_DEINIT;\r
IOU_TRACE_EXIT( IOU_DBG_ERROR, \r
("__read_registry returned %08x.\n", status) );\r
return status;\r
#include "MdCard.h"\r
#pragma warning( pop )\r
#include <iba/ib_ci_ifc.h>\r
+#include <complib/cl_init.h>\r
\r
\r
/*\r
\r
HCA_ENTER( HCA_DBG_DEV );\r
\r
+ status = CL_INIT;\r
+ if( !NT_SUCCESS(status) )\r
+ {\r
+ HCA_TRACE_EXIT( HCA_DBG_ERROR,\r
+ ("cl_init returned %08X.\n", status) );\r
+ return status;\r
+ }\r
+\r
status = __read_registry( p_registry_path );\r
if( !NT_SUCCESS( status ) )\r
{\r
+ CL_DEINIT;\r
HCA_TRACE_EXIT( HCA_DBG_ERROR,\r
("__read_registry_path returned 0x%X.\n", status) );\r
return status;\r
cl_status = mlnx_hobs_init();\r
if( cl_status != CL_SUCCESS )\r
{\r
+ CL_DEINIT;\r
HCA_TRACE_EXIT( HCA_DBG_ERROR,\r
("mlnx_hobs_init returned %s.\n", cl_status_text[cl_status]) );\r
return cl_to_ntstatus( cl_status );\r
\r
UNUSED_PARAM( p_driver_obj );\r
\r
+ CL_DEINIT;\r
+\r
HCA_EXIT( HCA_DBG_DEV );\r
}\r
\r
ClassGUID=%HcaClassGuid%\r
Provider=%SST%\r
CatalogFile=infiniserv.cat\r
-DriverVer=05/10/2005,3.0.0031.0\r
+DriverVer=07/28/2005,3.0.0034.0\r
\r
; ================= Destination directory section =====================\r
\r
\r
[SourceDisksFiles]\r
IbInstaller.dll=1\r
-complib.sys=1\r
ibal.sys=1\r
mt23108.sys=1\r
thca.sys=1\r
\r
[SourceDisksFiles.amd64]\r
IbInstaller.dll=1\r
-complib.sys=1\r
ibal.sys=1\r
mt23108.sys=1\r
thca.sys=1\r
\r
[SourceDisksFiles.ia64]\r
IbInstaller.dll=1\r
-complib.sys=1\r
ibal.sys=1\r
mt23108.sys=1\r
thca.sys=1\r
AddService = ibal,%SPSVCINST_NULL%,Ibal.ServiceInstall\r
\r
[MT23108.CopyFiles]\r
-complib.sys\r
ibal.sys\r
mt23108.sys\r
thca.sys\r
* $Id$\r
*/\r
\r
+\r
#define _MD_C_\r
\r
#include "MdGen.h"\r
#include "thh_hob.h"\r
+#include <complib/cl_init.h>\r
+\r
\r
#define CHECK_INIT(lbl) \\r
if (l_MddkStatus != MT_OK) \\r
/* no context yet */\r
g_pDrvContext = NULL;\r
\r
+ l_Status = CL_INIT;\r
+ if( !NT_SUCCESS(l_Status) )\r
+ return l_Status;\r
+\r
/* create Control Device names */\r
if (!MdCreateDeviceNames(MD_CTL_DEVICE_NAME, &l_usNtDeviceName, &l_usDosDeviceName))\r
{ /* failed - no resources */\r
MdKdPrint( DBGLVL_ALWAYS ,("(MdDeviceInit) Device failed to initialize \n"));\r
#pragma warning( pop )\r
\r
+ CL_DEINIT;\r
+\r
/* Write to event log */\r
WriteEventLogEntry( pi_pDriverObject, MD_EVENT_LOG_LOAD_ERROR,\r
0, l_Status, 1, l_Status );\r
\r
/* free the driver context */\r
MdExFreePool( l_pDrvContext );\r
+\r
+ CL_DEINIT;\r
+\r
g_pDrvContext = NULL;\r
\r
MDASSERT( g_pDbgData->m_nExAllocCount == 0 );\r
--- /dev/null
+/*\r
+ * Copyright (c) 2005 SilverStorm Technologies. All rights reserved.\r
+ *\r
+ * This software is available to you under the OpenIB.org BSD license\r
+ * below:\r
+ *\r
+ * Redistribution and use in source and binary forms, with or\r
+ * without modification, are permitted provided that the following\r
+ * conditions are met:\r
+ *\r
+ * - Redistributions of source code must retain the above\r
+ * copyright notice, this list of conditions and the following\r
+ * disclaimer.\r
+ *\r
+ * - Redistributions in binary form must reproduce the above\r
+ * copyright notice, this list of conditions and the following\r
+ * disclaimer in the documentation and/or other materials\r
+ * provided with the distribution.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
+ * SOFTWARE.\r
+ *\r
+ * $Id$\r
+ */\r
+\r
+\r
+#ifndef _CL_INIT_H_\r
+#define _CL_INIT_H_\r
+\r
+\r
+#include <complib/cl_memory.h>\r
+#include <complib/cl_obj.h>\r
+\r
+\r
+#ifdef CL_TRACK_MEM\r
+#ifdef NEED_CL_OBJ\r
+#define CL_INIT (__cl_mem_track( TRUE ), cl_obj_mgr_create())\r
+#define CL_DEINIT (cl_obj_mgr_destroy(), __cl_mem_track( FALSE ))\r
+#else /* NEED_CL_OBJ */\r
+#define CL_INIT (__cl_mem_track( TRUE ), STATUS_SUCCESS)\r
+#define CL_DEINIT (__cl_mem_track( FALSE ))\r
+#endif /* NEED_CL_OBJ */\r
+#else /* CL_TRACK_MEM */\r
+#ifdef NEED_CL_OBJ\r
+#define CL_INIT cl_obj_mgr_create()\r
+#define CL_DEINIT cl_obj_mgr_destroy()\r
+#else /* NEED_CL_OBJ */\r
+#define CL_INIT STATUS_SUCCESS\r
+#define CL_DEINIT\r
+#endif /* NEED_CL_OBJ */\r
+#endif /* CL_TRACK_MEM */\r
+\r
+#endif // _CL_INIT_H_\r
#include <wdmwarn4.h>\r
#if defined( NDIS_MINIPORT_DRIVER )\r
#include <ndis.h>\r
+#if NDIS_WDM\r
+#define CL_NTDDK\r
+#endif /* NDIS_WDM */\r
#elif !defined( _MINIPORT_ )\r
#include <ntddk.h>\r
#define CL_NTDDK\r
#define UNUSED_PARAM UNREFERENCED_PARAMETER\r
\r
\r
-#if !defined(EXPORT_CL_SYMBOLS)\r
-#define CL_EXPORT DECLSPEC_IMPORT\r
-#else\r
-#define CL_EXPORT __declspec(dllexport)\r
-#endif\r
+#define CL_EXPORT\r
\r
#if !defined( __cplusplus )\r
#define inline __inline\r
\r
#define CL_CONST64( x ) x##ui64\r
\r
-CL_INLINE NTSTATUS\r
+NTSTATUS\r
cl_to_ntstatus(\r
IN enum _cl_status status );\r
\r
-CL_INLINE enum _cl_status\r
+enum _cl_status\r
cl_from_ntstatus(\r
IN NTSTATUS status );\r
\r
-\r
#ifdef __cplusplus\r
} /* extern "C" */\r
#endif\r
ClassGUID=%HcaClassGuid%\r
Provider=%Vendor%\r
CatalogFile=infiniserv.cat\r
-DriverVer=05/10/2005,3.0.0031.0\r
+DriverVer=07/28/2005,3.0.0034.0\r
\r
; ================= Destination directory section =====================\r
\r
*/\r
\r
\r
-\r
/*\r
* Provides the driver entry points for the ALTS kernel driver.\r
*/\r
#include <complib/cl_thread.h>\r
#include "alts_common.h"\r
#include "alts_debug.h"\r
+#include <complib/cl_init.h>\r
\r
\r
#if !defined(FILE_DEVICE_INFINIBAND) // Not defined in WXP DDK\r
IN PDRIVER_OBJECT p_driver_obj,\r
IN PUNICODE_STRING p_registry_path )\r
{\r
+ NTSTATUS status;\r
#ifdef _DEBUG_\r
static boolean_t exit = FALSE;\r
#endif\r
}\r
#endif\r
\r
+ status = CL_INIT;\r
+ if( !NT_SUCCESS(status) )\r
+ {\r
+ ALTS_TRACE_EXIT( ALTS_DBG_ERROR,\r
+ ("cl_init returned %08X.\n", status) );\r
+ return status;\r
+ }\r
+\r
p_driver_obj->MajorFunction[IRP_MJ_PNP] = cl_pnp;\r
p_driver_obj->MajorFunction[IRP_MJ_POWER] = cl_power;\r
// p_driver_obj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = alts_ioctl;\r
\r
UNUSED_PARAM( p_driver_obj );\r
\r
+ CL_DEINIT;\r
+\r
ALTS_EXIT( ALTS_DBG_DEV );\r
}\r
\r
INCLUDES=..;..\..\..\inc;..\..\..\inc\kernel;\r
\r
C_DEFINES=$(C_DEFINES) -DNDIS_MINIPORT_DRIVER -DNDIS_WDM=1 \\r
- -DDEPRECATE_DDK_FUNCTIONS -DNDIS51_MINIPORT\r
+ -DDEPRECATE_DDK_FUNCTIONS -DNDIS51_MINIPORT -DNEED_CL_OBJ -DBINARY_COMPATIBLE=0\r
\r
TARGETLIBS= \\r
$(TARGETPATH)\*\complib.lib \\r
#include "ipoib_port.h"\r
#include "ipoib_driver.h"\r
#include "ipoib_debug.h"\r
+#include <complib/cl_init.h>\r
\r
\r
#define ITEM_POOL_START 16\r
\r
IPOIB_ENTER( IPOIB_DBG_INIT );\r
\r
+ if( !NT_SUCCESS( CL_INIT ) )\r
+ {\r
+ IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR,\r
+ ("cl_init failed.\n") );\r
+ return IB_ERROR;\r
+ }\r
+\r
p_adapter = cl_zalloc( sizeof(ipoib_adapter_t) );\r
if( !p_adapter )\r
{\r
+ CL_DEINIT;\r
IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, \r
("Failed to allocate ipoib_adapter_t (%d bytes)",\r
sizeof(ipoib_adapter_t)) );\r
\r
cl_free( p_adapter );\r
\r
+ CL_DEINIT;\r
+\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
}\r
\r
\r
!if defined(DDK_TARGET_OS) && "$(DDK_TARGET_OS)"=="WinXP"\r
# storport.h in WinXP DDK already have "..._ALIASES" definition\r
-C_DEFINES=$(C_DEFINES) -DDEPRECATE_DDK_FUNCTIONS -DWinXP\r
+C_DEFINES=$(C_DEFINES) -DDEPRECATE_DDK_FUNCTIONS -DWinXP -DNEED_CL_OBJ\r
!else\r
-C_DEFINES=$(C_DEFINES) -DDEPRECATE_DDK_FUNCTIONS -DSTOR_USE_SCSI_ALIASES\r
+C_DEFINES=$(C_DEFINES) -DDEPRECATE_DDK_FUNCTIONS -DSTOR_USE_SCSI_ALIASES \\r
+ -DNEED_CL_OBJ\r
!endif\r
\r
TARGETLIBS= \\r
*/\r
\r
\r
-\r
-\r
#include "srp_data.h"\r
#include "srp_data_path.h"\r
#include "srp_debug.h"\r
\r
#include <complib/cl_math.h>\r
#include <complib/cl_mutex.h>\r
+#include <complib/cl_init.h>\r
\r
\r
#define SCSI_MAXIMUM_TRANSFER_SIZE (1024 * 1024)\r
IN DRIVER_OBJECT *p_drv_obj,\r
IN UNICODE_STRING *p_registry_path )\r
{\r
- ULONG status = (ULONG)STATUS_INSUFFICIENT_RESOURCES;\r
+ ULONG status;\r
HW_INITIALIZATION_DATA hw_data;\r
cl_status_t cl_status;\r
\r
SRP_ENTER( SRP_DBG_PNP );\r
\r
+ status = CL_INIT;\r
+ if( !NT_SUCCESS(status) )\r
+ {\r
+ SRP_TRACE_EXIT( SRP_DBG_ERROR,\r
+ ("cl_init returned %08X.\n", status) );\r
+ return status;\r
+ }\r
+\r
gp_drv_obj = p_drv_obj;\r
\r
cl_obj_construct( &g_drv_obj, SRP_OBJ_TYPE_DRV );\r
}\r
else\r
{\r
+ CL_DEINIT;\r
SRP_TRACE( SRP_DBG_ERROR,\r
("StorPortInitialize returned 0x%x.\n", status) );\r
}\r
}\r
+ else\r
+ {\r
+ CL_DEINIT;\r
+ status = (ULONG)STATUS_INSUFFICIENT_RESOURCES;\r
+ }\r
\r
SRP_TRACE_EXIT( SRP_DBG_PNP, ("DriverEntry returning status of 0x%x.\n", status) );\r
return status;\r
SRP_TRACE( SRP_DBG_VERBOSE, ("Driver Object ref_cnt = %d\n", g_drv_obj.ref_cnt) );\r
cl_obj_destroy( &g_drv_obj );\r
\r
+ CL_DEINIT;\r
+\r
/* Invoke the port driver's unload routine. */\r
SRP_TRACE( SRP_DBG_DEBUG, ("Invoking the port driver's unload routine.\n") );\r
gpfn_unload( p_drv_obj );\r