From 7da83c7ec4bc7377aee5d8547d838262d7bc4196 Mon Sep 17 00:00:00 2001 From: ftillier Date: Wed, 19 Apr 2006 20:38:22 +0000 Subject: [PATCH] [IPoIB] Handle SA interaction failures during port activation git-svn-id: svn://openib.tc.cornell.edu/gen1@317 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- trunk/ulp/ipoib/kernel/ipoib_adapter.c | 45 ++++++++++++++++++++++++++ trunk/ulp/ipoib/kernel/ipoib_adapter.h | 3 ++ trunk/ulp/ipoib/kernel/ipoib_port.c | 12 +++---- 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/trunk/ulp/ipoib/kernel/ipoib_adapter.c b/trunk/ulp/ipoib/kernel/ipoib_adapter.c index d4bfdd39..67ee872d 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_adapter.c +++ b/trunk/ulp/ipoib/kernel/ipoib_adapter.c @@ -988,6 +988,51 @@ ipoib_set_active( } +/* + * If something goes wrong after the port goes active, e.g. + * - PortInfo query failure + * - MC Join timeout + * - etc + * Mark the port state as down, resume any pended OIDS, etc. + */ +void +ipoib_set_inactive( + IN ipoib_adapter_t* const p_adapter ) +{ + ib_pnp_event_t old_state; + + IPOIB_ENTER( IPOIB_DBG_INIT ); + + cl_obj_lock( &p_adapter->obj ); + old_state = p_adapter->state; + if( old_state != IB_PNP_PORT_REMOVE ) + p_adapter->state = IB_PNP_PORT_DOWN; + cl_obj_unlock( &p_adapter->obj ); + + /* + * If we had a pending OID request for OID_GEN_LINK_SPEED, + * complete it now. + */ + if( old_state == IB_PNP_PORT_INIT ) + { + NdisMIndicateStatus( p_adapter->h_adapter, + NDIS_STATUS_MEDIA_DISCONNECT, NULL, 0 ); + NdisMIndicateStatusComplete( p_adapter->h_adapter ); + + ipoib_resume_oids( p_adapter ); + } + + if( p_adapter->reset ) + { + p_adapter->reset = FALSE; + NdisMResetComplete( + p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE ); + } + + IPOIB_EXIT( IPOIB_DBG_INIT ); +} + + NDIS_STATUS ipoib_get_recv_stat( IN ipoib_adapter_t* const p_adapter, diff --git a/trunk/ulp/ipoib/kernel/ipoib_adapter.h b/trunk/ulp/ipoib/kernel/ipoib_adapter.h index 066ce03e..35cf0173 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_adapter.h +++ b/trunk/ulp/ipoib/kernel/ipoib_adapter.h @@ -393,6 +393,9 @@ void ipoib_set_active( IN ipoib_adapter_t* const p_adapter ); +void +ipoib_set_inactive( + IN ipoib_adapter_t* const p_adapter ); ib_api_status_t ipoib_reset_adapter( diff --git a/trunk/ulp/ipoib/kernel/ipoib_port.c b/trunk/ulp/ipoib/kernel/ipoib_port.c index dedc1d5e..f5015305 100644 --- a/trunk/ulp/ipoib/kernel/ipoib_port.c +++ b/trunk/ulp/ipoib/kernel/ipoib_port.c @@ -4496,12 +4496,14 @@ __port_info_cb( NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, EVENT_IPOIB_PORT_INFO_TIMEOUT, 0 ); IPOIB_TRACE( IPOIB_DBG_INFO, ("Port info query timed out.\n") ); + ipoib_set_inactive( p_port->p_adapter ); break; case IB_REMOTE_ERROR: NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, EVENT_IPOIB_PORT_INFO_REJECT, 0 ); IPOIB_TRACE( IPOIB_DBG_INFO, ("Port info query rejected by SA.\n") ); + ipoib_set_inactive( p_port->p_adapter ); break; default: @@ -4509,6 +4511,7 @@ __port_info_cb( EVENT_IPOIB_QUERY_PORT_INFO, 1, p_query_rec->status ); /* Hopefully we'll get an SM change event that will restart things. */ IPOIB_TRACE( IPOIB_DBG_INFO, ("Port info query failed.\n") ); + ipoib_set_inactive( p_port->p_adapter ); } /* Return the response MAD to AL. */ @@ -4640,8 +4643,7 @@ __bcast_get_cb( default: NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status ); - /* Flag the adapter as hung. */ - p_port->p_adapter->hung = TRUE; + ipoib_set_inactive( p_port->p_adapter ); } /* Return the response MAD to AL. */ @@ -4885,8 +4887,7 @@ __bcast_cb( { NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter, EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status ); - /* Flag the adapter as hung. */ - p_port->p_adapter->hung = TRUE; + ipoib_set_inactive( p_port->p_adapter ); } cl_obj_deref( &p_port->obj ); @@ -5152,8 +5153,7 @@ __mcast_cb( IPOIB_TRACE( IPOIB_DBG_ERROR, ("Multicast join request failed with status %s.\n", p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) ); - /* Flag the adapter as hung. */ - p_port->p_adapter->hung = TRUE; + ipoib_set_inactive( p_port->p_adapter ); cl_obj_deref( &p_port->obj ); IPOIB_EXIT( IPOIB_DBG_MCAST ); return; -- 2.41.0