}\r
\r
\r
+ib_api_status_t\r
+ipoib_start_adapter(\r
+ IN ipoib_adapter_t* const p_adapter )\r
+{\r
+ ib_api_status_t status;\r
+\r
+ IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+ status = __ipoib_pnp_reg( p_adapter, IB_PNP_FLAG_REG_SYNC );\r
+\r
+ IPOIB_EXIT( IPOIB_DBG_INIT );\r
+ return status;\r
+}\r
+\r
+\r
void\r
ipoib_destroy_adapter(\r
IN ipoib_adapter_t* const p_adapter )\r
return status;\r
}\r
\r
- status = __ipoib_pnp_reg( p_adapter, IB_PNP_FLAG_REG_SYNC );\r
-\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
return status;\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
* If we had a pending OID request for OID_GEN_LINK_SPEED,\r
* complete it now.\r
*/\r
- if( old_state == IB_PNP_PORT_ADD ||\r
- old_state == IB_PNP_PORT_REMOVE )\r
+ switch( old_state )\r
{\r
+ case IB_PNP_PORT_ADD:\r
+ ipoib_reg_addrs( p_adapter );\r
+ /* Fall through. */\r
+\r
+ case IB_PNP_PORT_REMOVE:\r
ipoib_resume_oids( p_adapter );\r
- }\r
- else\r
- {\r
+ break;\r
+\r
+ default:\r
/* Join all programmed multicast groups. */\r
for( i = 0; i < p_adapter->mcast_array_size; i++ )\r
{\r
\r
*p_selected_medium_index = medium_index;\r
\r
-\r
/* Create the adapter adapter */\r
ib_status = ipoib_create_adapter( wrapper_config_context, h_adapter, &p_adapter );\r
if( ib_status != IB_SUCCESS )\r
}\r
#endif\r
\r
+ /* Create the adapter adapter */\r
+ ib_status = ipoib_start_adapter( p_adapter );\r
+ if( ib_status != IB_SUCCESS )\r
+ {\r
+ ipoib_destroy_adapter( p_adapter );\r
+ IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR,\r
+ ("ipoib_start_adapter returned status %d.\n", ib_status ) );\r
+ return NDIS_STATUS_FAILURE;\r
+ }\r
+\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
return status;\r
}\r
p_eth = &p_desc->p_buf->eth.pkt;\r
#endif /*IPOIB_INLINE_RECV */\r
\r
+ /* Don't report loopback traffic - we requested SW loopback. */\r
+ if( !cl_memcmp( &p_port->p_adapter->mac, &p_eth->hdr.src,\r
+ sizeof(p_port->p_adapter->mac) ) )\r
+ {\r
+ /*\r
+ * "This is not the packet you're looking for" - don't update\r
+ * receive statistics, the packet never happened.\r
+ */\r
+ cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
+ /* Dereference the port object on behalf of the failed receive. */\r
+ cl_obj_deref( &p_port->obj );\r
+ continue;\r
+ }\r
+\r
switch( p_ipoib->hdr.type )\r
{\r
case ETH_PROT_TYPE_IP:\r
\r
IPOIB_ENTER( IPOIB_DBG_RECV );\r
\r
+ UNUSED_PARAM( p_port );\r
+\r
/* Create the ethernet header. */\r
status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );\r
if( status != IB_SUCCESS )\r
IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("Invalid DHCP op code.\n") );\r
return IB_INVALID_SETTING;\r
}\r
- /* find a better way to check for echo packets ? */\r
- if ( p_port->p_adapter->mac.addr[0] == p_eth->hdr.src.addr[0] &&\r
- p_port->p_adapter->mac.addr[1] == p_eth->hdr.src.addr[1] &&\r
- p_port->p_adapter->mac.addr[2] == p_eth->hdr.src.addr[2] &&\r
- p_port->p_adapter->mac.addr[3] == p_eth->hdr.src.addr[3] &&\r
- p_port->p_adapter->mac.addr[4] == p_eth->hdr.src.addr[4] &&\r
- p_port->p_adapter->mac.addr[5] == p_eth->hdr.src.addr[5] )\r
- {\r
- IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("Local echo dhcp msg.\n") );\r
- return IB_INVALID_PARAMETER;\r
- }\r
\r
/*\r
* Find the client identifier option, making sure to skip\r
\r
IPOIB_ENTER( IPOIB_DBG_SEND );\r
\r
+ cl_spinlock_acquire( &p_port->send_lock );\r
for( i = 0; i < num_packets; i++ )\r
{\r
desc.p_pkt = p_packet_array[i];\r
continue;\r
}\r
\r
- cl_spinlock_acquire( &p_port->send_lock );\r
cl_perf_start( SendMgrQueue );\r
status = __send_mgr_queue( p_port, p_eth_hdr, &desc.p_endpt );\r
cl_perf_stop( &p_port->p_adapter->perf, SendMgrQueue );\r
IPOIB_LIST_ITEM_FROM_PACKET( p_packet_array[i++] ) );\r
}\r
cl_perf_stop( &p_port->p_adapter->perf, QueuePacket );\r
- cl_spinlock_release( &p_port->send_lock );\r
- return;\r
+ break;\r
}\r
- cl_spinlock_release( &p_port->send_lock );\r
if( status != NDIS_STATUS_SUCCESS )\r
{\r
ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );\r
continue;\r
}\r
\r
- /* No lock needed to build the work request. */\r
cl_perf_start( BuildSendDesc );\r
status = __build_send_desc( p_port, p_eth_hdr, p_buf, buf_len, &desc );\r
cl_perf_stop( &p_port->p_adapter->perf, BuildSendDesc );\r
\r
cl_atomic_inc( &p_port->send_mgr.depth );\r
}\r
+ cl_spinlock_release( &p_port->send_lock );\r
\r
IPOIB_EXIT( IPOIB_DBG_SEND );\r
}\r