From ba3d06476c8120ed5abd58c09eb485697ef54a5f Mon Sep 17 00:00:00 2001 From: leonidk Date: Sun, 2 Apr 2006 09:38:04 +0000 Subject: [PATCH] [MTHCA] a cleanup of the FW update path git-svn-id: svn://openib.tc.cornell.edu/gen1@270 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/hw/mthca/kernel/hca_driver.c | 86 +++++++++++++++++------------- 1 file changed, 50 insertions(+), 36 deletions(-) diff --git a/trunk/hw/mthca/kernel/hca_driver.c b/trunk/hw/mthca/kernel/hca_driver.c index df388be2..139f9781 100644 --- a/trunk/hw/mthca/kernel/hca_driver.c +++ b/trunk/hw/mthca/kernel/hca_driver.c @@ -345,6 +345,9 @@ fw_access_pciconf ( PAGED_CODE(); + if( !p_buffer ) + return STATUS_INVALID_PARAMETER; + if (p_BusInterface) { @@ -439,7 +442,6 @@ typedef struct _mthca_map_space { struct list_head list; PMDL p_mdl; PVOID va; - PEPROCESS p_pcs; } mthca_map_space; static NTSTATUS @@ -461,7 +463,7 @@ __map_crspace( HCA_ENTER( HCA_DBG_PNP ); // sanity checks - if ( buf_size < sizeof *p_res ) { + if ( buf_size < sizeof *p_res || !p_buf ) { status = STATUS_INVALID_PARAMETER; goto err_invalid_params; } @@ -485,7 +487,7 @@ __map_crspace( if ( ka == NULL) { HCA_PRINT(TRACE_LEVEL_ERROR , HCA_DBG_SHIM, ("No kernel mapping of CR space.\n") ); - status = STATUS_UNSUCCESSFUL; + status = STATUS_INSUFFICIENT_RESOURCES; goto err_map_to_kernel; } p_ext->bar[HCA_BAR_TYPE_HCR].virt = ka; @@ -505,12 +507,16 @@ __map_crspace( MmBuildMdlForNonPagedPool(p_mdl); // map the buffer into user space - ua = MmMapLockedPagesSpecifyCache( p_mdl, UserMode, MmNonCached, - NULL, FALSE, NormalPagePriority ); - if (ua == NULL) { - HCA_PRINT(TRACE_LEVEL_ERROR , HCA_DBG_SHIM, + __try + { + ua = MmMapLockedPagesSpecifyCache( p_mdl, UserMode, MmNonCached, + NULL, FALSE, NormalPagePriority ); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + HCA_PRINT(TRACE_LEVEL_ERROR , HCA_DBG_SHIM, ("MmMapLockedPagesSpecifyCache failed.\n") ); - status = STATUS_UNSUCCESSFUL; + status = STATUS_INSUFFICIENT_RESOURCES; goto err_map_to_user; } @@ -521,7 +527,6 @@ __map_crspace( // resource tracking p_map->p_mdl = p_mdl; p_map->va = ua; - p_map->p_pcs = PsGetCurrentProcess(); list_add_tail(&p_map->list, &p_context->map_list); up( &p_context->mutex ); @@ -553,12 +558,11 @@ __unmap_crspace( unmap_crspace *parm = (unmap_crspace *)p_buf; mthca_map_space *p_map, *p_tmp; int found = FALSE; - PEPROCESS p_pcs = PsGetCurrentProcess(); HCA_ENTER( HCA_DBG_PNP ); // sanity checks - if ( buf_size < sizeof *parm ) { + if ( buf_size < sizeof *parm || !p_buf ) { status = STATUS_INVALID_PARAMETER; goto err_invalid_params; } @@ -569,7 +573,7 @@ __unmap_crspace( // look for the mapping info list_for_each_entry_safe(p_map, p_tmp, &p_context->map_list, list, mthca_map_space, mthca_map_space) { - if (p_map->va == parm->va && p_map->p_pcs == p_pcs) { + if (p_map->va == parm->va) { found = TRUE; break; } @@ -579,7 +583,7 @@ __unmap_crspace( HCA_PRINT(TRACE_LEVEL_ERROR , HCA_DBG_SHIM, ("Not found internal info for unmappipng.%p for PID %d.\n" , parm->va, (int)(INT_PTR)PsGetCurrentProcessId())); - status = STATUS_UNSUCCESSFUL; + status = STATUS_INVALID_PARAMETER; goto err_not_found; } @@ -638,7 +642,6 @@ fw_access_ctrl( PVOID p_data; ULONG offset; ULONG POINTER_ALIGNMENT length; - ib_ci_op_t *p_ci; mlnx_hob_t *p_hob; struct ib_ucontext * p_context; @@ -646,28 +649,23 @@ fw_access_ctrl( UNREFERENCED_PARAMETER(num_handles); UNREFERENCED_PARAMETER(p_umv_buf); - status = STATUS_SUCCESS; + status = STATUS_INVALID_DEVICE_REQUEST; - if( p_umv_buf ) { - p_context = (struct ib_ucontext *)h_ca; - p_hob = HOB_FROM_IBDEV( ((struct ib_ucontext*)h_ca)->device ); - } - else { - p_context = NULL; - p_hob = (mlnx_hob_t *)(const void *)h_ca; - } + if( !p_umv_buf ) + return IB_UNSUPPORTED; + p_context = (struct ib_ucontext *)h_ca; + p_hob = HOB_FROM_IBDEV( ((struct ib_ucontext*)h_ca)->device ); p_dev_obj = (DEVICE_OBJECT *)EXT_FROM_HOB(p_hob)->cl_ext.p_self_do; - p_ci = p_ci_op; - if ( !p_ci || !p_ci->buf_size ) - return STATUS_INVALID_DEVICE_REQUEST; + if ( !p_ci_op || !p_ci_op->buf_size ) + return IB_INVALID_PARAMETER; - length = p_ci->buf_size; - offset = p_ci->buf_info; - p_data = p_ci->p_buf; + length = p_ci_op->buf_size; + offset = p_ci_op->buf_info; + p_data = p_ci_op->p_buf; - switch ( p_ci->command ) + switch ( p_ci_op->command ) { case FW_MAP_CRSPACE: status = __map_crspace(p_context, p_hob, p_data, length); @@ -703,7 +701,7 @@ fw_access_ctrl( if_ready = 0; BusInterface.InterfaceDereference((PVOID)BusInterface.Context); } - return status; + return IB_SUCCESS; case FW_OPEN_IF: // open BusInterface if ( !if_ready ) @@ -713,13 +711,16 @@ fw_access_ctrl( if ( NT_SUCCESS( status ) ) { if_ready = 1; - status = STATUS_SUCCESS; } } - return status; + else + { + status = STATUS_SUCCESS; + } + break; default: - status = STATUS_NOT_SUPPORTED; + status = STATUS_INVALID_DEVICE_REQUEST; } if ( status != STATUS_SUCCESS ) @@ -730,9 +731,22 @@ fw_access_ctrl( BusInterface.InterfaceDereference((PVOID)BusInterface.Context); } HCA_PRINT( TRACE_LEVEL_ERROR, HCA_DBG_INIT, - ("fw_access_ctrl failed returns %08x.\n", status)); + ("fw_access_ctrl failed, ntstatus: %08x.\n", status)); + } + switch( status ) + { + case STATUS_SUCCESS: + return IB_SUCCESS; + + case STATUS_INVALID_DEVICE_REQUEST: + return IB_UNSUPPORTED; + + case STATUS_INSUFFICIENT_RESOURCES: + return IB_INSUFFICIENT_RESOURCES; + + default: + return IB_ERROR; } - return status; } static NTSTATUS -- 2.41.0