\r
IPOIB_ENTER( IPOIB_DBG_INIT );\r
\r
- status = __ipoib_pnp_reg( p_adapter, IB_PNP_FLAG_REG_SYNC );\r
+ status = __ipoib_pnp_reg( p_adapter,\r
+ IB_PNP_FLAG_REG_SYNC | IB_PNP_FLAG_REG_COMPLETE );\r
\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
return status;\r
IPOIB_ENTER( IPOIB_DBG_INIT );\r
\r
CL_ASSERT( !p_adapter->h_pnp );\r
+ CL_ASSERT( !p_adapter->registering );\r
+\r
+ p_adapter->registering = TRUE;\r
\r
/* Register for PNP events. */\r
cl_memclr( &pnp_req, sizeof(pnp_req) );\r
status = p_adapter->p_ifc->reg_pnp( p_adapter->h_al, &pnp_req, &p_adapter->h_pnp );\r
if( status != IB_SUCCESS )\r
{\r
+ p_adapter->registering = FALSE;\r
IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR,\r
("ib_reg_pnp returned %s\n", \r
p_adapter->p_ifc->get_err_str( status )) );\r
\r
case IB_PNP_PORT_INIT:\r
case IB_PNP_PORT_ARMED:\r
+ status = IB_SUCCESS;\r
+ break;\r
+\r
case IB_PNP_PORT_DOWN:\r
- /* Leave multicast groups. */\r
CL_ASSERT( p_pnp_rec->context );\r
\r
cl_obj_lock( &p_adapter->obj );\r
cl_obj_unlock( &p_adapter->obj );\r
status = IB_SUCCESS;\r
\r
- switch( old_state )\r
+ if( !p_adapter->registering /*&& old_state == IB_PNP_PORT_ACTIVE*/ )\r
{\r
- case IB_PNP_PORT_ACTIVE:\r
NdisMIndicateStatus( p_adapter->h_adapter,\r
NDIS_STATUS_MEDIA_DISCONNECT, NULL, 0 );\r
NdisMIndicateStatusComplete( p_adapter->h_adapter );\r
IPOIB_TRACE( IPOIB_DBG_INFO, ("Link DOWN!\n") );\r
\r
ipoib_port_down( p_adapter->p_port );\r
- break;\r
-\r
- case IB_PNP_PORT_ADD:\r
- /* If we were initializing, we might have pended some OIDs. */\r
- ipoib_resume_oids( p_adapter );\r
- NdisMIndicateStatus( p_adapter->h_adapter,\r
- NDIS_STATUS_MEDIA_DISCONNECT, NULL, 0 );\r
- NdisMIndicateStatusComplete( p_adapter->h_adapter );\r
- break;\r
-\r
- default:\r
- break;\r
}\r
break;\r
\r
case IB_PNP_REG_COMPLETE:\r
- if( p_adapter->hung )\r
+ if( p_adapter->registering )\r
{\r
- p_adapter->hung = FALSE;\r
+ p_adapter->registering = FALSE;\r
+ cl_obj_lock( &p_adapter->obj );\r
+ old_state = p_adapter->state;\r
+ cl_obj_unlock( &p_adapter->obj );\r
+\r
+ if( old_state == IB_PNP_PORT_DOWN )\r
+ {\r
+ /* If we were initializing, we might have pended some OIDs. */\r
+ ipoib_resume_oids( p_adapter );\r
+ NdisMIndicateStatus( p_adapter->h_adapter,\r
+ NDIS_STATUS_MEDIA_DISCONNECT, NULL, 0 );\r
+ NdisMIndicateStatusComplete( p_adapter->h_adapter );\r
+ }\r
+ }\r
+\r
+ if( p_adapter->reset && p_adapter->state != IB_PNP_PORT_ACTIVE )\r
+ {\r
+ p_adapter->reset = FALSE;\r
NdisMResetComplete(\r
p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
}\r
\r
IPOIB_ENTER( IPOIB_DBG_INIT );\r
\r
+ p_adapter->hung = FALSE;\r
+ p_adapter->reset = TRUE;\r
+\r
if( p_adapter->h_pnp )\r
{\r
status = p_adapter->p_ifc->dereg_pnp(\r
if( p_port )\r
ipoib_port_destroy( p_port );\r
\r
- /* Complete any pending OIDs. */\r
- ipoib_resume_oids( p_adapter );\r
- ipoib_dereg_addrs( p_adapter );\r
-\r
if( state != IB_PNP_PORT_REMOVE )\r
{\r
status = __ipoib_pnp_reg( p_adapter, IB_PNP_FLAG_REG_COMPLETE );\r
if( status != IB_SUCCESS )\r
{\r
- p_adapter->hung = FALSE;\r
+ p_adapter->reset = FALSE;\r
IPOIB_TRACE( IPOIB_DBG_ERROR,\r
("__ipoib_pnp_reg returned %s\n",\r
p_adapter->p_ifc->get_err_str( status )) );\r
}\r
else\r
{\r
- p_adapter->hung = FALSE;\r
+ p_adapter->reset = FALSE;\r
NdisMResetComplete(\r
p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
status = IB_SUCCESS;\r
NdisMIndicateStatusComplete( p_adapter->h_adapter );\r
}\r
\r
+ if( p_adapter->reset )\r
+ {\r
+ p_adapter->reset = FALSE;\r
+ NdisMResetComplete(\r
+ p_adapter->h_adapter, NDIS_STATUS_SUCCESS, TRUE );\r
+ }\r
+\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
}\r
\r