From: ftillier Date: Wed, 15 Mar 2006 00:03:33 +0000 (+0000) Subject: [IPoIB] Fix NDIS WHQL 1c_Reset test failures. X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=4f7982735e70cc0e6f0d494502ad2d4e97b9ac78;p=~shefty%2Frdma-win.git [IPoIB] Fix NDIS WHQL 1c_Reset test failures. git-svn-id: svn://openib.tc.cornell.edu/gen1@245 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/trunk/ulp/ipoib/kernel/ipoib_adapter.c b/trunk/ulp/ipoib/kernel/ipoib_adapter.c index 7e90b6dd..1ff47f59 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_adapter.c +++ b/trunk/ulp/ipoib/kernel/ipoib_adapter.c @@ -212,7 +212,8 @@ ipoib_start_adapter( IPOIB_ENTER( IPOIB_DBG_INIT ); - status = __ipoib_pnp_reg( p_adapter, IB_PNP_FLAG_REG_SYNC ); + status = __ipoib_pnp_reg( p_adapter, + IB_PNP_FLAG_REG_SYNC | IB_PNP_FLAG_REG_COMPLETE ); IPOIB_EXIT( IPOIB_DBG_INIT ); return status; @@ -371,6 +372,9 @@ __ipoib_pnp_reg( IPOIB_ENTER( IPOIB_DBG_INIT ); CL_ASSERT( !p_adapter->h_pnp ); + CL_ASSERT( !p_adapter->registering ); + + p_adapter->registering = TRUE; /* Register for PNP events. */ cl_memclr( &pnp_req, sizeof(pnp_req) ); @@ -384,6 +388,7 @@ __ipoib_pnp_reg( status = p_adapter->p_ifc->reg_pnp( p_adapter->h_al, &pnp_req, &p_adapter->h_pnp ); if( status != IB_SUCCESS ) { + p_adapter->registering = FALSE; IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("ib_reg_pnp returned %s\n", p_adapter->p_ifc->get_err_str( status )) ); @@ -573,8 +578,10 @@ __ipoib_pnp_cb( case IB_PNP_PORT_INIT: case IB_PNP_PORT_ARMED: + status = IB_SUCCESS; + break; + case IB_PNP_PORT_DOWN: - /* Leave multicast groups. */ CL_ASSERT( p_pnp_rec->context ); cl_obj_lock( &p_adapter->obj ); @@ -583,9 +590,8 @@ __ipoib_pnp_cb( cl_obj_unlock( &p_adapter->obj ); status = IB_SUCCESS; - switch( old_state ) + if( !p_adapter->registering /*&& old_state == IB_PNP_PORT_ACTIVE*/ ) { - case IB_PNP_PORT_ACTIVE: NdisMIndicateStatus( p_adapter->h_adapter, NDIS_STATUS_MEDIA_DISCONNECT, NULL, 0 ); NdisMIndicateStatusComplete( p_adapter->h_adapter ); @@ -593,25 +599,30 @@ __ipoib_pnp_cb( IPOIB_TRACE( IPOIB_DBG_INFO, ("Link DOWN!\n") ); ipoib_port_down( p_adapter->p_port ); - break; - - case IB_PNP_PORT_ADD: - /* If we were initializing, we might have pended some OIDs. */ - ipoib_resume_oids( p_adapter ); - NdisMIndicateStatus( p_adapter->h_adapter, - NDIS_STATUS_MEDIA_DISCONNECT, NULL, 0 ); - NdisMIndicateStatusComplete( p_adapter->h_adapter ); - break; - - default: - break; } break; case IB_PNP_REG_COMPLETE: - if( p_adapter->hung ) + if( p_adapter->registering ) { - p_adapter->hung = FALSE; + p_adapter->registering = FALSE; + cl_obj_lock( &p_adapter->obj ); + old_state = p_adapter->state; + cl_obj_unlock( &p_adapter->obj ); + + if( old_state == IB_PNP_PORT_DOWN ) + { + /* If we were initializing, we might have pended some OIDs. */ + ipoib_resume_oids( p_adapter ); + NdisMIndicateStatus( p_adapter->h_adapter, + NDIS_STATUS_MEDIA_DISCONNECT, NULL, 0 ); + NdisMIndicateStatusComplete( p_adapter->h_adapter ); + } + } + + if( p_adapter->reset && p_adapter->state != IB_PNP_PORT_ACTIVE ) + { + p_adapter->reset = FALSE; NdisMResetComplete( p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE ); } @@ -719,6 +730,9 @@ ipoib_reset_adapter( IPOIB_ENTER( IPOIB_DBG_INIT ); + p_adapter->hung = FALSE; + p_adapter->reset = TRUE; + if( p_adapter->h_pnp ) { status = p_adapter->p_ifc->dereg_pnp( @@ -772,16 +786,12 @@ __ipoib_pnp_dereg( if( p_port ) ipoib_port_destroy( p_port ); - /* Complete any pending OIDs. */ - ipoib_resume_oids( p_adapter ); - ipoib_dereg_addrs( p_adapter ); - if( state != IB_PNP_PORT_REMOVE ) { status = __ipoib_pnp_reg( p_adapter, IB_PNP_FLAG_REG_COMPLETE ); if( status != IB_SUCCESS ) { - p_adapter->hung = FALSE; + p_adapter->reset = FALSE; IPOIB_TRACE( IPOIB_DBG_ERROR, ("__ipoib_pnp_reg returned %s\n", p_adapter->p_ifc->get_err_str( status )) ); @@ -791,7 +801,7 @@ __ipoib_pnp_dereg( } else { - p_adapter->hung = FALSE; + p_adapter->reset = FALSE; NdisMResetComplete( p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE ); status = IB_SUCCESS; @@ -929,6 +939,13 @@ ipoib_set_active( NdisMIndicateStatusComplete( p_adapter->h_adapter ); } + if( p_adapter->reset ) + { + p_adapter->reset = FALSE; + NdisMResetComplete( + p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE ); + } + IPOIB_EXIT( IPOIB_DBG_INIT ); } diff --git a/trunk/ulp/ipoib/kernel/ipoib_adapter.h b/trunk/ulp/ipoib/kernel/ipoib_adapter.h index 3a1849a1..d516c9db 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_adapter.h +++ b/trunk/ulp/ipoib/kernel/ipoib_adapter.h @@ -135,6 +135,8 @@ typedef struct _ipoib_adapter ib_pnp_event_t state; boolean_t hung; + boolean_t reset; + boolean_t registering; boolean_t pending_query; pending_oid_t query_oid; diff --git a/trunk/ulp/ipoib/kernel/ipoib_driver.c b/trunk/ulp/ipoib/kernel/ipoib_driver.c index 4047adb9..d0cfd955 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_driver.c +++ b/trunk/ulp/ipoib/kernel/ipoib_driver.c @@ -723,6 +723,14 @@ ipoib_check_for_hang( IPOIB_ENTER( IPOIB_DBG_INIT ); CL_ASSERT( adapter_context ); p_adapter = (ipoib_adapter_t*)adapter_context; + + if( p_adapter->reset ) + { + p_adapter->reset = FALSE; + NdisMResetComplete( + p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE ); + } + IPOIB_EXIT( IPOIB_DBG_INIT ); return (p_adapter->hung? TRUE:FALSE); } diff --git a/trunk/ulp/ipoib/kernel/ipoib_port.c b/trunk/ulp/ipoib/kernel/ipoib_port.c index fe757a45..dedc1d5e 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_port.c +++ b/trunk/ulp/ipoib/kernel/ipoib_port.c @@ -2484,7 +2484,7 @@ __send_mgr_destroy( { p_packet = IPOIB_PACKET_FROM_LIST_ITEM( p_item ); NdisMSendComplete( p_port->p_adapter->h_adapter, p_packet, - NDIS_STATUS_REQUEST_ABORTED ); + NDIS_STATUS_RESET_IN_PROGRESS ); } IPOIB_EXIT( IPOIB_DBG_SEND );