}\r
\r
\r
+/*\r
+ * If something goes wrong after the port goes active, e.g.\r
+ * - PortInfo query failure\r
+ * - MC Join timeout\r
+ * - etc\r
+ * Mark the port state as down, resume any pended OIDS, etc.\r
+ */\r
+void\r
+ipoib_set_inactive(\r
+ IN ipoib_adapter_t* const p_adapter )\r
+{\r
+ ib_pnp_event_t old_state;\r
+\r
+ IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+ cl_obj_lock( &p_adapter->obj );\r
+ old_state = p_adapter->state;\r
+ if( old_state != IB_PNP_PORT_REMOVE )\r
+ p_adapter->state = IB_PNP_PORT_DOWN;\r
+ cl_obj_unlock( &p_adapter->obj );\r
+\r
+ /*\r
+ * If we had a pending OID request for OID_GEN_LINK_SPEED,\r
+ * complete it now.\r
+ */\r
+ if( old_state == IB_PNP_PORT_INIT )\r
+ {\r
+ NdisMIndicateStatus( p_adapter->h_adapter,\r
+ NDIS_STATUS_MEDIA_DISCONNECT, NULL, 0 );\r
+ NdisMIndicateStatusComplete( p_adapter->h_adapter );\r
+\r
+ ipoib_resume_oids( p_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
+\r
NDIS_STATUS\r
ipoib_get_recv_stat(\r
IN ipoib_adapter_t* const p_adapter,\r
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
EVENT_IPOIB_PORT_INFO_TIMEOUT, 0 );\r
IPOIB_TRACE( IPOIB_DBG_INFO, ("Port info query timed out.\n") );\r
+ ipoib_set_inactive( p_port->p_adapter );\r
break;\r
\r
case IB_REMOTE_ERROR:\r
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
EVENT_IPOIB_PORT_INFO_REJECT, 0 );\r
IPOIB_TRACE( IPOIB_DBG_INFO, ("Port info query rejected by SA.\n") );\r
+ ipoib_set_inactive( p_port->p_adapter );\r
break;\r
\r
default:\r
EVENT_IPOIB_QUERY_PORT_INFO, 1, p_query_rec->status );\r
/* Hopefully we'll get an SM change event that will restart things. */\r
IPOIB_TRACE( IPOIB_DBG_INFO, ("Port info query failed.\n") );\r
+ ipoib_set_inactive( p_port->p_adapter );\r
}\r
\r
/* Return the response MAD to AL. */\r
default:\r
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status );\r
- /* Flag the adapter as hung. */\r
- p_port->p_adapter->hung = TRUE;\r
+ ipoib_set_inactive( p_port->p_adapter );\r
}\r
\r
/* Return the response MAD to AL. */\r
{\r
NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
EVENT_IPOIB_BCAST_JOIN, 1, p_mcast_rec->status );\r
- /* Flag the adapter as hung. */\r
- p_port->p_adapter->hung = TRUE;\r
+ ipoib_set_inactive( p_port->p_adapter );\r
}\r
\r
cl_obj_deref( &p_port->obj );\r
IPOIB_TRACE( IPOIB_DBG_ERROR,\r
("Multicast join request failed with status %s.\n",\r
p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );\r
- /* Flag the adapter as hung. */\r
- p_port->p_adapter->hung = TRUE;\r
+ ipoib_set_inactive( p_port->p_adapter );\r
cl_obj_deref( &p_port->obj );\r
IPOIB_EXIT( IPOIB_DBG_MCAST );\r
return;\r