]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
[ipoib] cm
authoraestrin <aestrin@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Wed, 8 Oct 2008 17:36:11 +0000 (17:36 +0000)
committeraestrin <aestrin@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Wed, 8 Oct 2008 17:36:11 +0000 (17:36 +0000)
- handle second RC QP for Linux compatibility.
- added Log entries on success/failed initialization.
- minor format changes and cleanup.

git-svn-id: svn://openib.tc.cornell.edu/gen1@1637 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

branches/ipoib_cm/kernel/ipoib_cm.c
branches/ipoib_cm/kernel/ipoib_driver.c
branches/ipoib_cm/kernel/ipoib_endpoint.c
branches/ipoib_cm/kernel/ipoib_endpoint.h
branches/ipoib_cm/kernel/ipoib_log.mc
branches/ipoib_cm/kernel/ipoib_port.c

index 970b256fc0662500b20e4f4b17866d84dc4c243d..2706df77914d20a8e203cff484d2b6fef5105de9 100644 (file)
@@ -108,53 +108,60 @@ IN                        ib_async_event_rec_t            *p_event_rec );
 \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
@@ -162,38 +169,23 @@ endpt_cm_create_qp(
        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
@@ -211,8 +203,17 @@ endpt_cm_destroy_conn(
        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
@@ -257,7 +258,7 @@ ipoib_endpt_connect(
                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
@@ -419,7 +420,6 @@ IN                  ib_cm_req_rec_t                         *p_cm_req )
        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
@@ -431,6 +431,9 @@ IN                  ib_cm_req_rec_t                         *p_cm_req )
        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
@@ -456,41 +459,16 @@ IN                        ib_cm_req_rec_t                         *p_cm_req )
                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
@@ -508,7 +486,7 @@ IN                  ib_cm_req_rec_t                         *p_cm_req )
                        ("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
@@ -516,12 +494,11 @@ conn_exit:
        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
@@ -549,7 +526,7 @@ __conn_accept(
 \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
@@ -608,7 +585,6 @@ __conn_reply_cb(
                        ("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
@@ -623,14 +599,22 @@ __conn_reply_cb(
                        ("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
@@ -670,14 +654,17 @@ IN                                ib_cm_rtu_rec_t                         *p_rtu_rec )
        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
@@ -708,7 +695,8 @@ __conn_rej_cb(
        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
@@ -722,6 +710,9 @@ __conn_rej_cb(
                ("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
@@ -745,14 +736,21 @@ __conn_dreq_cb(
        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
@@ -1038,7 +1036,7 @@ __conn_send_dreq(
                                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
@@ -1048,7 +1046,14 @@ __conn_send_dreq(
        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
index 2d20df73634be6f8d5175d65997b1dea5abe7c97..3ad8a2a76f43d46da2d90ccda861396387e33c7e 100644 (file)
@@ -150,16 +150,16 @@ IPOIB_REG_ENTRY HCARegTable[] = {
        {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
@@ -597,10 +597,15 @@ ipoib_get_adapter_params(
        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
index 02e916b5f2619d9d032b8f1b7257275ee48eed81..166d68056c4a1add9dc07b2cdddada4995c479b6 100644 (file)
@@ -948,48 +948,60 @@ endpt_cm_flush_recv(
 \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
index 73959037f5c96316f6fd90a4b405e9298dda900f..45f0c69fa35db17c6aa41ab3f750d979a3a65ff1 100644 (file)
@@ -64,7 +64,8 @@ typedef struct _endpt_recv_mgr
 }      endpt_recv_mgr_t;\r
 \r
 \r
-typedef enum _cm_state {\r
+typedef enum _cm_state \r
+{\r
        IPOIB_CM_DISCONNECTED,\r
        IPOIB_CM_INIT,\r
        IPOIB_CM_CONNECT,\r
@@ -72,26 +73,30 @@ typedef enum _cm_state {
        IPOIB_CM_LISTEN,\r
        IPOIB_CM_DREP_SENT,\r
        IPOIB_CM_DREQ_SENT,\r
-       IPOIB_CM_STALE_CONN,\r
+       IPOIB_CM_REJ_RECVD,\r
        IPOIB_CM_DESTROY\r
 } cm_state_t;\r
 \r
-typedef struct _cm_private_data {\r
+typedef struct _cm_private_data \r
+{\r
        ib_net32_t              ud_qpn;\r
        ib_net32_t              recv_mtu;\r
 } cm_private_data_t;\r
 \r
 #pragma warning ( disable : 4324 )\r
-typedef struct _endpt_conn {\r
+typedef struct _endpt_conn \r
+{\r
        ib_net64_t                      service_id;\r
        cm_private_data_t       private_data;\r
-       ib_qp_handle_t          h_qp;\r
+       ib_qp_handle_t          h_send_qp;\r
+       ib_qp_handle_t          h_recv_qp;\r
+       ib_qp_handle_t          h_work_qp;\r
        ib_cq_handle_t          h_send_cq;\r
        ib_cq_handle_t          h_recv_cq;\r
        ib_listen_handle_t  h_cm_listen;\r
        ib_path_rec_t           path_rec;\r
        cm_state_t                      state;\r
-       net32_t                         cm_qpn;\r
+\r
 } endpt_conn_t;\r
 #pragma warning( default : 4324 )\r
 \r
@@ -238,7 +243,8 @@ endpt_cm_get_state(
 \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
 ib_api_status_t\r
 ipoib_endpt_connect(\r
index 193e368ac1ca390dee10a7d097eb1b5aa8e6afe9..8faf5e7ec2c57cb767399986f6c9bfb01b4aa109 100644 (file)
@@ -315,4 +315,19 @@ SymbolicName=EVENT_IPOIB_PARTITION_ERR
 Language=English\r
 %2: Pkey index not found for partition , change switch pkey configuration.\r
 .\r
+MessageId=0x005C\r
+Facility=IPoIB\r
+Severity=Error\r
+SymbolicName=EVENT_IPOIB_CONNECTED_MODE_ERR\r
+Language=English\r
+%2: Connected Mode failed to initialize, disabled. Interface will use default UD QP transport.\r
+.\r
+\r
+MessageId=0x005D\r
+Facility=IPoIB\r
+Severity=Informational\r
+SymbolicName=EVENT_IPOIB_CONNECTED_MODE_UP\r
+Language=English\r
+%2: Connected Mode initialized and operational.\r
+.\r
 \r
index bca2dcd19a2af5526afcf2476dcaf3042425898f..4621cfb73aae4940e70d1e2ee192a03aaf44a1a6 100644 (file)
@@ -987,6 +987,10 @@ __ib_mgr_init(
                        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
@@ -997,6 +1001,9 @@ __ib_mgr_init(
                                ("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
@@ -3247,7 +3254,7 @@ static NDIS_STATUS
 __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
@@ -3268,10 +3275,8 @@ __send_gen(
        }\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
@@ -3294,7 +3299,8 @@ __send_gen(
         * 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
@@ -4189,9 +4195,9 @@ __build_send_desc(
                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
@@ -4222,7 +4228,7 @@ __build_send_desc(
        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
@@ -4823,9 +4829,9 @@ IN                void*           p_context )
                                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
@@ -5053,7 +5059,6 @@ __endpt_mgr_remove(
        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
@@ -5077,7 +5082,6 @@ __endpt_mgr_remove(
                {\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
@@ -5087,14 +5091,8 @@ __endpt_mgr_remove(
        }\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
@@ -5391,6 +5389,7 @@ __endpt_mgr_add_bcast(
                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
@@ -5414,7 +5413,6 @@ ipoib_port_remove_endpt(
        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
@@ -5450,7 +5448,6 @@ ipoib_port_remove_endpt(
                        {\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
@@ -5461,14 +5458,9 @@ ipoib_port_remove_endpt(
                }\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
@@ -6223,6 +6215,9 @@ err:
                                ("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