\r
ib_api_status_t\r
endpt_cm_create_qp( \r
- IN ipoib_endpt_t* const p_endpt )\r
+ IN ipoib_endpt_t* const p_endpt,\r
+ IN ib_qp_handle_t* const p_h_qp )\r
+\r
{\r
ipoib_port_t *p_port;\r
ib_qp_create_t create_qp;\r
ib_cq_create_t create_cq;\r
- ib_qp_attr_t qp_attr;\r
ib_api_status_t ib_status;\r
- ib_qp_mod_t qp_mod;\r
ib_qp_handle_t h_qp = NULL;\r
\r
IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
\r
- p_port = ipoib_endpt_parent( p_endpt );\r
- \r
- cl_memclr( &create_cq, sizeof( ib_cq_create_t ) );\r
+ if( !p_h_qp )\r
+ return IB_ERROR;\r
\r
- create_cq.size = p_port->p_adapter->params.sq_depth;\r
- create_cq.pfn_comp_cb = __endpt_cm_send_cb;\r
+ p_port = ipoib_endpt_parent( p_endpt );\r
\r
- ib_status = p_port->p_adapter->p_ifc->create_cq( p_port->ib_mgr.h_ca,\r
- &create_cq, \r
- p_endpt, \r
- __endpt_async_event_cb, \r
- &p_endpt->conn.h_send_cq );\r
- if( ib_status != IB_SUCCESS )\r
+ if( !p_endpt->conn.h_send_cq )\r
{\r
- IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ENDPT,\r
- ("Create SEND CQ failed status %#x\n", ib_status ) );\r
- \r
- goto err_exit;\r
- }\r
+ cl_memclr( &create_cq, sizeof( ib_cq_create_t ) );\r
\r
- create_cq.size = p_port->p_adapter->params.rq_depth;\r
- create_cq.pfn_comp_cb = __endpt_cm_recv_cb;\r
+ create_cq.size = p_port->p_adapter->params.sq_depth;\r
+ create_cq.pfn_comp_cb = __endpt_cm_send_cb;\r
\r
- ib_status = p_port->p_adapter->p_ifc->create_cq( p_port->ib_mgr.h_ca,\r
- &create_cq,\r
- p_endpt,\r
- __endpt_async_event_cb,\r
- &p_endpt->conn.h_recv_cq );\r
- if( ib_status != IB_SUCCESS )\r
+ ib_status = p_port->p_adapter->p_ifc->create_cq( p_port->ib_mgr.h_ca,\r
+ &create_cq, \r
+ p_endpt, \r
+ __endpt_async_event_cb, \r
+ &p_endpt->conn.h_send_cq );\r
+ if( ib_status != IB_SUCCESS )\r
+ {\r
+ IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ENDPT,\r
+ ("Create SEND CQ failed status %#x\n", ib_status ) );\r
+ goto err_exit;\r
+ }\r
+ }\r
+ if( !p_endpt->conn.h_recv_cq )\r
{\r
- IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ENDPT,\r
- ("Create RECV CQ failed status %#x\n", ib_status ) );\r
+ create_cq.size = p_port->p_adapter->params.rq_depth;\r
+ create_cq.pfn_comp_cb = __endpt_cm_recv_cb;\r
+\r
+ ib_status = p_port->p_adapter->p_ifc->create_cq( p_port->ib_mgr.h_ca,\r
+ &create_cq,\r
+ p_endpt,\r
+ __endpt_async_event_cb,\r
+ &p_endpt->conn.h_recv_cq );\r
+ if( ib_status != IB_SUCCESS )\r
+ {\r
+ IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ENDPT,\r
+ ("Create RECV CQ failed status %#x\n", ib_status ) );\r
\r
- p_port->p_adapter->p_ifc->destroy_cq( p_endpt->conn.h_send_cq, NULL );\r
- goto err_exit;\r
+ p_port->p_adapter->p_ifc->destroy_cq( p_endpt->conn.h_send_cq, NULL );\r
+ goto err_exit;\r
+ }\r
}\r
\r
cl_memclr( &create_qp, sizeof( ib_qp_create_t ) );\r
create_qp.qp_type = IB_QPT_RELIABLE_CONN;\r
create_qp.h_srq = p_port->ib_mgr.h_srq;\r
create_qp.sq_depth = p_port->p_adapter->params.sq_depth;\r
- create_qp.rq_depth = 0;\r
create_qp.h_rq_cq = p_endpt->conn.h_recv_cq;\r
create_qp.h_sq_cq = p_endpt->conn.h_send_cq;\r
- create_qp.rq_sge = 0;\r
create_qp.sq_sge = min( MAX_SEND_SGE, p_port->p_ca_attrs->max_sges );\r
create_qp.sq_signaled = TRUE;\r
- \r
- ib_status = \r
- p_port->p_adapter->p_ifc->create_qp( p_port->ib_mgr.h_pd, \r
- &create_qp, \r
- p_endpt,\r
- __endpt_async_event_cb,\r
- &h_qp );\r
- if( ib_status != IB_SUCCESS )\r
- {\r
- IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ENDPT,\r
- ("Create RC QP failed status %#x\n", ib_status ) );\r
- goto err_exit;\r
- }\r
- \r
- cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );\r
\r
- ib_status = \r
- p_port->p_adapter->p_ifc->query_qp( h_qp, &qp_attr );\r
+ ib_status = p_port->p_adapter->p_ifc->create_qp( p_port->ib_mgr.h_pd, \r
+ &create_qp, \r
+ p_endpt,\r
+ __endpt_async_event_cb,\r
+ &h_qp );\r
if( ib_status != IB_SUCCESS )\r
{\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ENDPT,\r
- ("Query RC QP failed status%#x\n", ib_status ) );\r
+ ("Create RC QP failed status %#x\n", ib_status ) );\r
goto err_exit;\r
}\r
- p_endpt->conn.cm_qpn = qp_attr.num;\r
- p_endpt->conn.h_qp = h_qp;\r
+ *p_h_qp = h_qp;\r
return IB_SUCCESS;\r
\r
err_exit:\r
IN ipoib_port_t* const p_port,\r
IN ipoib_endpt_t* const p_endpt )\r
{\r
+ cm_state_t cm_state;\r
IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
\r
+ cm_state = endpt_cm_get_state( p_endpt );\r
+ if( cm_state == IPOIB_CM_DESTROY )\r
+ return;\r
+ if( cm_state == IPOIB_CM_DISCONNECTED )\r
+ {\r
+ cl_obj_destroy( &p_endpt->obj );\r
+ return;\r
+ }\r
NdisInterlockedInsertTailList( &p_port->endpt_mgr.remove_conns, \r
&p_endpt->list_item, &p_port->endpt_mgr.remove_lock );\r
cl_event_signal( &p_port->endpt_mgr.event );\r
cl_hton32( p_port->p_adapter->params.cm_payload_mtu + sizeof(ipoib_hdr_t) );\r
\r
conn_req.h_al = p_port->p_adapter->h_al;\r
- conn_req.h_qp = p_endpt->conn.h_qp;\r
+ conn_req.h_qp = p_endpt->conn.h_send_qp;\r
conn_req.qp_type = IB_QPT_RELIABLE_CONN;\r
\r
conn_req.p_req_pdata = (uint8_t *)&p_endpt->conn.private_data;\r
ipoib_port_t* p_port;\r
cm_private_data_t private_data;\r
ib_rej_status_t rej_status = IB_REJ_INSUFFICIENT_RESP_RES;\r
- cm_state_t cm_state;\r
\r
IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
\r
if( !p_endpt )\r
return;\r
\r
+ if( p_endpt->conn.h_recv_qp )\r
+ return;\r
+\r
/*copy private data and parse */\r
private_data = (*(cm_private_data_t *)p_cm_req->p_req_pdata);\r
\r
goto conn_exit;\r
}\r
\r
- if( ( cm_state = endpt_cm_get_state( p_endpt ) ) != IPOIB_CM_DISCONNECTED )\r
+ ib_status = endpt_cm_create_qp( p_endpt, &p_endpt->conn.h_recv_qp );\r
+ if( ib_status != IB_SUCCESS )\r
{\r
- if( cm_state == IPOIB_CM_CONNECTED )\r
- {\r
- /* if we've got that far most likely we have stale connection. */\r
- endpt_cm_set_state( p_endpt, IPOIB_CM_STALE_CONN );\r
- __conn_reject( p_port, p_cm_req->h_cm_req, IB_REJ_STALE_CONN );\r
- IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
- ("Endpoint [%p] IN STATE %d. DESTROY STALE CONNECTION\n",\r
- p_endpt, cm_state ) );\r
- ipoib_port_remove_endpt( p_port, p_endpt->mac );\r
- return;\r
- }\r
+ IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("Endpt [%p ] CM create QP failed status %#x\n", p_endpt, ib_status ) );\r
\r
- IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
- ("Endpoint [%p] IN STATE %d. REJECT CONNECTION REQ\n", p_endpt, cm_state ) );\r
- \r
- rej_status = IB_REJ_INVALID_COMM_INSTANCE;\r
+ rej_status = IB_REJ_INSUF_RESOURCES;\r
goto conn_exit;\r
}\r
\r
- endpt_cm_set_state( p_endpt, IPOIB_CM_CONNECT );\r
- if( !p_endpt->conn.h_qp )\r
- {\r
- ib_status = endpt_cm_create_qp( p_endpt );\r
- if( ib_status != IB_SUCCESS )\r
- {\r
- IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
- ("Endpt [%p ] CM create QP failed status %#x\n", p_endpt, ib_status ) );\r
-\r
- rej_status = IB_REJ_INSUF_RESOURCES;\r
- goto conn_exit;\r
- }\r
- }\r
-\r
ib_status = \r
p_port->p_adapter->p_ifc->rearm_cq( p_endpt->conn.h_send_cq, FALSE );\r
if( ib_status != IB_SUCCESS )\r
("Endpoint rearm Recv CQ failed status %#x\n", ib_status ) );\r
goto conn_exit;\r
}\r
- \r
+\r
ib_status = __conn_accept( p_port, p_endpt, p_cm_req );\r
\r
conn_exit:\r
if( ib_status != IB_SUCCESS )\r
{\r
__conn_reject( p_port, p_cm_req->h_cm_req, rej_status );\r
- if( p_endpt->conn.h_qp )\r
+ if( p_endpt->conn.h_recv_qp )\r
{\r
- p_port->p_adapter->p_ifc->destroy_qp( p_endpt->conn.h_qp, NULL );\r
- p_endpt->conn.h_qp = NULL;\r
+ p_port->p_adapter->p_ifc->destroy_qp( p_endpt->conn.h_recv_qp, NULL );\r
+ p_endpt->conn.h_recv_qp = NULL;\r
}\r
- \r
ipoib_port_resume( p_port );\r
}\r
\r
\r
cm_reply.p_rep_pdata = (uint8_t*)&private_data;\r
cm_reply.rep_length = sizeof( cm_private_data_t );\r
- cm_reply.h_qp = p_endpt->conn.h_qp;\r
+ cm_reply.h_qp = p_endpt->conn.h_recv_qp;\r
cm_reply.qp_type = IB_QPT_RELIABLE_CONN;\r
\r
cm_reply.access_ctrl = IB_AC_LOCAL_WRITE;\r
("Endpoint Rearm Recv CQ failed status %#x\n", ib_status ) );\r
goto done;\r
}\r
- \r
cl_memclr( &cm_rtu, sizeof( ib_cm_rtu_t ) );\r
cm_rtu.access_ctrl = IB_AC_LOCAL_WRITE;\r
cm_rtu.pfn_cm_dreq_cb = __conn_dreq_cb;\r
("Endpoint [%p] Connect failed status %#x\n", p_endpt, ib_status ) );\r
goto done;\r
}\r
+ InterlockedCompareExchangePointer(\r
+ (void *)&p_endpt->conn.h_work_qp, \r
+ p_endpt->conn.h_send_qp, (void *)NULL );\r
\r
- cl_fmap_insert( &p_port->endpt_mgr.conn_endpts, \r
+ cl_obj_lock( &p_port->obj );\r
+ if( endpt_cm_set_state( p_endpt, IPOIB_CM_CONNECTED ) != IPOIB_CM_CONNECTED )\r
+ {\r
+ cl_fmap_insert( &p_port->endpt_mgr.conn_endpts, \r
&p_endpt->dgid, \r
&p_endpt->conn_item );\r
- endpt_cm_set_state( p_endpt, IPOIB_CM_CONNECTED );\r
+ }\r
+ cl_obj_unlock( &p_port->obj );\r
+\r
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
("Endpoint [%p] CONNECTED\n", p_endpt ) );\r
- \r
+\r
done:\r
if( ib_status != IB_SUCCESS )\r
{\r
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
("Endpoint [ %p ] CONNECT ACCEPTED\n", p_endpt ) );\r
\r
- cl_obj_lock( &p_port->obj );\r
-\r
- cl_fmap_insert( &p_port->endpt_mgr.conn_endpts, \r
- &p_endpt->dgid, \r
- &p_endpt->conn_item );\r
-\r
- endpt_cm_set_state( p_endpt, IPOIB_CM_CONNECTED );\r
+ InterlockedCompareExchangePointer(\r
+ (void *)&p_endpt->conn.h_work_qp, \r
+ p_endpt->conn.h_recv_qp, (void *)NULL );\r
\r
+ cl_obj_lock( &p_port->obj );\r
+ if( endpt_cm_set_state( p_endpt, IPOIB_CM_CONNECTED ) != IPOIB_CM_CONNECTED )\r
+ {\r
+ cl_fmap_insert( &p_port->endpt_mgr.conn_endpts, \r
+ &p_endpt->dgid, \r
+ &p_endpt->conn_item );\r
+ }\r
cl_obj_unlock( &p_port->obj );\r
\r
cl_spinlock_acquire( &p_port->send_lock );\r
p_endpt = (ipoib_endpt_t* )p_rej_rec->qp_context;\r
p_port = ipoib_endpt_parent( p_endpt );\r
\r
- CL_ASSERT( p_endpt->conn.h_qp == p_rej_rec->h_qp );\r
+ CL_ASSERT( p_endpt->conn.h_send_qp == p_rej_rec->h_qp ||\r
+ p_endpt->conn.h_recv_qp == p_rej_rec->h_qp );\r
\r
if( p_rej_rec->rej_status == IB_REJ_USER_DEFINED )\r
{\r
("Connect REQ Rejected Status: %d\n", cl_ntoh16( p_rej_rec->rej_status ) ) );\r
}\r
/*endpt not connected, but conn QP was created so let's offload destroy QP */\r
+ InterlockedCompareExchange( (volatile LONG *)&p_endpt->conn.state, \r
+ IPOIB_CM_REJ_RECVD, IPOIB_CM_DISCONNECTED );\r
+\r
endpt_cm_destroy_conn( p_port, p_endpt );\r
\r
ipoib_port_resume( p_port );\r
CL_ASSERT( p_dreq_rec );\r
\r
p_endpt = (ipoib_endpt_t *)p_dreq_rec->qp_context;\r
- p_port = ipoib_endpt_parent( p_endpt );\r
-\r
- cm_state = endpt_cm_set_state( p_endpt, IPOIB_CM_DREP_SENT );\r
- CL_ASSERT( cm_state == IPOIB_CM_CONNECTED );\r
+ \r
+ if( !p_endpt )\r
+ return;\r
\r
+ cm_state = ( cm_state_t )InterlockedCompareExchange( \r
+ (volatile LONG *)&p_endpt->conn.state, \r
+ IPOIB_CM_DREP_SENT, IPOIB_CM_CONNECTED );\r
+ \r
IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ERROR,\r
("RECEIVED DREQ for ENDPT [%p] CONN Status: %d\n", p_endpt, cm_state ) );\r
\r
+ if( cm_state != IPOIB_CM_CONNECTED )\r
+ return;\r
+\r
+ p_port = ipoib_endpt_parent( p_endpt );\r
cm_drep.drep_length = 0;\r
cm_drep.p_drep_pdata = NULL;\r
/*\r
IPOIB_CM_DREQ_SENT, IPOIB_CM_CONNECTED ) != IPOIB_CM_CONNECTED )\r
return;\r
\r
- cm_dreq.h_qp = p_endpt->conn.h_qp;\r
+ cm_dreq.h_qp = p_endpt->conn.h_send_qp;\r
cm_dreq.qp_type = IB_QPT_RELIABLE_CONN;\r
cm_dreq.p_dreq_pdata = NULL;\r
cm_dreq.dreq_length = 0;\r
if( ib_status != IB_SUCCESS )\r
{\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
- (" SEND DREQ ENDPT [%p] QP failed status %#x\n", p_endpt, ib_status ) );\r
+ (" SEND QP Disconnect ENDPT [%p] QP failed status %#x\n", p_endpt, ib_status ) );\r
+ }\r
+ cm_dreq.h_qp = p_endpt->conn.h_recv_qp;\r
+ ib_status = p_port->p_adapter->p_ifc->cm_dreq( &cm_dreq );\r
+ if( ib_status != IB_SUCCESS )\r
+ {\r
+ IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ (" RECV QP Disconnect ENDPT [%p] QP failed status %#x\n", p_endpt, ib_status ) );\r
}\r
\r
IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
{NDIS_STRING_CONST("RqDepth"), 1, IPOIB_OFFSET(rq_depth), IPOIB_SIZE(rq_depth), 512, 128, 1024},\r
{NDIS_STRING_CONST("RqLowWatermark"), 0, IPOIB_OFFSET(rq_low_watermark), IPOIB_SIZE(rq_low_watermark), 4, 2, 8},\r
{NDIS_STRING_CONST("SqDepth"), 1, IPOIB_OFFSET(sq_depth), IPOIB_SIZE(sq_depth), 512, 128, 1024},\r
- {NDIS_STRING_CONST("SendChksum"), 1, IPOIB_OFFSET(send_chksum_offload), IPOIB_SIZE(send_chksum_offload),0, 0, 1},\r
- {NDIS_STRING_CONST("RecvChksum"), 1, IPOIB_OFFSET(recv_chksum_offload), IPOIB_SIZE(recv_chksum_offload),0, 0, 1},\r
+ {NDIS_STRING_CONST("SendChksum"), 1, IPOIB_OFFSET(send_chksum_offload), IPOIB_SIZE(send_chksum_offload),CSUM_ENABLED, CSUM_DISABLED, CSUM_BYPASS},\r
+ {NDIS_STRING_CONST("RecvChksum"), 1, IPOIB_OFFSET(recv_chksum_offload), IPOIB_SIZE(recv_chksum_offload),CSUM_ENABLED, CSUM_DISABLED, CSUM_BYPASS},\r
{NDIS_STRING_CONST("SaTimeout"), 1, IPOIB_OFFSET(sa_timeout), IPOIB_SIZE(sa_timeout), 1000, 250, UINT_MAX},\r
{NDIS_STRING_CONST("SaRetries"), 1, IPOIB_OFFSET(sa_retry_cnt), IPOIB_SIZE(sa_retry_cnt), 10, 1, UINT_MAX},\r
{NDIS_STRING_CONST("RecvRatio"), 1, IPOIB_OFFSET(recv_pool_ratio), IPOIB_SIZE(recv_pool_ratio), 1, 1, 10},\r
{NDIS_STRING_CONST("PayloadMtu"), 1, IPOIB_OFFSET(payload_mtu), IPOIB_SIZE(payload_mtu), 2044, 60, MAX_CM_PAYLOAD_MTU},\r
{NDIS_STRING_CONST("lso"), 0, IPOIB_OFFSET(lso), IPOIB_SIZE(lso), 0, 0, 1},\r
{NDIS_STRING_CONST("MCLeaveRescan"), 1, IPOIB_OFFSET(mc_leave_rescan), IPOIB_SIZE(mc_leave_rescan), 260, 1, 3600},\r
- {NDIS_STRING_CONST("CmEnabled"), 1, IPOIB_OFFSET(cm_enabled), IPOIB_SIZE(cm_enabled), 0, 0, 1}\r
-}; \r
+ {NDIS_STRING_CONST("CmEnabled"), 0, IPOIB_OFFSET(cm_enabled), IPOIB_SIZE(cm_enabled), FALSE, FALSE, TRUE}\r
+};\r
\r
#define IPOIB_NUM_REG_PARAMS (sizeof (HCARegTable) / sizeof(IPOIB_REG_ENTRY))\r
\r
p_adapter->params.rq_low_watermark =\r
p_adapter->params.rq_depth / p_adapter->params.rq_low_watermark;\r
\r
- /* so far disable CM if LSO get active */\r
+ /* disable CM if LSO active because LSO uses UD transport only */\r
if( p_adapter->params.cm_enabled )\r
{\r
p_adapter->params.cm_enabled = !p_adapter->params.lso;\r
+ if( !p_adapter->params.cm_enabled )\r
+ {\r
+ NdisWriteErrorLogEntry( p_adapter->h_adapter,\r
+ EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de0 );\r
+ }\r
}\r
p_adapter->params.cm_payload_mtu =\r
min( MAX_CM_PAYLOAD_MTU, p_adapter->params.payload_mtu );\r
\r
CL_ASSERT( p_endpt );\r
\r
- if( !p_endpt->conn.h_qp )\r
- return;\r
+ if( p_endpt->conn.h_recv_qp )\r
+ {\r
+ cl_memclr( &mod_attr, sizeof( mod_attr ) );\r
+ mod_attr.req_state = IB_QPS_ERROR;\r
+ p_port->p_adapter->p_ifc->modify_qp( p_endpt->conn.h_send_qp, &mod_attr );\r
+ p_port->p_adapter->p_ifc->modify_qp( p_endpt->conn.h_recv_qp, &mod_attr );\r
\r
- cl_memclr( &mod_attr, sizeof( mod_attr ) );\r
- mod_attr.req_state = IB_QPS_ERROR;\r
- p_port->p_adapter->p_ifc->modify_qp( p_endpt->conn.h_qp, &mod_attr );\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
\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
+ do\r
+ {\r
+ p_free_wc = wc;\r
+ ib_status = \r
+ p_port->p_adapter->p_ifc->poll_cq( p_endpt->conn.h_recv_cq, \r
+ &p_free_wc, &p_done_wc );\r
+ if( ib_status != IB_SUCCESS && \r
+ ib_status != IB_NOT_FOUND )\r
+ {\r
+ /* connection CQ failed */\r
+ IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("Poll Recv CQ failed status %#x\n", ib_status ) );\r
+ break;\r
+ }\r
+ cl_spinlock_acquire( &p_port->recv_lock );\r
+ for( p_wc = p_done_wc; p_wc; p_wc = p_wc->p_next )\r
+ {\r
+ p_desc = (ipoib_cm_desc_t *)(uintn_t)p_wc->wr_id;\r
+ endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, p_desc );\r
+ p_port->cm_recv_mgr.depth--;\r
+ }\r
+ cl_spinlock_release( &p_port->recv_lock );\r
+ } while( !p_free_wc );\r
\r
- do\r
- {\r
- p_free_wc = wc;\r
- ib_status = \r
- p_port->p_adapter->p_ifc->poll_cq( p_endpt->conn.h_recv_cq, \r
- &p_free_wc, &p_done_wc );\r
- if( ib_status != IB_SUCCESS && \r
- ib_status != IB_NOT_FOUND )\r
+ ib_status = p_port->p_adapter->p_ifc->destroy_qp( p_endpt->conn.h_recv_qp, NULL );\r
+ if( ib_status != IB_SUCCESS )\r
{\r
- /* connection CQ failed */\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
- ("Poll Recv CQ failed status %#x\n", ib_status ) );\r
- break;\r
- }\r
- cl_spinlock_acquire( &p_port->recv_lock );\r
- for( p_wc = p_done_wc; p_wc; p_wc = p_wc->p_next )\r
- {\r
- p_desc = (ipoib_cm_desc_t *)(uintn_t)p_wc->wr_id;\r
- endpt_cm_buf_mgr_put_recv( &p_port->cm_buf_mgr, p_desc );\r
- p_port->cm_recv_mgr.depth--;\r
+ ("Destroy Recv QP failed status %#x\n", ib_status ) );\r
}\r
- cl_spinlock_release( &p_port->recv_lock );\r
- } while( !p_free_wc );\r
+ p_endpt->conn.h_recv_qp = NULL;\r
+ }\r
\r
- ib_status = p_port->p_adapter->p_ifc->destroy_qp( p_endpt->conn.h_qp, NULL );\r
- if( ib_status != IB_SUCCESS )\r
+ if( p_endpt->conn.h_send_qp )\r
{\r
- IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
- ("Destroy Recv QP failed status %#x\n", ib_status ) );\r
+ ib_status = p_port->p_adapter->p_ifc->destroy_qp( p_endpt->conn.h_send_qp, NULL );\r
+ if( ib_status != IB_SUCCESS )\r
+ {\r
+ IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+ ("Destroy Send QP failed status %#x\n", ib_status ) );\r
+ }\r
+ p_endpt->conn.h_send_qp = NULL;\r
}\r
- p_endpt->conn.h_qp = NULL;\r
\r
IPOIB_EXIT( IPOIB_DBG_RECV );\r
}\r
p_port->p_adapter->p_ifc->get_err_str( status )) );\r
// disable further CM initialization \r
p_port->p_adapter->params.cm_enabled = FALSE;\r
+\r
+ NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+ EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de1 );\r
+\r
}\r
if( p_port->p_adapter->params.cm_enabled )\r
{\r
("CM Init buf mgr failed status %#x\n", status ) );\r
ipoib_port_srq_destroy( p_port );\r
p_port->p_adapter->params.cm_enabled = FALSE;\r
+\r
+ NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+ EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de2 );\r
}\r
}\r
IPOIB_EXIT( IPOIB_DBG_INIT );\r
__send_gen(\r
IN ipoib_port_t* const p_port,\r
IN ipoib_send_desc_t* const p_desc,\r
- IN INT lso_data_index)\r
+ IN INT lso_data_index )\r
{\r
ib_api_status_t status;\r
SCATTER_GATHER_LIST *p_sgl;\r
}\r
\r
/* Remember that one of the DS entries is reserved for the IPoIB header. */\r
- if( ( p_sgl->NumberOfElements >= MAX_SEND_SGE &&\r
- p_sgl->Elements[0].Length > sizeof(eth_hdr_t)) ||\r
- ( p_sgl->NumberOfElements > MAX_SEND_SGE &&\r
- p_sgl->Elements[0].Length <= sizeof(eth_hdr_t)) )\r
+ if( ( p_sgl->NumberOfElements >= MAX_SEND_SGE ||\r
+ p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )\r
{\r
\r
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_SEND,\r
* or part of it.\r
*/\r
i = 0;\r
- if (lso_data_index) { //we have an LSO packet\r
+ if( lso_data_index )\r
+ { //we have an LSO packet\r
i = lso_data_index;\r
j = 0;\r
}\r
p_desc->wr.dgrm.ud.hlen = lso_header_size; \r
// Tell NDIS how much we will send.\r
PktExt->NdisPacketInfo[TcpLargeSendPacketInfo] = UlongToPtr(PacketLength);\r
- p_desc->wr.send_opt |= (IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM);\r
+ p_desc->wr.send_opt |= (IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM) | IB_SEND_OPT_SIGNALED;\r
__send_gen(p_port, p_desc, IndexOfData);\r
- p_desc->wr.wr_type = ( WR_LSO | IB_SEND_OPT_SIGNALED);\r
+ p_desc->wr.wr_type = WR_LSO;\r
} \r
else\r
{\r
if( ETH_IS_UNICAST( p_eth_hdr->dst.addr ) && \r
endpt_cm_get_state( p_desc->p_endpt) == IPOIB_CM_CONNECTED )\r
{\r
- p_desc->send_qp = p_desc->p_endpt->conn.h_qp;\r
+ p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;\r
}\r
else // UD QP\r
{\r
p_endpt->mac.addr[2], p_endpt->mac.addr[3],\r
p_endpt->mac.addr[4], p_endpt->mac.addr[5] ) );\r
\r
- if( !p_endpt->conn.h_qp )\r
+ if( !p_endpt->conn.h_send_qp )\r
{\r
- ib_status = endpt_cm_create_qp( p_endpt );\r
+ ib_status = endpt_cm_create_qp( p_endpt, &p_endpt->conn.h_send_qp );\r
if( ib_status != IB_SUCCESS )\r
{\r
IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
IN ipoib_endpt_t* const p_endpt )\r
{\r
cl_fmap_item_t* p_fmap_item;\r
- ipoib_endpt_t* p_conn_endpt = NULL;\r
\r
IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
\r
{\r
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, \r
&p_endpt->conn_item );\r
- p_conn_endpt = p_endpt;\r
}\r
}\r
if( p_endpt->dlid )\r
}\r
\r
cl_obj_unlock( &p_port->obj );\r
- if( p_conn_endpt )\r
- {\r
- endpt_cm_destroy_conn( p_port, p_conn_endpt );\r
- }\r
- else\r
- {\r
- cl_obj_destroy( &p_endpt->obj );\r
- }\r
+\r
+ endpt_cm_destroy_conn( p_port, p_endpt );\r
\r
IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
}\r
p_port->port_num, p_mcast_rec );\r
if( status != IB_SUCCESS )\r
{\r
+ cl_obj_destroy( &p_endpt->obj );\r
IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
("ipoib_create_mcast_endpt returned %s\n",\r
p_port->p_adapter->p_ifc->get_err_str( status )) );\r
cl_map_item_t *p_item;\r
cl_fmap_item_t *p_fmap_item;\r
ipoib_endpt_t *p_endpt;\r
- ipoib_endpt_t *p_conn_endpt = NULL;\r
uint64_t key;\r
\r
IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
{\r
cl_fmap_remove_item( &p_port->endpt_mgr.conn_endpts, \r
&p_endpt->conn_item );\r
- p_conn_endpt = p_endpt;\r
}\r
}\r
\r
}\r
\r
cl_obj_unlock( &p_port->obj );\r
- if( p_conn_endpt )\r
- {\r
- endpt_cm_destroy_conn( p_port, p_conn_endpt );\r
- }\r
- else\r
- {\r
- cl_obj_destroy( &p_endpt->obj );\r
- }\r
+\r
+ endpt_cm_destroy_conn( p_port, p_endpt );\r
+\r
#if DBG\r
cl_atomic_dec( &p_port->ref[ref_endpt_track] );\r
IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_OBJ,\r
("Port CM Listen failed\n" ) );\r
/*keep going with UD only */\r
p_port->p_adapter->params.cm_enabled = FALSE;\r
+\r
+ NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
+ EVENT_IPOIB_CONNECTED_MODE_ERR, 1, 0xbadc0de3 );\r
}\r
}\r
/* garbage collector timer is needed when link is active */\r