IN ib_reg_svc_rec_t *p_reg_svc_rec );\r
\r
static void\r
-__ipoib_ats_unreg_cb(\r
+__ipoib_ats_dereg_cb(\r
IN void *context );\r
\r
static void\r
p_addr_item->address.as_bytes[2],\r
p_addr_item->address.as_bytes[3]));\r
\r
- if( p_addr_item->h_reg_svc )\r
+ if( p_addr_item->p_reg )\r
{\r
- p_adapter->p_ifc->dereg_svc( p_addr_item->h_reg_svc, NULL );\r
- p_addr_item->h_reg_svc = NULL;\r
+ if( p_addr_item->p_reg->h_reg_svc )\r
+ {\r
+ p_adapter->p_ifc->dereg_svc(\r
+ p_addr_item->p_reg->h_reg_svc, __ipoib_ats_dereg_cb );\r
+ }\r
+ else\r
+ {\r
+ cl_free( p_addr_item->p_reg );\r
+ }\r
+ p_addr_item->p_reg = NULL;\r
}\r
p_addr_item->address.as_ulong = 0;\r
}\r
* Copy the address information, but don't register yet - the port\r
* could be down.\r
*/\r
- p_addr_item->p_adapter = p_adapter;\r
- if( p_addr_item->h_reg_svc )\r
+ if( p_addr_item->p_reg )\r
{\r
/* If in use by some other address, deregister. */\r
- p_adapter->p_ifc->dereg_svc( p_addr_item->h_reg_svc, NULL );\r
- p_addr_item->h_reg_svc = NULL;\r
+ if( p_addr_item->p_reg->h_reg_svc )\r
+ {\r
+ p_adapter->p_ifc->dereg_svc(\r
+ p_addr_item->p_reg->h_reg_svc, __ipoib_ats_dereg_cb );\r
+ }\r
+ else\r
+ {\r
+ cl_free( p_addr_item->p_reg );\r
+ }\r
+ p_addr_item->p_reg = NULL;\r
}\r
memcpy ((void *)&p_addr_item->address.as_ulong, (const void *)&p_ip_addr->in_addr, sizeof(ULONG) );\r
IPOIB_TRACE( IPOIB_DBG_OID | IPOIB_DBG_INFO,\r
cl_vector_get_ptr( &p_adapter->ip_vector,\r
cl_vector_get_size( &p_adapter->ip_vector ) - 1 );\r
\r
- if( p_addr_item->h_reg_svc )\r
+ if( p_addr_item->p_reg )\r
{\r
- p_adapter->p_ifc->dereg_svc( p_addr_item->h_reg_svc, NULL );\r
- p_addr_item->h_reg_svc = NULL;\r
+ if( p_addr_item->p_reg->h_reg_svc )\r
+ {\r
+ p_adapter->p_ifc->dereg_svc(\r
+ p_addr_item->p_reg->h_reg_svc, __ipoib_ats_dereg_cb );\r
+ }\r
+ else\r
+ {\r
+ cl_free( p_addr_item->p_reg );\r
+ }\r
+ p_addr_item->p_reg = NULL;\r
p_addr_item->address.as_ulong = 0;\r
}\r
\r
ib_service.port_guid = p_adapter->guids.port_guid;\r
ib_service.timeout_ms = DEFAULT_SA_TIMEOUT;\r
ib_service.retry_cnt = DEFAULT_SA_RETRIES;\r
- ib_service.svc_context = p_adapter;\r
\r
/* Can't set IB_FLAGS_SYNC here because I can't wait at dispatch */\r
ib_service.flags = 0;\r
p_addr_item = (net_address_item_t*)\r
cl_vector_get_ptr( &p_adapter->ip_vector, idx );\r
\r
- if( p_addr_item->h_reg_svc )\r
+ if( p_addr_item->p_reg )\r
continue;\r
\r
+ p_addr_item->p_reg = cl_zalloc( sizeof(ats_reg_t) );\r
+ if( !p_addr_item->p_reg )\r
+ break;\r
+\r
+ p_addr_item->p_reg->p_adapter = p_adapter;\r
+\r
+ ib_service.svc_context = p_addr_item->p_reg;\r
+\r
ib_service.svc_rec.service_id =\r
ATS_SERVICE_ID & CL_HTON64(0xFFFFFFFFFFFFFF00);\r
/* ATS service IDs start at 0x10000CE100415453 */\r
p_addr_item->address.as_bytes, IPV4_ADDR_SIZE );\r
\r
ib_status = p_adapter->p_ifc->reg_svc(\r
- p_adapter->h_al, &ib_service, &p_addr_item->h_reg_svc );\r
+ p_adapter->h_al, &ib_service, &p_addr_item->p_reg->h_reg_svc );\r
if( ib_status != IB_SUCCESS )\r
{\r
if( ib_status == IB_INVALID_GUID )\r
p_adapter->p_ifc->get_err_str( ib_status )) );\r
p_adapter->hung = TRUE;\r
}\r
+ cl_free( p_addr_item->p_reg );\r
+ p_addr_item->p_reg = NULL;\r
}\r
}\r
\r
p_addr_item = (net_address_item_t*)\r
cl_vector_get_ptr( &p_adapter->ip_vector, idx );\r
\r
- if( !p_addr_item->h_reg_svc )\r
+ if( !p_addr_item->p_reg )\r
continue;\r
\r
- p_adapter->p_ifc->dereg_svc(\r
- p_addr_item->h_reg_svc, NULL );\r
- p_addr_item->h_reg_svc = NULL;\r
+ if( p_addr_item->p_reg->h_reg_svc )\r
+ {\r
+ p_adapter->p_ifc->dereg_svc(\r
+ p_addr_item->p_reg->h_reg_svc, __ipoib_ats_dereg_cb );\r
+ }\r
+ else\r
+ {\r
+ cl_free( p_addr_item->p_reg );\r
+ }\r
+ p_addr_item->p_reg = NULL;\r
}\r
\r
IPOIB_EXIT( IPOIB_DBG_OID );\r
__ipoib_ats_reg_cb(\r
IN ib_reg_svc_rec_t *p_reg_svc_rec )\r
{\r
- ipoib_adapter_t * p_adapter;\r
+ ats_reg_t *p_reg;\r
uint8_t port_num;\r
\r
IPOIB_ENTER( IPOIB_DBG_OID );\r
CL_ASSERT( p_reg_svc_rec );\r
CL_ASSERT( p_reg_svc_rec->svc_context );\r
\r
- p_adapter = (ipoib_adapter_t* __ptr64)p_reg_svc_rec->svc_context;\r
- port_num = IPOIB_ADAPTER_GET_PORT_NUM( p_adapter );\r
+ p_reg = (ats_reg_t* __ptr64)p_reg_svc_rec->svc_context;\r
+ port_num = IPOIB_ADAPTER_GET_PORT_NUM( p_reg->p_adapter );\r
+\r
+ cl_obj_lock( &p_reg->p_adapter->obj );\r
\r
if( p_reg_svc_rec->req_status == IB_SUCCESS &&\r
!p_reg_svc_rec->resp_status )\r
p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+1],\r
p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+2],\r
p_reg_svc_rec->svc_rec.service_data8[ATS_IPV4_OFFSET+3],\r
- p_adapter->p_ifc->get_err_str( p_reg_svc_rec->resp_status )) );\r
- p_adapter->hung = TRUE;\r
+ p_reg->p_adapter->p_ifc->get_err_str( p_reg_svc_rec->resp_status )) );\r
+ p_reg->p_adapter->hung = TRUE;\r
+ p_reg->h_reg_svc = NULL;\r
}\r
\r
+ cl_obj_unlock( &p_reg->p_adapter->obj );\r
+\r
IPOIB_EXIT( IPOIB_DBG_OID );\r
}\r
+\r
+\r
+static void\r
+__ipoib_ats_dereg_cb(\r
+ IN void *context )\r
+{\r
+ cl_free( context );\r
+}\r