IN ipoib_port_t* const p_port,\r
IN const net16_t lid );\r
\r
-static inline void\r
+static inline ib_api_status_t\r
__endpt_mgr_insert_locked(\r
IN ipoib_port_t* const p_port,\r
IN const mac_addr_t mac,\r
IN ipoib_endpt_t* const p_endpt );\r
\r
-static inline void\r
+static inline ib_api_status_t\r
__endpt_mgr_insert(\r
IN ipoib_port_t* const p_port,\r
IN const mac_addr_t mac,\r
}\r
\r
\r
+inline void ipoib_port_ref( ipoib_port_t * p_port, int type )\r
+{\r
+ cl_obj_ref( &p_port->obj );\r
+#if DBG\r
+ cl_atomic_inc( &p_port->ref[type % ref_mask] );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
+ ("ref type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );\r
+#endif\r
+}\r
+\r
+\r
+inline void ipoib_port_deref(ipoib_port_t * p_port, int type)\r
+{\r
+ cl_obj_deref( &p_port->obj );\r
+\r
+#if DBG\r
+ cl_atomic_dec( &p_port->ref[type % ref_mask] );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
+ ("deref type %d ref_cnt %d\n", type, p_port->obj.ref_cnt) );\r
+#endif\r
+}\r
+\r
+\r
/******************************************************************************\r
*\r
* Implementation\r
/* We only ever destroy from the PnP callback thread. */\r
cl_status = cl_obj_init( &p_port->obj, CL_DESTROY_SYNC,\r
__port_destroying, __port_cleanup, __port_free );\r
+\r
+#if DBG\r
+ cl_atomic_inc( &p_port->ref[ref_init] );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
+ ("ref type %d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );\r
+#endif\r
+\r
if( cl_status != CL_SUCCESS )\r
{\r
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
return IB_ERROR;\r
}\r
\r
- cl_obj_insert_rel( &p_port->rel, &p_adapter->obj, &p_port->obj );\r
+ cl_status = cl_obj_insert_rel( &p_port->rel, &p_adapter->obj, &p_port->obj );\r
+ if( cl_status != CL_SUCCESS )\r
+ {\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("cl_obj_insert_rel returned %s\n", cl_status_text[cl_status]) );\r
+ cl_obj_destroy( &p_port->obj );\r
+ return IB_ERROR;\r
+ }\r
+\r
+#if DBG\r
+ cl_atomic_inc( &p_port->ref[ref_init] );\r
+ IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_OBJ,\r
+ ("ref type %d ref_cnt %d\n", ref_init, p_port->obj.ref_cnt) );\r
+#endif\r
\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
return IB_SUCCESS;\r
\r
__endpt_mgr_remove_all( p_port );\r
\r
+ ipoib_port_resume( p_port );\r
+\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
}\r
\r
/* Reference the port object for the send. */\r
if( p_desc )\r
{\r
- cl_obj_ref( &p_port->obj );\r
+ ipoib_port_ref( p_port, ref_get_recv );\r
CL_ASSERT( p_desc->wr.wr_id == (uintn_t)p_desc );\r
#if IPOIB_INLINE_RECV\r
CL_ASSERT( p_desc->local_ds[0].vaddr ==\r
/*\r
* Dereference the port object since the receive is no longer outstanding.\r
*/\r
- cl_obj_deref( &p_port->obj );\r
-\r
+ ipoib_port_deref( p_port, ref_get_recv );\r
IPOIB_EXIT( IPOIB_DBG_RECV );\r
}\r
\r
("Port in invalid state. Not reposting.\n") );\r
return 0;\r
}\r
- cl_obj_ref( &p_port->obj );\r
+ ipoib_port_ref( p_port, ref_repost );\r
cl_obj_unlock( &p_port->obj );\r
\r
while( p_port->recv_mgr.depth < p_port->p_adapter->params.rq_depth )\r
}\r
}\r
\r
- cl_obj_deref( &p_port->obj );\r
-\r
+ ipoib_port_deref( p_port, ref_repost );\r
IPOIB_EXIT( IPOIB_DBG_RECV );\r
return p_port->p_adapter->params.rq_low_watermark - p_port->recv_mgr.depth;\r
}\r
cl_qlist_init( &done_list );\r
cl_qlist_init( &bad_list );\r
\r
- cl_obj_ref( &p_port->obj );\r
-\r
+ ipoib_port_ref( p_port, ref_recv_cb );\r
for( i = 0; i < MAX_RECV_WC; i++ )\r
wc[i].p_next = &wc[i + 1];\r
wc[MAX_RECV_WC - 1].p_next = NULL;\r
cl_perf_stop( &p_port->p_adapter->perf, RearmRecv );\r
CL_ASSERT( status == IB_SUCCESS );\r
\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_recv_cb );\r
\r
cl_perf_stop( &p_port->p_adapter->perf, RecvCb );\r
\r
if( !*pp_src )\r
{\r
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
- ("ipoib_endpt_create returned %s\n",\r
- p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+ ("ipoib_endpt_create failed\n") );\r
return;\r
}\r
cl_perf_start( EndptInsert );\r
cl_obj_lock( &p_port->obj );\r
- __endpt_mgr_insert( p_port, mac, *pp_src );\r
+ status = __endpt_mgr_insert( p_port, mac, *pp_src );\r
+ if( status != IB_SUCCESS )\r
+ {\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("__endpt_mgr_insert returned %s\n",\r
+ p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+ return;\r
+ }\r
cl_obj_unlock( &p_port->obj );\r
cl_perf_stop( &p_port->p_adapter->perf, EndptInsert );\r
}\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
+ ipoib_port_deref( p_port, ref_failed_recv_wc );\r
continue;\r
}\r
\r
("Received ETH packet < min size\n") );\r
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );\r
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_recv_inv_len );\r
continue;\r
}\r
\r
*/\r
cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
/* Dereference the port object on behalf of the failed recv. */\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_recv_loopback );\r
continue;\r
}\r
}\r
ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0 );\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
+ ipoib_port_deref( p_port, ref_recv_filter );\r
}\r
else\r
{\r
*/\r
*pp_src = ipoib_endpt_create( &p_ib_arp->src_hw.gid,\r
0, (p_ib_arp->src_hw.flags_qpn & CL_HTON32(0x00FFFFFF)) );\r
+\r
if( !*pp_src )\r
{\r
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
- ("ipoib_endpt_create returned %s\n",\r
- p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+ ("ipoib_endpt_create failed\n") );\r
return status;\r
}\r
\r
cl_obj_lock( &p_port->obj );\r
- __endpt_mgr_insert( p_port, mac, *pp_src );\r
+ status = __endpt_mgr_insert( p_port, mac, *pp_src );\r
+ if( status != IB_SUCCESS )\r
+ {\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("__endpt_mgr_insert return %s \n",\r
+ p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+ return status;\r
+ }\r
+\r
cl_obj_unlock( &p_port->obj );\r
}\r
\r
\r
p_port = (ipoib_port_t*)cq_context;\r
\r
- cl_obj_ref( &p_port->obj );\r
+ ipoib_port_ref( p_port, ref_send_cb );\r
\r
for( i = 0; i < MAX_SEND_WC; i++ )\r
wc[i].p_next = &wc[i + 1];\r
ipoib_port_resume( p_port );\r
cl_perf_stop( &p_port->p_adapter->perf, PortResume );\r
\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_send_cb );\r
\r
cl_perf_stop( &p_port->p_adapter->perf, SendCb );\r
cl_perf_update_ctr( &p_port->p_adapter->perf, SendCompBundle );\r
}\r
\r
\r
-inline void\r
+inline ib_api_status_t\r
__endpt_mgr_insert_locked(\r
IN ipoib_port_t* const p_port,\r
IN const mac_addr_t mac,\r
IN ipoib_endpt_t* const p_endpt )\r
{\r
+ ib_api_status_t status;\r
+\r
IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
\r
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
}\r
/* __endpt_mgr_insert expects *one* reference to be held when being called. */\r
cl_atomic_inc( &p_port->endpt_rdr );\r
- __endpt_mgr_insert( p_port, mac, p_endpt );\r
+ status= __endpt_mgr_insert( p_port, mac, p_endpt );\r
cl_atomic_dec( &p_port->endpt_rdr );\r
cl_obj_unlock( &p_port->obj );\r
\r
- IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+ return status;\r
}\r
\r
\r
-void\r
+inline ib_api_status_t\r
__endpt_mgr_insert(\r
IN ipoib_port_t* const p_port,\r
IN const mac_addr_t mac,\r
IN ipoib_endpt_t* const p_endpt )\r
{\r
uint64_t key;\r
+ cl_status_t cl_status;\r
cl_map_item_t *p_qitem;\r
cl_fmap_item_t *p_fitem;\r
\r
;\r
\r
/* Link the endpoint to the port. */\r
- cl_obj_insert_rel_parent_locked(\r
+ cl_status = cl_obj_insert_rel_parent_locked(\r
&p_endpt->rel, &p_port->obj, &p_endpt->obj );\r
\r
+ if( cl_status != CL_SUCCESS )\r
+ {\r
+ cl_obj_destroy( &p_endpt->obj );\r
+ return IB_INVALID_STATE;\r
+ }\r
+\r
+#if DBG\r
+ cl_atomic_inc( &p_port->ref[ref_endpt_track] );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
+ ("ref type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt) );\r
+#endif\r
+\r
p_endpt->mac = mac;\r
key = 0;\r
cl_memcpy( &key, &mac, sizeof(mac_addr_t) );\r
}\r
\r
IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
+ return IB_SUCCESS;\r
}\r
\r
\r
\r
/* Add the broadcast endpoint to the endpoint map. */\r
cl_memset( &bcast_mac, 0xFF, sizeof(bcast_mac) );\r
- __endpt_mgr_insert_locked( p_port, bcast_mac, p_endpt );\r
+ status = __endpt_mgr_insert_locked( p_port, bcast_mac, p_endpt );\r
\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
- return IB_SUCCESS;\r
+ return status;\r
}\r
\r
\r
\r
cl_obj_unlock( &p_port->obj );\r
cl_obj_destroy( &p_endpt->obj );\r
+#if DBG\r
+ cl_atomic_dec( &p_port->ref[ref_endpt_track] );\r
+ IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
+ ("ref type %d ref_cnt %d\n", ref_endpt_track, p_port->obj.ref_cnt) );\r
+#endif\r
+\r
}\r
else\r
{\r
query.pfn_query_cb = __port_info_cb;\r
\r
/* reference the object for the multicast query. */\r
- cl_obj_ref( &p_port->obj );\r
+ ipoib_port_ref( p_port, ref_port_up );\r
\r
status = p_port->p_adapter->p_ifc->query(\r
p_port->p_adapter->h_al, &query, &p_port->ib_mgr.h_query );\r
{\r
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
ipoib_set_inactive( p_port->p_adapter );\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_port_up );\r
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
("ib_query returned %s\n", \r
p_port->p_adapter->p_ifc->get_err_str( status )) );\r
\r
/* __endpt_mgr_insert expects *one* reference to be held. */\r
cl_atomic_inc( &p_port->endpt_rdr );\r
- __endpt_mgr_insert( p_port, p_port->p_adapter->params.conf_mac, p_endpt );\r
+ status = __endpt_mgr_insert( p_port, p_port->p_adapter->params.conf_mac, p_endpt );\r
cl_atomic_dec( &p_port->endpt_rdr );\r
+ if( status != IB_SUCCESS )\r
+ {\r
+ IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("__endpt_mgr_insert for local endpoint returned %s\n",\r
+ p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+ return status;\r
+ }\r
\r
p_port->p_local_endpt = p_endpt;\r
\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
- return IB_SUCCESS;\r
+ return status;\r
}\r
\r
\r
p_port->p_adapter->p_ifc->put_mad( p_query_rec->p_result_mad );\r
\r
/* Release the reference taken when issuing the port info query. */\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_port_info_cb );\r
\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
}\r
query.pfn_query_cb = __bcast_get_cb;\r
\r
/* reference the object for the multicast query. */\r
- cl_obj_ref( &p_port->obj );\r
+ ipoib_port_ref( p_port, ref_get_bcast );\r
\r
status = p_port->p_adapter->p_ifc->query(\r
p_port->p_adapter->h_al, &query, &p_port->ib_mgr.h_query );\r
if( status != IB_SUCCESS )\r
{\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_get_bcast );\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
("ib_query returned %s\n", \r
p_port->p_adapter->p_ifc->get_err_str( status )) );\r
p_port->p_adapter->p_ifc->put_mad( p_query_rec->p_result_mad );\r
\r
/* Release the reference taken when issuing the member record query. */\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_bcast_get_cb );\r
\r
IPOIB_EXIT( IPOIB_DBG_MCAST );\r
}\r
}\r
\r
/* reference the object for the multicast join request. */\r
- cl_obj_ref( &p_port->obj );\r
+ ipoib_port_ref( p_port, ref_join_bcast );\r
\r
status = p_port->p_adapter->p_ifc->join_mcast(\r
p_port->ib_mgr.h_qp, &mcast_req );\r
if( status != IB_SUCCESS )\r
{\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_bcast_join_failed );\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
("ib_join_mcast returned %s\n", \r
p_port->p_adapter->p_ifc->get_err_str( status )) );\r
mcast_req.pkey_index = 0;\r
\r
/* reference the object for the multicast join request. */\r
- cl_obj_ref( &p_port->obj );\r
+ ipoib_port_ref( p_port, ref_join_bcast );\r
\r
status = p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp, &mcast_req );\r
if( status != IB_SUCCESS )\r
{\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_bcast_create_failed );\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
("ib_join_mcast returned %s\n", \r
p_port->p_adapter->p_ifc->get_err_str( status )) );\r
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, NULL );\r
\r
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_bcast_inv_state );\r
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
("Invalid state - Aborting.\n") );\r
return;\r
ipoib_set_inactive( p_port->p_adapter );\r
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
}\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_bcast_req_failed );\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
return;\r
}\r
/* Flag the adapter as hung. */\r
p_port->p_adapter->hung = TRUE;\r
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_bcast_error );\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
return;\r
}\r
ipoib_set_active( p_port->p_adapter );\r
\r
KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_join_bcast );\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
}\r
\r
return IB_INSUFFICIENT_MEMORY;\r
}\r
\r
- __endpt_mgr_insert_locked( p_port, mac, p_endpt );\r
+ status = __endpt_mgr_insert_locked( p_port, mac, p_endpt );\r
+ if( status != IB_SUCCESS )\r
+ {\r
+ IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("__endpt_mgr_insert_locked returned %s\n", \r
+ p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+ return status;\r
+ }\r
\r
/* reference the object for the multicast join request. */\r
- cl_obj_ref( &p_port->obj );\r
+ ipoib_port_ref( p_port, ref_join_mcast );\r
\r
status = p_port->p_adapter->p_ifc->join_mcast( p_port->ib_mgr.h_qp, &mcast_req );\r
if( status != IB_SUCCESS )\r
{\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_mcast_join_failed );\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
("ib_join_mcast returned %s\n", \r
p_port->p_adapter->p_ifc->get_err_str( status )) );\r
if( p_mcast_rec->status == IB_SUCCESS )\r
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, NULL );\r
\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_mcast_inv_state );\r
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
("Invalid state - Aborting.\n") );\r
return;\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
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_mcast_req_failed );\r
IPOIB_EXIT( IPOIB_DBG_MCAST );\r
return;\r
}\r
IPOIB_PRINT(TRACE_LEVEL_WARNING, IPOIB_DBG_ERROR,\r
("Failed to find endpoint for update.\n") );\r
p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, NULL );\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_mcast_no_endpt );\r
IPOIB_EXIT( IPOIB_DBG_MCAST );\r
return;\r
}\r
p_port->p_adapter->p_ifc->get_err_str( status )) );\r
/* Flag the adapter as hung. */\r
p_port->p_adapter->hung = TRUE;\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_mcast_av_failed );\r
IPOIB_EXIT( IPOIB_DBG_MCAST );\r
return;\r
}\r
/* Try to send all pending sends. */\r
ipoib_port_resume( p_port );\r
\r
- cl_obj_deref( &p_port->obj );\r
+ ipoib_port_deref( p_port, ref_join_mcast );\r
\r
IPOIB_EXIT( IPOIB_DBG_MCAST );\r
}\r