]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
[ipoib] CM
authoraestrin <aestrin@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Sat, 6 Dec 2008 00:05:42 +0000 (00:05 +0000)
committeraestrin <aestrin@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Sat, 6 Dec 2008 00:05:42 +0000 (00:05 +0000)
- added large multicast and ICMP packets fragmentation.
(each fragment utilises UD WR and all WRs chained to use one postsend per descriptor. Only Last WR set flag for completion).
- fixed some bugs,
- added changes from the trunk.

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

14 files changed:
branches/ipoib_cm/kernel/ipoib_adapter.c
branches/ipoib_cm/kernel/ipoib_adapter.h
branches/ipoib_cm/kernel/ipoib_debug.h
branches/ipoib_cm/kernel/ipoib_driver.c
branches/ipoib_cm/kernel/ipoib_driver.h
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
branches/ipoib_cm/kernel/ipoib_port.h
branches/ipoib_cm/kernel/ipoib_xfr_mgr.h
branches/ipoib_cm/kernel/makefile.inc
branches/ipoib_cm/kernel/netipoib-xp32.inf
branches/ipoib_cm/kernel/netipoib.inx

index c51d94740f04ecc3f396a6965d76417d39bd7dde..dd81c3772342a91a4fc01a81c97a8261b01be196 100644 (file)
@@ -123,7 +123,7 @@ ipoib_get_adapter_params(
        IN                              NDIS_HANDLE* const                      wrapper_config_context,\r
        IN      OUT                     ipoib_adapter_t                         *p_adapter,\r
        OUT                             PUCHAR                                          *p_mac,\r
-       OUT                             UINT                                            *p_len );\r
+       OUT                             UINT                                            *p_len);\r
 \r
 \r
 /* Implementation */\r
@@ -498,6 +498,7 @@ __adapter_free(
                        p_adapter->p_ifc->close_al( p_adapter->h_al );\r
 \r
                cl_free( p_adapter->p_ifc );\r
+               p_adapter->p_ifc = NULL;\r
        }\r
 \r
        cl_vector_destroy( &p_adapter->ip_vector );\r
@@ -547,19 +548,19 @@ ipoib_query_pkey_index(ipoib_adapter_t    *p_adapter)
                                                 p_adapter->p_ifc->get_err_str( status )) );\r
                goto pkey_end;\r
        }\r
-\r
-       CL_ASSERT(ca_attr->p_port_attr->p_pkey_table[0] == IB_DEFAULT_PKEY);\r
-       for(index = 0; index < ca_attr->p_port_attr->num_pkeys; index++)\r
+       CL_ASSERT(ca_attr->p_port_attr[p_adapter->p_port->port_num -1].p_pkey_table[0] == IB_DEFAULT_PKEY);\r
+       for(index = 0; index < ca_attr->p_port_attr[p_adapter->p_port->port_num -1].num_pkeys; index++)\r
        {\r
-               if(cl_hton16(p_adapter->guids.port_guid.pkey) == ca_attr->p_port_attr->p_pkey_table[index])\r
+               if(cl_hton16(p_adapter->guids.port_guid.pkey) == ca_attr->p_port_attr[p_adapter->p_port->port_num -1].p_pkey_table[index])\r
                        break;\r
        }\r
-       if(index >= ca_attr->p_port_attr->num_pkeys)\r
+       if(index >= ca_attr->p_port_attr[p_adapter->p_port->port_num -1].num_pkeys)\r
        {\r
                IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
                                                ("Pkey table is invalid, index not found\n"));\r
                NdisWriteErrorLogEntry( p_adapter->h_adapter,\r
                        EVENT_IPOIB_PARTITION_ERR, 1, p_adapter->guids.port_guid.pkey );\r
+               status = IB_NOT_FOUND;\r
                p_adapter->p_port->pkey_index = PKEY_INVALID_INDEX;\r
                goto pkey_end;\r
        }\r
@@ -754,7 +755,11 @@ __ipoib_pnp_cb(
                        {\r
                                status = ipoib_query_pkey_index(p_adapter);\r
                                if(status != IB_SUCCESS)\r
-                                       break;\r
+                               {\r
+                                  cl_obj_lock( &p_adapter->obj );\r
+                                  p_adapter->state = IB_PNP_PORT_INIT;\r
+                                  cl_obj_unlock( &p_adapter->obj );\r
+                               }\r
                        }\r
 \r
                case IB_PNP_SM_CHANGE:\r
@@ -1070,12 +1075,13 @@ ipoib_set_rate(
 }\r
 \r
 \r
-void\r
+ib_api_status_t\r
 ipoib_set_active(\r
        IN                              ipoib_adapter_t* const          p_adapter )\r
 {\r
        ib_pnp_event_t  old_state;\r
        uint8_t                 i;\r
+       ib_api_status_t status = IB_SUCCESS;\r
 \r
        IPOIB_ENTER( IPOIB_DBG_INIT );\r
 \r
@@ -1104,8 +1110,13 @@ ipoib_set_active(
 \r
        default:\r
                if (p_adapter->guids.port_guid.pkey != IB_DEFAULT_PKEY)\r
-                       ipoib_query_pkey_index(p_adapter);\r
-\r
+               {\r
+                       status = ipoib_query_pkey_index(p_adapter);\r
+                       if( IB_SUCCESS != status)\r
+                       {\r
+                               break;\r
+                       }\r
+               }\r
                /* Join all programmed multicast groups. */\r
                for( i = 0; i < p_adapter->mcast_array_size; i++ )\r
                {\r
@@ -1143,6 +1154,7 @@ ipoib_set_active(
        }\r
 \r
        IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return  status;\r
 }\r
 \r
 \r
index 34e1d59846c1143ee8a2c42887ce82a23dccb11f..cf05562ccf6540f2e7fdda9d5da38f38f6e774f7 100644 (file)
@@ -422,7 +422,7 @@ ipoib_set_rate(
        IN              const   uint8_t                                         link_speed );\r
 \r
 \r
-void\r
+ib_api_status_t\r
 ipoib_set_active(\r
        IN                              ipoib_adapter_t* const          p_adapter );\r
 \r
index 417bb68621559ca98a08e7c5e02f881038bfbe4b..b63fe11b4bcc9e02c223e869901e4dc178565f7b 100644 (file)
@@ -163,13 +163,13 @@ extern uint32_t           g_ipoib_dbg_flags;
                        size_t _loop_;                                                                                                  \\r
                        for( _loop_ = 0; _loop_ < (len); ++_loop_ )                                             \\r
                        {                                                                                                                               \\r
-                               DbgPrint( "0x%.2X ", ((uint8_t*)(ptr))[_loop_] );                       \\r
+                               cl_dbg_out( "0x%.2X ", ((uint8_t*)(ptr))[_loop_] );                     \\r
                                if( (_loop_ + 1)% 16 == 0 )                                                                     \\r
-                                       DbgPrint("\n");                                                                                 \\r
+                                       cl_dbg_out("\n");                                                                                       \\r
                                else if( (_loop_ % 4 + 1) == 0 )                                                        \\r
-                                       DbgPrint("  ");                                                                                 \\r
+                                       cl_dbg_out("  ");                                                                                       \\r
                        }                                                                                                                               \\r
-                       DbgPrint("\n");                                                                                                 \\r
+                       cl_dbg_out("\n");                                                                                                       \\r
                }                                                                                                                                       \\r
        }\r
 \r
index 056d86edce2aca9686e0f87815385023e2300046..ded9b5a6ef00a927e99ec04583a63928bc692ebf 100644 (file)
@@ -150,7 +150,7 @@ typedef struct _IPOIB_REG_ENTRY
 \r
 IPOIB_REG_ENTRY HCARegTable[] = {\r
        // reg value name             If Required  Offset in parentr struct             Field size                  Default         Min     Max\r
-       {NDIS_STRING_CONST("GUIDMask"),         1, IPOIB_OFFSET(guid_mask),             IPOIB_SIZE(guid_mask),          0,          0,    MAX_GUID_MAX},\r
+       {NDIS_STRING_CONST("GUIDMask"),         0, IPOIB_OFFSET(guid_mask),             IPOIB_SIZE(guid_mask),          0,          0,    MAX_GUID_MAX},\r
        /* GUIDMask should be the first element */\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
@@ -160,7 +160,7 @@ IPOIB_REG_ENTRY HCARegTable[] = {
        {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("PayloadMtu"),       1, IPOIB_OFFSET(payload_mtu),           IPOIB_SIZE(payload_mtu),        2044,       512,   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("BCJoinRetry"),          1, IPOIB_OFFSET(bc_join_retry),                 IPOIB_SIZE(bc_join_retry),      50,         0,    1000},\r
@@ -493,7 +493,7 @@ ipoib_get_adapter_params(
        IN                              NDIS_HANDLE* const                      wrapper_config_context,\r
        IN      OUT                     ipoib_adapter_t                         *p_adapter,\r
        OUT                             PUCHAR                                          *p_mac,\r
-       OUT                             UINT                                            *p_len )\r
+       OUT                             UINT                                            *p_len)\r
 {\r
        NDIS_STATUS                                             status;\r
        NDIS_HANDLE                                             h_config;\r
@@ -619,7 +619,7 @@ ipoib_get_adapter_params(
        p_adapter->params.cm_xfer_block_size = \r
                        p_adapter->params.cm_payload_mtu + sizeof(eth_hdr_t);\r
        p_adapter->params.payload_mtu = \r
-                       min( MAX_UD_PAYLOAD_MTU, p_adapter->params.payload_mtu);\r
+                       min( DEFAULT_PAYLOAD_MTU, p_adapter->params.payload_mtu);\r
        p_adapter->params.xfer_block_size = (sizeof(eth_hdr_t) + p_adapter->params.payload_mtu);\r
        NdisReadNetworkAddress( &status, p_mac, p_len, h_config );\r
 \r
index db2ea863c3afaae1a57d74ffc7f89119c98e1069..b5995e03a319e6bfd12976201dedfff9db9e98e1 100644 (file)
 #define MAX_BUNDLE_ID_LENGTH   32\r
 \r
 /* MLX4 supports 4K MTU */\r
-#define IB_MTU                 4096\r
+#define MAX_IB_MTU                     4096\r
+#define DEFAULT_MTU                    2048\r
 /*\r
  * Header length as defined by IPoIB spec:\r
  * http://www.ietf.org/internet-drafts/draft-ietf-ipoib-ip-over-infiniband-04.txt\r
  */\r
  \r
-#define MAX_UD_PAYLOAD_MTU             (IB_MTU - sizeof(ipoib_hdr_t))\r
+#define MAX_UD_PAYLOAD_MTU             (MAX_IB_MTU - sizeof(ipoib_hdr_t))\r
+#define DEFAULT_PAYLOAD_MTU            (DEFAULT_MTU - sizeof(ipoib_hdr_t))\r
 #define MAX_CM_PAYLOAD_MTU             (65520)\r
+#define MAX_WRS_PER_MSG                        (MAX_CM_PAYLOAD_MTU/MAX_UD_PAYLOAD_MTU)\r
 /*\r
  * Only the protocol type is sent as part of the UD payload\r
  * since the rest of the Ethernet header is encapsulated in the\r
index af0f38321177115226a66ed4c7f601d94866d176..339b1e085ed276888908e4d409a1197d9062dfdf 100644 (file)
@@ -254,7 +254,7 @@ ipoib_endpt_set_mcast(
                return status;\r
        }\r
        p_endpt->h_mcast = p_mcast_rec->h_mcast;\r
-       p_endpt->dlid = p_mcast_rec->p_member_rec->mlid;\r
+       CL_ASSERT(p_endpt->dlid == 0);\r
 \r
        IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
        return IB_SUCCESS;\r
@@ -617,6 +617,7 @@ __cm_recv_desc_ctor(
        ipoib_cm_desc_t*        p_desc;\r
        ipoib_port_t*           p_port;\r
        ib_mr_create_t          create_mr;\r
+       net32_t                         rkey;\r
 \r
        CL_ASSERT( p_object );\r
        CL_ASSERT( context );\r
@@ -628,13 +629,9 @@ __cm_recv_desc_ctor(
 \r
        p_desc->alloc_buf_size = \r
                ROUNDUP( p_port->p_adapter->params.cm_xfer_block_size, BUF_ALIGN );\r
-\r
-       NdisMAllocateSharedMemory(\r
-                       p_port->p_adapter->h_adapter,\r
-                       p_desc->alloc_buf_size,\r
-                       FALSE,\r
-                       &p_desc->p_alloc_buf,\r
-                       &p_desc->phys_alloc_buf );\r
+       \r
+       p_desc->p_alloc_buf = (uint8_t *)ExAllocatePoolWithTag( \r
+               NonPagedPool, p_desc->alloc_buf_size, 'DOMC' );\r
 \r
        if( p_desc->p_alloc_buf == NULL )\r
        {\r
@@ -652,7 +649,7 @@ __cm_recv_desc_ctor(
                                                        p_port->ib_mgr.h_pd,\r
                                                        &create_mr,\r
                                                        &p_desc->lkey,\r
-                                                       &p_desc->rkey,\r
+                                                       &rkey,\r
                                                        &p_desc->h_mr ) != IB_SUCCESS )\r
        {\r
                IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
@@ -699,11 +696,7 @@ __cm_recv_desc_dtor(
                p_port->p_adapter->p_ifc->dereg_mr( p_desc->h_mr );\r
 \r
        if( p_desc->p_alloc_buf )\r
-                       NdisMFreeSharedMemory( p_port->p_adapter->h_adapter,\r
-                                               p_desc->alloc_buf_size,\r
-                                               FALSE,\r
-                                               p_desc->p_alloc_buf,\r
-                                               p_desc->phys_alloc_buf );\r
+               ExFreePoolWithTag( p_desc->p_alloc_buf, 'DOMC' );\r
 }\r
 \r
 static NDIS_PACKET*\r
index 0115b2ed768be3e0b9e4105979db770a6819d4aa..bb74a0a213c37f7e45a14303155e249d19562f83 100644 (file)
@@ -114,7 +114,6 @@ typedef struct _ipoib_endpt
        net32_t                                 qpn;\r
        uint8_t                                 cm_flag;\r
        ib_av_handle_t                  h_av;\r
-       boolean_t                               expired;\r
        endpt_conn_t                    conn;\r
 \r
        ib_al_ifc_t                             *p_ifc;\r
@@ -199,7 +198,6 @@ ipoib_endpt_ref(
         * or trying to send data to that endpoint.  Clear the expired flag\r
         * to prevent the AV from being flushed.\r
         */\r
-       p_endpt->expired = FALSE;\r
 }\r
 \r
 \r
index 8faf5e7ec2c57cb767399986f6c9bfb01b4aa109..bb7d1c1df39d55ce448d0aee60f0b30b12f39761 100644 (file)
@@ -315,6 +315,7 @@ SymbolicName=EVENT_IPOIB_PARTITION_ERR
 Language=English\r
 %2: Pkey index not found for partition , change switch pkey configuration.\r
 .\r
+\r
 MessageId=0x005C\r
 Facility=IPoIB\r
 Severity=Error\r
index 0483f0c532539d22c6c24dd2210e4ac12758856f..5316c33bd2975720184ada6f56727601c788b622 100644 (file)
@@ -63,6 +63,11 @@ ipoib_port_t *gp_ipoib_port;
 \r
 static void __port_mcast_garbage_dpc(KDPC *p_gc_dpc,void *context,void *s_arg1, void *s_arg2);\r
 static void __port_do_mcast_garbage(ipoib_port_t* const        p_port );\r
+\r
+\r
+static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void *s_arg1, void *s_arg2);\r
+\r
+\r
 /******************************************************************************\r
 *\r
 * Declarations\r
@@ -337,15 +342,44 @@ __send_cb(
        IN              const   ib_cq_handle_t                          h_cq,\r
        IN                              void                                            *cq_context );\r
 \r
-static NDIS_STATUS GetLsoHeaderSize(\r
-       IN      ipoib_port_t* const pPort,\r
-       IN      PNDIS_BUFFER  CurrBuffer,\r
-       IN      LsoData *pLsoData,\r
-       OUT     uint16_t *pSize,\r
-       OUT     INT  *IndexOfData,\r
-       IN              ipoib_hdr_t *ipoib_hdr\r
-       );\r
+static NDIS_STATUS\r
+GetLsoHeaderSize(\r
+       IN      ipoib_port_t* const                                     pPort,\r
+       IN      PNDIS_BUFFER                                            CurrBuffer,\r
+       IN      LsoData                                                         *pLsoData,\r
+       OUT     uint16_t                                                        *pSize,\r
+       OUT     INT                                                                     *IndexOfData,\r
+       IN              ipoib_hdr_t                                                     *ipoib_hdr );\r
 \r
+static NDIS_STATUS\r
+__build_lso_desc(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc,\r
+       IN                              ULONG                                           mss,\r
+       IN                              int32_t                                         hdr_idx );\r
+\r
+static NDIS_STATUS\r
+__send_fragments(\r
+       IN              ipoib_port_t* const                                     p_port,\r
+       IN              ipoib_send_desc_t* const                        p_desc,\r
+       IN              eth_hdr_t* const                                        p_eth_hdr,\r
+       IN              ip_hdr_t* const                                         p_ip_hdr,\r
+       IN              uint32_t                                                        buf_len,\r
+       IN              NDIS_BUFFER*                                            p_ndis_buf );\r
+\r
+static void\r
+__update_fragment_ip_hdr(\r
+IN             ip_hdr_t* const         p_ip_hdr,\r
+IN             uint16_t                        fragment_size, \r
+IN             uint16_t                        fragment_offset, \r
+IN             BOOLEAN                         more_fragments );\r
+\r
+static void\r
+__copy_ip_options(\r
+IN             uint8_t*                        p_buf,\r
+IN             uint8_t*                        p_options,\r
+IN             uint32_t                        options_len,\r
+IN             BOOLEAN                         copy_all );\r
 /******************************************************************************\r
 *\r
 * Endpoint manager operations\r
@@ -496,8 +530,6 @@ inline void ipoib_port_ref( ipoib_port_t * p_port, int type )
 \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
@@ -505,6 +537,8 @@ inline void ipoib_port_deref(ipoib_port_t * p_port, int type)
 #else\r
        UNREFERENCED_PARAMETER(type);\r
 #endif\r
+       cl_obj_deref( &p_port->obj );\r
+\r
 }\r
 \r
 /* function returns pointer to payload that is going after IP header.\r
@@ -512,7 +546,7 @@ inline void ipoib_port_deref(ipoib_port_t * p_port, int type)
 */\r
 static void* GetIpPayloadPtr(const     ip_hdr_t* const p_ip_hdr)\r
 {\r
-       return (void*)((uint8_t*)p_ip_hdr + 4*(p_ip_hdr->ver_hl & 0xf));\r
+       return (void*)((uint8_t*)p_ip_hdr + IP_HEADER_LENGTH(p_ip_hdr));\r
 }\r
 \r
 /******************************************************************************\r
@@ -677,6 +711,10 @@ __port_init(
                        p_adapter->p_ifc->get_err_str( status )) );\r
                return status;\r
        }\r
+\r
+        KeInitializeDpc(&p_port->recv_dpc,(PKDEFERRED_ROUTINE)__recv_cb_dpc,p_port);\r
+\r
+\r
         /* Initialize multicast garbage collector timer and DPC object */\r
         KeInitializeDpc(&p_port->gc_dpc,(PKDEFERRED_ROUTINE)__port_mcast_garbage_dpc,p_port);\r
         KeInitializeTimerEx(&p_port->gc_timer,SynchronizationTimer);\r
@@ -928,7 +966,7 @@ __ib_mgr_init(
        }\r
 \r
        qp_create.h_sq_cq = p_port->ib_mgr.h_send_cq;\r
-       qp_create.sq_signaled = TRUE;\r
+       qp_create.sq_signaled = FALSE;\r
        status = p_port->p_adapter->p_ifc->create_qp(\r
                p_port->ib_mgr.h_pd, &qp_create, p_port,\r
                __qp_event, &p_port->ib_mgr.h_qp );\r
@@ -1792,6 +1830,22 @@ ipoib_return_packet(
        IPOIB_EXIT( IPOIB_DBG_RECV );\r
 }\r
 \r
+static void __recv_cb_dpc(KDPC *p_gc_dpc,void *context,void * s_arg1 , void * s_arg2)\r
+{\r
+\r
+       ipoib_port_t *p_port = context;\r
+\r
+       UNREFERENCED_PARAMETER(p_gc_dpc);\r
+       UNREFERENCED_PARAMETER(s_arg1);\r
+       UNREFERENCED_PARAMETER(s_arg2);\r
+\r
+\r
+       __recv_cb(NULL, p_port);\r
+       ipoib_port_deref( p_port, ref_recv_cb );\r
+\r
+\r
+}\r
+\r
 \r
 static void\r
 __recv_cb(\r
@@ -1856,7 +1910,7 @@ __recv_cb(
                recv_cnt += __recv_mgr_filter( p_port, p_wc, &done_list, &bad_list );\r
                cl_perf_stop( &p_port->p_adapter->perf, FilterRecv );\r
 \r
-       } while( !p_free );\r
+       } while( (!p_free) && (recv_cnt < 128));\r
 \r
        /* We're done looking at the endpoint map, release the reference. */\r
        cl_atomic_dec( &p_port->endpt_rdr );\r
@@ -1935,18 +1989,23 @@ __recv_cb(
        } while( pkt_cnt );\r
        cl_spinlock_release( &p_port->recv_lock );\r
 \r
-       /*\r
-        * Rearm after filtering to prevent contention on the enpoint maps\r
-        * and eliminate the possibility of having a call to\r
-        * __endpt_mgr_insert find a duplicate.\r
-        */\r
-       cl_perf_start( RearmRecv );\r
-       status = p_port->p_adapter->p_ifc->rearm_cq(\r
-               p_port->ib_mgr.h_recv_cq, FALSE );\r
-       cl_perf_stop( &p_port->p_adapter->perf, RearmRecv );\r
-       CL_ASSERT( status == IB_SUCCESS );\r
+       if (p_free ) {\r
+               /*\r
+                * Rearm after filtering to prevent contention on the enpoint maps\r
+                * and eliminate the possibility of having a call to\r
+                * __endpt_mgr_insert find a duplicate.\r
+                */\r
+               cl_perf_start( RearmRecv );\r
+               status = p_port->p_adapter->p_ifc->rearm_cq(\r
+                       p_port->ib_mgr.h_recv_cq, FALSE );\r
+               cl_perf_stop( &p_port->p_adapter->perf, RearmRecv );\r
+               CL_ASSERT( status == IB_SUCCESS );\r
 \r
-       ipoib_port_deref( p_port, ref_recv_cb );\r
+               ipoib_port_deref( p_port, ref_recv_cb );\r
+       } else {\r
+               // Please note the reference is still up\r
+               KeInsertQueueDpc(&p_port->recv_dpc, NULL, NULL);\r
+       }\r
 \r
        cl_perf_stop( &p_port->p_adapter->perf, RecvCb );\r
 \r
@@ -2040,6 +2099,7 @@ __recv_get_endpts(
                                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
+                               *pp_src = NULL;\r
                                return;\r
                        }\r
                        cl_obj_unlock( &p_port->obj );\r
@@ -2157,7 +2217,8 @@ __recv_mgr_filter(
                if((len - sizeof(ipoib_hdr_t)) > p_port->p_adapter->params.payload_mtu)\r
                {\r
                        IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
-                               ("Received ETH packet > payload MTU (%d)\n",\r
+                               ("Received ETH packet len %d > payload MTU (%d)\n",\r
+                               (len - sizeof(ipoib_hdr_t)),\r
                                p_port->p_adapter->params.payload_mtu) );\r
                        ipoib_inc_recv_stat( p_port->p_adapter, IP_STAT_ERROR, 0, 0 );\r
                        cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
@@ -3042,6 +3103,7 @@ __send_mgr_filter(
                cl_perf_start( FilterArp );\r
                status = __send_mgr_filter_arp(\r
                        p_port, p_eth_hdr, p_buf, buf_len, p_desc );\r
+               p_desc->send_dir = SEND_UD_QP;\r
                cl_perf_stop( &p_port->p_adapter->perf, FilterArp );\r
                break;\r
 \r
@@ -3050,6 +3112,8 @@ __send_mgr_filter(
                 * The IPoIB spec doesn't define how to send non IP or ARP packets.\r
                 * Just send the payload and hope for the best.\r
                 */\r
+\r
+               p_desc->send_dir = SEND_UD_QP;\r
                cl_perf_start( SendGen );\r
                status = __send_gen( p_port, p_desc, 0 );\r
                cl_perf_stop( &p_port->p_adapter->perf, SendGen );\r
@@ -3105,11 +3169,11 @@ __send_copy(
        NdisQueryPacketLength( p_desc->p_pkt, &tot_len );\r
 \r
        /* Setup the work request. */\r
-       p_desc->local_ds[1].vaddr = cl_get_physaddr(\r
+       p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr(\r
                ((uint8_t*)p_desc->p_buf) + sizeof(eth_hdr_t) );\r
-       p_desc->local_ds[1].length = tot_len - sizeof(eth_hdr_t);\r
-       p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;\r
-       p_desc->wr.num_ds = 2;\r
+       p_desc->send_wr[0].local_ds[1].length = tot_len - sizeof(eth_hdr_t);\r
+       p_desc->send_wr[0].local_ds[1].lkey = p_port->ib_mgr.lkey;\r
+       p_desc->send_wr[0].wr.num_ds = 2;\r
 \r
        /* Copy the packet. */\r
        NdisCopyFromPacketToPacketSafe( p_packet, bytes_copied, tot_len,\r
@@ -3201,18 +3265,18 @@ __send_gen(
                                CL_ASSERT( i == 0 );\r
                                if( offset < PAGE_SIZE )\r
                                {\r
-                                       p_desc->local_ds[j].lkey = p_port->ib_mgr.lkey;\r
-                                       p_desc->local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);\r
+                                       p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
+                                       p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);\r
                                        /* Add the byte offset since we're on the 1st page. */\r
-                                       p_desc->local_ds[j].vaddr += offset;\r
+                                       p_desc->send_wr[0].local_ds[j].vaddr += offset;\r
                                        if( offset + buf_len > PAGE_SIZE )\r
                                        {\r
-                                               p_desc->local_ds[j].length = PAGE_SIZE - offset;\r
-                                               buf_len -= p_desc->local_ds[j].length;\r
+                                               p_desc->send_wr[0].local_ds[j].length = PAGE_SIZE - offset;\r
+                                               buf_len -= p_desc->send_wr[0].local_ds[j].length;\r
                                        }\r
                                        else\r
                                        {\r
-                                               p_desc->local_ds[j].length = buf_len;\r
+                                               p_desc->send_wr[0].local_ds[j].length = buf_len;\r
                                                buf_len = 0;\r
                                        }\r
                                        /* This data segment is done.  Move to the next. */\r
@@ -3228,25 +3292,25 @@ __send_gen(
                /* Finish this MDL */\r
                while( buf_len )\r
                {\r
-                       p_desc->local_ds[j].lkey = p_port->ib_mgr.lkey;\r
-                       p_desc->local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);\r
+                       p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
+                       p_desc->send_wr[0].local_ds[j].vaddr = (page_array[i] << PAGE_SHIFT);\r
                        /* Add the first page's offset if we're on the first page. */\r
                        if( i == 0 )\r
-                               p_desc->local_ds[j].vaddr += MmGetMdlByteOffset( p_mdl );\r
+                               p_desc->send_wr[0].local_ds[j].vaddr += MmGetMdlByteOffset( p_mdl );\r
 \r
                        if( i == 0 && (MmGetMdlByteOffset( p_mdl ) + buf_len) > PAGE_SIZE )\r
                        {\r
                                /* Buffers spans pages. */\r
-                               p_desc->local_ds[j].length =\r
+                               p_desc->send_wr[0].local_ds[j].length =\r
                                        PAGE_SIZE - MmGetMdlByteOffset( p_mdl );\r
-                               buf_len -= p_desc->local_ds[j].length;\r
+                               buf_len -= p_desc->send_wr[0].local_ds[j].length;\r
                                /* This page is done.  Move to the next. */\r
                                i++;\r
                        }\r
                        else\r
                        {\r
                                /* Last page of the buffer. */\r
-                               p_desc->local_ds[j].length = buf_len;\r
+                               p_desc->send_wr[0].local_ds[j].length = buf_len;\r
                                buf_len = 0;\r
                        }\r
                        /* This data segment is done.  Move to the next. */\r
@@ -3267,7 +3331,7 @@ __send_gen(
        }\r
 \r
        /* Set the number of data segments. */\r
-       p_desc->wr.num_ds = j;\r
+       p_desc->send_wr[0].wr.num_ds = j;\r
 \r
        IPOIB_EXIT( IPOIB_DBG_SEND );\r
        return IB_SUCCESS;\r
@@ -3300,11 +3364,11 @@ __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
+       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
+               IPOIB_PRINT( TRACE_LEVEL_WARNING, IPOIB_DBG_SEND,\r
                        ("Too many buffers %d to fit in WR ds_array[%d] \\r
                         Or buffer[0] length %d < Eth header. Copying data.\n",\r
                        p_sgl->NumberOfElements, MAX_SEND_SGE,  p_sgl->Elements[0].Length ) );\r
@@ -3337,11 +3401,11 @@ __send_gen(
                }\r
                else\r
                {\r
-                       p_desc->local_ds[j].vaddr =\r
+                       p_desc->send_wr[0].local_ds[j].vaddr =\r
                                p_sgl->Elements[i].Address.QuadPart + offset;\r
-                       p_desc->local_ds[j].length =\r
+                       p_desc->send_wr[0].local_ds[j].length =\r
                                p_sgl->Elements[i].Length - offset;\r
-                       p_desc->local_ds[j].lkey = p_port->ib_mgr.lkey;\r
+                       p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
                        i++;\r
                        j++;\r
                        break;\r
@@ -3350,15 +3414,15 @@ __send_gen(
        /* Now fill in the rest of the local data segments. */\r
        while( i < p_sgl->NumberOfElements )\r
        {\r
-               p_desc->local_ds[j].vaddr = p_sgl->Elements[i].Address.QuadPart;\r
-               p_desc->local_ds[j].length = p_sgl->Elements[i].Length;\r
-               p_desc->local_ds[j].lkey = p_port->ib_mgr.lkey;\r
+               p_desc->send_wr[0].local_ds[j].vaddr = p_sgl->Elements[i].Address.QuadPart;\r
+               p_desc->send_wr[0].local_ds[j].length = p_sgl->Elements[i].Length;\r
+               p_desc->send_wr[0].local_ds[j].lkey = p_port->ib_mgr.lkey;\r
                i++;\r
                j++;\r
        }\r
 \r
        /* Set the number of data segments. */\r
-       p_desc->wr.num_ds = j;\r
+       p_desc->send_wr[0].wr.num_ds = j;\r
 \r
        IPOIB_EXIT( IPOIB_DBG_SEND );\r
        return NDIS_STATUS_SUCCESS;\r
@@ -3376,6 +3440,7 @@ __send_mgr_filter_ip(
 {\r
        NDIS_STATUS             status;\r
        ip_hdr_t                *p_ip_hdr;\r
+       uint32_t                ip_packet_len;\r
 \r
        PERF_DECLARE( QueryIp );\r
        PERF_DECLARE( SendTcp );\r
@@ -3414,43 +3479,76 @@ __send_mgr_filter_ip(
                return NDIS_STATUS_BUFFER_TOO_SHORT;\r
        }\r
 \r
-       if( p_ip_hdr->offset ||\r
-               p_ip_hdr->prot != IP_PROT_UDP )\r
+       switch( p_ip_hdr->prot )\r
        {\r
-               /* Check if this packet is IGMP */\r
-               if ( p_ip_hdr->prot == IP_PROT_IGMP ) \r
-               {\r
-                       /*\r
-                           In igmp packet I saw that iph arrive in 2 NDIS_BUFFERs:\r
-                               1. iph\r
-                               2. ip options\r
-                               So to get the IGMP packet we need to skip the ip options NDIS_BUFFER\r
-                       */\r
-                       size_t iph_size_in_bytes = (p_ip_hdr->ver_hl & 0xf) * 4;\r
-                       size_t iph_options_size = iph_size_in_bytes - buf_len;\r
-                       buf_len -= sizeof(ip_hdr_t);//without ipheader\r
+       case IP_PROT_UDP:\r
 \r
-                       /*\r
-                           Could be a case that arrived igmp packet not from type IGMPv2 ,\r
-                               but IGMPv1 or IGMPv3.\r
-                               We anyway pass it to __send_mgr_filter_igmp_v2().\r
-                       */\r
-                       __send_mgr_filter_igmp_v2(p_port, p_ip_hdr, iph_options_size, p_buf, buf_len);\r
-               }\r
-               /* Not a UDP packet. */\r
-               cl_perf_start( SendTcp );\r
-               status = __send_gen( p_port, p_desc,0 );\r
-               cl_perf_stop( &p_port->p_adapter->perf, SendTcp );\r
-               IPOIB_EXIT( IPOIB_DBG_SEND );\r
+               cl_perf_start( FilterUdp );\r
+               status = __send_mgr_filter_udp(\r
+                       p_port, p_ip_hdr, p_buf, (buf_len - sizeof(ip_hdr_t)), p_desc );\r
+               cl_perf_stop( &p_port->p_adapter->perf, FilterUdp );\r
+               if( status == NDIS_STATUS_PENDING )\r
+               {  /* not DHCP packet, keep going */\r
+                       if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )\r
+                               p_desc->send_dir = SEND_UD_QP;\r
+                       else\r
+                               p_desc->send_dir = SEND_RC_QP;\r
+                       break;\r
+               }\r
                return status;\r
+       \r
+       case IP_PROT_TCP:\r
+               p_desc->send_dir = SEND_RC_QP;\r
+               break;\r
+       case IP_PROT_IGMP:\r
+               /*\r
+               In igmp packet I saw that iph arrive in 2 NDIS_BUFFERs:\r
+               1. iph\r
+               2. ip options\r
+               So to get the IGMP packet we need to skip the ip options NDIS_BUFFER.\r
+               Could be a case that arrived igmp packet not from type IGMPv2 ,\r
+               but IGMPv1 or IGMPv3.\r
+               We anyway pass it to __send_mgr_filter_igmp_v2().\r
+               */\r
+               status =\r
+                       __send_mgr_filter_igmp_v2(p_port, p_ip_hdr,\r
+                               (size_t)( IP_HEADER_LENGTH(p_ip_hdr) - buf_len ),\r
+                               p_buf, (buf_len - sizeof(ip_hdr_t)) );\r
+               if( status != NDIS_STATUS_SUCCESS )\r
+                       return status;\r
+               p_desc->send_dir = SEND_UD_QP;\r
+               break;\r
+       case IP_PROT_ICMP:\r
+               p_desc->send_dir = SEND_UD_QP;\r
+       default:\r
+               break;\r
+       }\r
+       \r
+       if( !p_port->p_adapter->params.cm_enabled )\r
+       {\r
+               p_desc->send_dir = SEND_UD_QP;\r
+               goto send_gen;\r
+       }\r
+       else if( endpt_cm_get_state( p_desc->p_endpt ) != IPOIB_CM_CONNECTED )\r
+       {\r
+               p_desc->send_dir = SEND_UD_QP;\r
        }\r
 \r
-       buf_len -= sizeof(ip_hdr_t);\r
+       if( p_desc->send_dir == SEND_UD_QP )\r
+       {\r
+               ip_packet_len = cl_ntoh16( p_ip_hdr->length );\r
+               if( ip_packet_len  > p_port->p_adapter->params.payload_mtu )\r
+               {\r
+                       status = __send_fragments( p_port, p_desc, (eth_hdr_t* const)p_eth_hdr,\r
+                                               (ip_hdr_t* const)p_ip_hdr, (uint32_t)buf_len, p_buf );\r
+                       return status;\r
+               }\r
+       }\r
 \r
-       cl_perf_start( FilterUdp );\r
-       status = __send_mgr_filter_udp(\r
-               p_port, p_ip_hdr, p_buf, buf_len, p_desc );\r
-       cl_perf_stop( &p_port->p_adapter->perf, FilterUdp );\r
+send_gen:\r
+       cl_perf_start( SendTcp );\r
+       status = __send_gen( p_port, p_desc,0 );\r
+       cl_perf_stop( &p_port->p_adapter->perf, SendTcp );\r
 \r
        IPOIB_EXIT( IPOIB_DBG_SEND );\r
        return status;\r
@@ -3637,11 +3735,7 @@ __send_mgr_filter_udp(
                p_udp_hdr->dst_port != DHCP_PORT_CLIENT) )\r
        {\r
                /* Not a DHCP packet. */\r
-               cl_perf_start( SendUdp );\r
-               status = __send_gen( p_port, p_desc,0 );\r
-               cl_perf_stop( &p_port->p_adapter->perf, SendUdp );\r
-               IPOIB_EXIT( IPOIB_DBG_SEND );\r
-               return status;\r
+               return NDIS_STATUS_PENDING;\r
        }\r
 \r
        buf_len -= sizeof(udp_hdr_t);\r
@@ -3851,10 +3945,11 @@ __send_mgr_filter_dhcp(
        }\r
        /* no chksum for udp */\r
        p_desc->p_buf->ip.prot.udp.hdr.chksum = 0;\r
-       p_desc->local_ds[1].vaddr = cl_get_physaddr( p_desc->p_buf );\r
-       p_desc->local_ds[1].length = sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t);\r
-       p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;\r
-       p_desc->wr.num_ds = 2;\r
+       p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( p_desc->p_buf );\r
+       p_desc->send_wr[0].local_ds[1].length = sizeof(ip_hdr_t) +      sizeof(udp_hdr_t) + sizeof(dhcp_pkt_t);\r
+       p_desc->send_wr[0].local_ds[1].lkey = p_port->ib_mgr.lkey;\r
+       p_desc->send_wr[0].wr.num_ds = 2;\r
+       p_desc->send_dir = SEND_UD_QP;\r
        IPOIB_EXIT( IPOIB_DBG_SEND );\r
        return NDIS_STATUS_SUCCESS;\r
 }\r
@@ -4005,9 +4100,8 @@ __send_mgr_filter_arp(
 #if DBG\r
        if( p_port->p_adapter->params.cm_enabled )\r
        {\r
-               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
-               (" %s SEND to ENDPT[%p] State: %d flag: %#x, QPN: %#x MAC %02x:%02x:%02x:%02x:%02x:%02x\n",\r
-                       (( p_arp->op == ARP_OP_REQ )? "ARP REQUEST" : "ARP REPLY" ),\r
+               IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+               (" ARP SEND to ENDPT[%p] State: %d flag: %#x, QPN: %#x MAC %02x:%02x:%02x:%02x:%02x:%02x\n",\r
                        p_desc->p_endpt, \r
                        endpt_cm_get_state( p_desc->p_endpt ),\r
                        p_desc->p_endpt->cm_flag, \r
@@ -4020,10 +4114,11 @@ __send_mgr_filter_arp(
 \r
        p_ib_arp->dst_ip = p_arp->dst_ip;\r
 \r
-       p_desc->local_ds[1].vaddr = cl_get_physaddr( p_ib_arp );\r
-       p_desc->local_ds[1].length = sizeof(ipoib_arp_pkt_t);\r
-       p_desc->local_ds[1].lkey = p_port->ib_mgr.lkey;\r
-       p_desc->wr.num_ds = 2;\r
+       p_desc->send_wr[0].local_ds[1].vaddr = cl_get_physaddr( p_ib_arp );\r
+       p_desc->send_wr[0].local_ds[1].length = sizeof(ipoib_arp_pkt_t);\r
+       p_desc->send_wr[0].local_ds[1].lkey = p_port->ib_mgr.lkey;\r
+       p_desc->send_wr[0].wr.num_ds = 2;\r
+       p_desc->send_wr[0].wr.p_next = NULL;\r
 \r
        IPOIB_EXIT( IPOIB_DBG_SEND );\r
        return NDIS_STATUS_SUCCESS;\r
@@ -4035,14 +4130,14 @@ __send_mgr_get_eth_hdr(
        IN                              NDIS_PACKET* const                      p_packet,\r
                OUT                     NDIS_BUFFER** const                     pp_buf,\r
                OUT                     eth_hdr_t** const                       pp_eth_hdr,\r
-               OUT                     UINT*                                           p_buf_len,\r
-               OUT                     UINT*                                           p_tot_len )\r
+               OUT                     UINT*                                           p_buf_len )\r
 {\r
+       UINT                            tot_len;\r
 \r
        IPOIB_ENTER( IPOIB_DBG_SEND );\r
 \r
        NdisGetFirstBufferFromPacketSafe(\r
-               p_packet, pp_buf, pp_eth_hdr, p_buf_len, p_tot_len, NormalPagePriority );\r
+               p_packet, pp_buf, pp_eth_hdr, p_buf_len, &tot_len, NormalPagePriority );\r
 \r
        if( !*pp_eth_hdr )\r
        {\r
@@ -4147,26 +4242,17 @@ __build_send_desc(
        PNDIS_PACKET_EXTENSION                          PktExt;\r
        PNDIS_TCP_IP_CHECKSUM_PACKET_INFO       pChecksumPktInfo; //NDIS 5.1\r
        ULONG                                                           mss;\r
-       LsoData                                                         TheLsoData;\r
-       INT                                                                     IndexOfData = 0;\r
-       ULONG                                                           PhysBufCount;\r
-       ULONG                                                           PacketLength;\r
-       PNDIS_BUFFER                                            FirstBuffer;\r
-       uint16_t                                                        lso_header_size;\r
-\r
 \r
        PERF_DECLARE( SendMgrFilter );\r
 \r
        IPOIB_ENTER( IPOIB_DBG_SEND );\r
 \r
        /* Format the send descriptor. */\r
-       cl_perf_start( SendMgrFilter );\r
 \r
        PktExt = NDIS_PACKET_EXTENSION_FROM_PACKET(p_desc->p_pkt);\r
-       pChecksumPktInfo = (PNDIS_TCP_IP_CHECKSUM_PACKET_INFO)&PktExt->NdisPacketInfo[TcpIpChecksumPacketInfo];\r
+       pChecksumPktInfo = \r
+               (PNDIS_TCP_IP_CHECKSUM_PACKET_INFO)&PktExt->NdisPacketInfo[TcpIpChecksumPacketInfo];\r
        mss = PtrToUlong(PktExt->NdisPacketInfo[TcpLargeSendPacketInfo]);\r
-       //TODO: optimization: we already got total length from NdisGetFirstBufferFromPacketSafe before\r
-       NdisQueryPacket(p_desc->p_pkt, (PUINT)&PhysBufCount, NULL, &FirstBuffer,(PUINT)&PacketLength);\r
 \r
        /* Format the send descriptor. */\r
        hdr_idx = cl_atomic_inc( &p_port->hdr_idx );\r
@@ -4175,48 +4261,27 @@ __build_send_desc(
        p_port->hdr[hdr_idx].type = p_eth_hdr->type;\r
        p_port->hdr[hdr_idx].resv = 0;\r
 \r
+       p_desc->send_wr[0].local_ds[0].vaddr = cl_get_physaddr( &p_port->hdr[hdr_idx] );\r
+       p_desc->send_wr[0].local_ds[0].length = sizeof(ipoib_hdr_t);\r
+       p_desc->send_wr[0].local_ds[0].lkey = p_port->ib_mgr.lkey;\r
+       p_desc->send_wr[0].wr.send_opt = 0;\r
+\r
        if( p_port->p_adapter->params.lso && mss )\r
        {\r
-               memset(&TheLsoData, 0, sizeof TheLsoData );\r
-               status = GetLsoHeaderSize(\r
-                       p_port,\r
-                       FirstBuffer, \r
-                       &TheLsoData, \r
-                       &lso_header_size,\r
-                       &IndexOfData,\r
-                       &p_port->hdr[hdr_idx] );\r
-\r
-               if ((status != NDIS_STATUS_SUCCESS ) || \r
-                       (TheLsoData.FullBuffers != TheLsoData.UsedBuffers)) {\r
-                       ASSERT(FALSE);\r
-\r
-                       IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this packet\n"));\r
-\r
-                       //NdisReleaseSpinLock(&Port->SendLock);\r
-                       //MP_ASSERT_NDIS_PACKET_TYPE(Packet);\r
-                       //SendComplete(Port, Packet, NDIS_STATUS_INVALID_PACKET);\r
-                       //NdisAcquireSpinLock(&Port->SendLock);\r
-                       //IPOIB_PRINT_EXIT\r
+               status = __build_lso_desc( p_port, p_desc, mss, hdr_idx );\r
+               if( status != NDIS_STATUS_SUCCESS )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("__build_lso_desc returned 0x%08X.\n", status) );\r
                        return status;\r
                }\r
-               ASSERT(lso_header_size > 0);\r
-               p_desc->wr.dgrm.ud.mss = mss;\r
-               p_desc->wr.dgrm.ud.header = TheLsoData.LsoBuffers[0].pData;\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) | IB_SEND_OPT_SIGNALED;\r
-               __send_gen(p_port, p_desc, IndexOfData);\r
-               p_desc->wr.wr_type = WR_LSO;\r
-       } else {\r
-\r
-               /* Setup the first local data segment (used for the IPoIB header). */\r
-               p_desc->local_ds[0].vaddr = cl_get_physaddr( &p_port->hdr[hdr_idx] );\r
-               p_desc->local_ds[0].length = sizeof(ipoib_hdr_t);\r
-               p_desc->local_ds[0].lkey = p_port->ib_mgr.lkey;\r
-\r
+       }\r
+       else\r
+       {\r
+               uint32_t        i;\r
+               cl_perf_start( SendMgrFilter );\r
                status = __send_mgr_filter(\r
-                       p_port, p_eth_hdr, p_buf, buf_len, p_desc);\r
+                       p_port, p_eth_hdr, p_buf, buf_len, p_desc );\r
                cl_perf_stop( &p_port->p_adapter->perf, SendMgrFilter );\r
                if( status != NDIS_STATUS_SUCCESS )\r
                {\r
@@ -4224,46 +4289,52 @@ __build_send_desc(
                                ("__send_mgr_filter returned 0x%08X.\n", status) );\r
                        return status;\r
                }\r
-               p_desc->wr.wr_type = WR_SEND;\r
-               p_desc->wr.send_opt = IB_SEND_OPT_SIGNALED;\r
-       }\r
-\r
 \r
-\r
-       /* Setup the work request. */\r
-       p_desc->wr.p_next = NULL;\r
-       p_desc->wr.wr_id = (uintn_t)p_desc->p_pkt;\r
-       p_desc->wr.ds_array = p_desc->local_ds;\r
-\r
-       /* check if we can send data through RC QP */\r
-       if( !( p_eth_hdr->dst.addr[0] & (uint8_t)0x01 ) &&  \r
-               endpt_cm_get_state( p_desc->p_endpt) == IPOIB_CM_CONNECTED )\r
-       {\r
-               p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;\r
-       }\r
-       else /* UD QP */\r
-       {\r
-               if( p_port->p_adapter->params.send_chksum_offload && \r
-                       ( pChecksumPktInfo->Transmit.NdisPacketChecksumV4 || \r
-                         pChecksumPktInfo->Transmit.NdisPacketChecksumV6 ))\r
+               if( p_desc->send_dir == SEND_UD_QP )\r
                {\r
-                       // Set transimition checksum offloading \r
-                       if( pChecksumPktInfo->Transmit.NdisPacketIpChecksum )\r
+                       p_desc->send_qp = p_port->ib_mgr.h_qp; // UD QP\r
+                       for( i = 0; i < p_desc->num_wrs; i++ )\r
                        {\r
-                               p_desc->wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM;\r
+                               p_desc->send_wr[i].wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;\r
+                               p_desc->send_wr[i].wr.dgrm.ud.remote_qkey = p_port->ib_mgr.bcast_rec.qkey;\r
+                               p_desc->send_wr[i].wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;\r
+                               p_desc->send_wr[i].wr.dgrm.ud.pkey_index = p_port->pkey_index;\r
+                               p_desc->send_wr[i].wr.dgrm.ud.rsvd = NULL;\r
+                               p_desc->send_wr[i].wr.send_opt = 0;\r
+\r
+                               if( p_port->p_adapter->params.send_chksum_offload && \r
+                                       ( pChecksumPktInfo->Transmit.NdisPacketChecksumV4 || \r
+                                       pChecksumPktInfo->Transmit.NdisPacketChecksumV6 ))\r
+                               {\r
+                                       // Set transimition checksum offloading \r
+                                       if( pChecksumPktInfo->Transmit.NdisPacketIpChecksum )\r
+                                       {\r
+                                               p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_IP_CSUM;\r
+                                       }\r
+                                       if( pChecksumPktInfo->Transmit.NdisPacketTcpChecksum )\r
+                                       {\r
+                                               p_desc->send_wr[i].wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM;\r
+                                       }\r
+                               }\r
                        }\r
-                       if( pChecksumPktInfo->Transmit.NdisPacketTcpChecksum )\r
+               }\r
+               else // RC QP\r
+               {\r
+                       CL_ASSERT( p_desc->send_dir == SEND_RC_QP );\r
+                       p_desc->send_qp = p_desc->p_endpt->conn.h_work_qp;\r
+               }\r
+               for( i = 0; i < p_desc->num_wrs; i++ )\r
+               {\r
+                       p_desc->send_wr[i].wr.wr_type = WR_SEND;\r
+                       p_desc->send_wr[i].wr.wr_id = (uintn_t)p_desc->p_pkt;\r
+                       p_desc->send_wr[i].wr.ds_array = &p_desc->send_wr[i].local_ds[0];\r
+                       if( i )\r
                        {\r
-                               p_desc->wr.send_opt |= IB_SEND_OPT_TX_TCP_UDP_CSUM;\r
+                               p_desc->send_wr[i-1].wr.p_next = &p_desc->send_wr[i].wr;\r
                        }\r
                }\r
-\r
-               p_desc->send_qp = p_port->ib_mgr.h_qp;\r
-               p_desc->wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;\r
-               p_desc->wr.dgrm.ud.remote_qkey = p_port->ib_mgr.bcast_rec.qkey;\r
-               p_desc->wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;\r
-               p_desc->wr.dgrm.ud.pkey_index = p_port->pkey_index;\r
-               p_desc->wr.dgrm.ud.rsvd = NULL;\r
+               p_desc->send_wr[p_desc->num_wrs - 1].wr.send_opt |= IB_SEND_OPT_SIGNALED;\r
+               p_desc->send_wr[p_desc->num_wrs - 1].wr.p_next = NULL;\r
        }\r
 \r
        /* Store context in our reserved area of the packet. */\r
@@ -4275,6 +4346,82 @@ __build_send_desc(
        return NDIS_STATUS_SUCCESS;\r
 }\r
 \r
+static NDIS_STATUS\r
+__build_lso_desc(\r
+       IN                              ipoib_port_t* const                     p_port,\r
+       IN      OUT                     ipoib_send_desc_t* const        p_desc,\r
+       IN                              ULONG                                           mss,\r
+       IN                              int32_t                                         hdr_idx )\r
+{\r
+       NDIS_STATUS                     status;\r
+       PNDIS_PACKET_EXTENSION                          PktExt;\r
+       LsoData                                                         TheLsoData;\r
+       INT                                                                     IndexOfData = 0;\r
+       ULONG                                                           PhysBufCount;\r
+       ULONG                                                           PacketLength;\r
+       PNDIS_BUFFER                                            FirstBuffer;\r
+       uint16_t                                                        lso_header_size;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       NdisQueryPacket(p_desc->p_pkt, (PUINT)&PhysBufCount, NULL, \r
+                                                       &FirstBuffer,(PUINT)&PacketLength);\r
+       PktExt = NDIS_PACKET_EXTENSION_FROM_PACKET(p_desc->p_pkt);\r
+\r
+       memset(&TheLsoData, 0, sizeof TheLsoData );\r
+       status = GetLsoHeaderSize(\r
+               p_port,\r
+               FirstBuffer, \r
+               &TheLsoData, \r
+               &lso_header_size,\r
+               &IndexOfData,\r
+               &p_port->hdr[hdr_idx] );\r
+\r
+       if ((status != NDIS_STATUS_SUCCESS ) || \r
+               (TheLsoData.FullBuffers != TheLsoData.UsedBuffers)) \r
+       {\r
+               ASSERT(FALSE);\r
+\r
+               IPOIB_PRINT(TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR, ("<-- Throwing this packet\n"));\r
+\r
+               //NdisReleaseSpinLock(&Port->SendLock);\r
+               //MP_ASSERT_NDIS_PACKET_TYPE(Packet);\r
+               //SendComplete(Port, Packet, NDIS_STATUS_INVALID_PACKET);\r
+               //NdisAcquireSpinLock(&Port->SendLock);\r
+               //IPOIB_PRINT_EXIT\r
+               if( status == NDIS_STATUS_SUCCESS )\r
+               {\r
+                       status = NDIS_STATUS_INVALID_PACKET;\r
+               }\r
+               return status;\r
+       }\r
+       ASSERT(lso_header_size > 0);\r
+       // Tell NDIS how much we will send.\r
+       PktExt->NdisPacketInfo[TcpLargeSendPacketInfo] = UlongToPtr(PacketLength);\r
+\r
+       p_desc->send_wr[0].wr.dgrm.ud.mss = mss;\r
+       p_desc->send_wr[0].wr.dgrm.ud.header = TheLsoData.LsoBuffers[0].pData;\r
+       p_desc->send_wr[0].wr.dgrm.ud.hlen = lso_header_size; \r
+       p_desc->send_wr[0].wr.dgrm.ud.remote_qp = p_desc->p_endpt->qpn;\r
+       p_desc->send_wr[0].wr.dgrm.ud.remote_qkey = p_port->ib_mgr.bcast_rec.qkey;\r
+       p_desc->send_wr[0].wr.dgrm.ud.h_av = p_desc->p_endpt->h_av;\r
+       p_desc->send_wr[0].wr.dgrm.ud.pkey_index = p_port->pkey_index;\r
+       p_desc->send_wr[0].wr.dgrm.ud.rsvd = NULL;\r
+       \r
+       p_desc->send_wr[0].wr.wr_id = (uintn_t)p_desc->p_pkt;\r
+       p_desc->send_wr[0].wr.ds_array = p_desc->send_wr[0].local_ds;\r
+       p_desc->send_wr[0].wr.wr_type = WR_LSO;\r
+       p_desc->send_wr[0].wr.send_opt = \r
+               (IB_SEND_OPT_TX_IP_CSUM | IB_SEND_OPT_TX_TCP_UDP_CSUM) | IB_SEND_OPT_SIGNALED;\r
+       \r
+       p_desc->send_wr[0].wr.p_next = NULL;\r
+       p_desc->send_qp = p_port->ib_mgr.h_qp;\r
+       p_desc->send_dir = SEND_UD_QP;\r
+       status = __send_gen(p_port, p_desc, IndexOfData );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return status;\r
+}\r
 \r
 static inline void\r
 __process_failed_send(\r
@@ -4315,7 +4462,7 @@ ipoib_port_send(
        eth_hdr_t                       *p_eth_hdr;\r
        NDIS_BUFFER                     *p_buf;\r
        UINT                            buf_len;\r
-       UINT                            tot_len;\r
+       ib_send_wr_t            *p_wr_failed;\r
 \r
        PERF_DECLARE( GetEthHdr );\r
        PERF_DECLARE( BuildSendDesc );\r
@@ -4354,11 +4501,12 @@ ipoib_port_send(
                desc.p_endpt = NULL;\r
                desc.p_buf = NULL;\r
                desc.send_qp = NULL;\r
+               desc.num_wrs = 1;\r
 \r
                /* Get the ethernet header so we can find the endpoint. */\r
                cl_perf_start( GetEthHdr );\r
                status = __send_mgr_get_eth_hdr(\r
-                       p_packet_array[i], &p_buf, &p_eth_hdr, &buf_len, &tot_len );\r
+                       p_packet_array[i], &p_buf, &p_eth_hdr, &buf_len );\r
                cl_perf_stop( &p_port->p_adapter->perf, GetEthHdr );\r
                if( status != NDIS_STATUS_SUCCESS )\r
                {\r
@@ -4378,15 +4526,6 @@ ipoib_port_send(
                        NDIS_BUFFER                     *p_ip_hdr_buf;\r
                        UINT                            ip_hdr_buf_len;\r
                        \r
-                       /* drop multicast packets larger than UD MTU */\r
-                       if( p_port->p_adapter->params.cm_enabled &&\r
-                               tot_len > p_port->p_adapter->params.payload_mtu )\r
-                       {\r
-                               cl_perf_start( ProcessFailedSends );\r
-                               __process_failed_send( p_port, &desc, NDIS_STATUS_SUCCESS );\r
-                               cl_perf_stop( &p_port->p_adapter->perf, ProcessFailedSends );\r
-                               continue;\r
-                       }\r
                        // Extract the ip hdr \r
                        if(buf_len >= sizeof(ip_hdr_t)+ sizeof(eth_hdr_t))\r
                        {\r
@@ -4459,7 +4598,7 @@ h_end:
                        if( status == NDIS_STATUS_PENDING )\r
                        {\r
                                ipoib_endpt_deref( desc.p_endpt );\r
-                               break;\r
+                               continue;\r
                        }\r
                        cl_perf_start( ProcessFailedSends );\r
                        __process_failed_send( p_port, &desc, status );\r
@@ -4469,7 +4608,7 @@ h_end:
 \r
                /* Post the WR. */\r
                cl_perf_start( PostSend );\r
-               ib_status =     p_port->p_adapter->p_ifc->post_send( desc.send_qp, &desc.wr, NULL );\r
+               ib_status =     p_port->p_adapter->p_ifc->post_send( desc.send_qp, &desc.send_wr[0].wr, &p_wr_failed );\r
                cl_perf_stop( &p_port->p_adapter->perf, PostSend );\r
                if( ib_status != IB_SUCCESS )\r
                {\r
@@ -4503,7 +4642,7 @@ ipoib_port_resume(
        eth_hdr_t                       *p_eth_hdr;\r
        NDIS_BUFFER                     *p_buf;\r
        UINT                            buf_len;\r
-       UINT                            tot_len;\r
+       ib_send_wr_t            *p_wr_failed;\r
 \r
        PERF_DECLARE( GetEndpt );\r
        PERF_DECLARE( BuildSendDesc );\r
@@ -4542,10 +4681,11 @@ ipoib_port_resume(
                desc.p_endpt = NULL;\r
                desc.p_buf = NULL;\r
                desc.send_qp = NULL;\r
+               desc.num_wrs = 1;\r
 \r
                /* Get the ethernet header so we can find the endpoint. */\r
                status = __send_mgr_get_eth_hdr(\r
-                       desc.p_pkt, &p_buf, &p_eth_hdr, &buf_len, &tot_len );\r
+                       desc.p_pkt, &p_buf, &p_eth_hdr, &buf_len );\r
                if( status != NDIS_STATUS_SUCCESS )\r
                {\r
                        cl_perf_start( ProcessFailedSends );\r
@@ -4559,6 +4699,7 @@ ipoib_port_resume(
                cl_perf_stop( &p_port->p_adapter->perf, GetEndpt );\r
                if( status == NDIS_STATUS_PENDING )\r
                {\r
+                       CL_ASSERT(desc.p_endpt == NULL);\r
                        cl_qlist_insert_head( &p_port->send_mgr.pending_list,\r
                                IPOIB_LIST_ITEM_FROM_PACKET( desc.p_pkt ) );\r
                        break;\r
@@ -4566,6 +4707,7 @@ ipoib_port_resume(
                else if( status != NDIS_STATUS_SUCCESS )\r
                {\r
                        ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );\r
+                       CL_ASSERT(desc.p_endpt == NULL);\r
 \r
                        if( ETH_IS_MULTICAST( p_eth_hdr->dst.addr ) )\r
                        {\r
@@ -4599,7 +4741,7 @@ ipoib_port_resume(
                        {\r
                                /* ARP REPLY packet queued */\r
                                ipoib_endpt_deref( desc.p_endpt );\r
-                               break;\r
+                               continue;\r
                        }\r
                        cl_perf_start( ProcessFailedSends );\r
                        __process_failed_send( p_port, &desc, status );\r
@@ -4609,7 +4751,7 @@ ipoib_port_resume(
 \r
                /* Post the WR. */\r
                cl_perf_start( PostSend );\r
-               ib_status =     p_port->p_adapter->p_ifc->post_send( desc.send_qp, &desc.wr, NULL );\r
+               ib_status =     p_port->p_adapter->p_ifc->post_send( desc.send_qp, &desc.send_wr[0].wr, &p_wr_failed );\r
                cl_perf_stop( &p_port->p_adapter->perf, PostSend );\r
                if( ib_status != IB_SUCCESS )\r
                {\r
@@ -4996,8 +5138,6 @@ __endpt_mgr_reset_all(
 \r
                cl_qmap_remove_item( &p_port->endpt_mgr.mac_endpts,\r
                        &p_port->p_local_endpt->mac_item );\r
-               cl_fmap_remove_item( &p_port->endpt_mgr.gid_endpts,\r
-                       &p_port->p_local_endpt->gid_item );\r
                cl_qmap_remove_item( &p_port->endpt_mgr.lid_endpts,\r
                        &p_port->p_local_endpt->lid_item );\r
                \r
@@ -5087,8 +5227,10 @@ __endpt_mgr_reset_all(
        /* Destroy all multicast endpoints now that we have released the lock. */\r
        while( cl_qlist_count( &mc_list ) )\r
        {\r
-               cl_obj_destroy( &PARENT_STRUCT( cl_qlist_remove_head( &mc_list ),\r
-                       ipoib_endpt_t, mac_item.pool_item.list_item )->obj );\r
+               cl_list_item_t  *p_item;\r
+               p_item = cl_qlist_remove_head( &mc_list );\r
+               p_endpt = PARENT_STRUCT(p_item, ipoib_endpt_t, mac_item.pool_item.list_item);\r
+               cl_obj_destroy( &p_endpt->obj);\r
        }\r
 \r
        IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
@@ -5110,8 +5252,11 @@ __endpt_mgr_remove(
 \r
        IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
 \r
+       /* This function must be called from the recieve path */\r
+       CL_ASSERT(p_port->endpt_rdr > 0);\r
+\r
        cl_obj_lock( &p_port->obj );\r
-       /* Wait for all readers to complete. */\r
+       /* Wait for all readers to complete. */    \r
        while( p_port->endpt_rdr > 1 )\r
                ;\r
 \r
@@ -5478,6 +5623,10 @@ __endpt_mgr_insert(
                p_qitem = cl_qmap_insert(\r
                        &p_port->endpt_mgr.lid_endpts, p_endpt->dlid, &p_endpt->lid_item );\r
                CL_ASSERT( p_qitem == &p_endpt->lid_item );\r
+               if (p_qitem != &p_endpt->lid_item) {\r
+                       // Since we failed to insert into the list, make sure it is not removed\r
+                       p_endpt->dlid =0;\r
+               }\r
        }\r
 \r
        IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
@@ -5503,7 +5652,7 @@ __endpt_mgr_add_bcast(
 \r
        /* Allocate the broadcast endpoint. */\r
        p_endpt = ipoib_endpt_create( &p_mcast_rec->p_member_rec->mgid,\r
-               p_mcast_rec->p_member_rec->mlid, CL_HTON32(0x00FFFFFF) );\r
+               , CL_HTON32(0x00FFFFFF) );\r
        if( !p_endpt )\r
        {\r
                IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
@@ -5604,51 +5753,6 @@ ipoib_port_remove_endpt(
        IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
 }\r
 \r
-\r
-void\r
-ipoib_port_flush_endpts(\r
-       IN                              ipoib_port_t* const                     p_port )\r
-{\r
-       cl_map_item_t   *p_item;\r
-       ipoib_endpt_t   *p_endpt;\r
-\r
-       IPOIB_ENTER( IPOIB_DBG_ENDPT );\r
-\r
-       cl_obj_lock( &p_port->obj );\r
-       p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );\r
-       while( p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts ) )\r
-       {\r
-               p_endpt = PARENT_STRUCT( p_item, ipoib_endpt_t, mac_item );\r
-               p_item = cl_qmap_next( p_item );\r
-\r
-               /*\r
-                * If the endpoint has been marked as expired before, and we have\r
-                * an AV handle, free the AV.\r
-                */\r
-               if( p_endpt->expired && p_endpt->h_av )\r
-               {\r
-                       CL_ASSERT( p_endpt->obj.ref_cnt == 1 );\r
-                       p_port->p_adapter->p_ifc->destroy_av( p_endpt->h_av );\r
-                       p_endpt->h_av = NULL;\r
-                       p_endpt->expired = FALSE;\r
-               }\r
-\r
-               /*\r
-                * If the endpoint is not in use, mark it as expired.\r
-                * Note that the ref count is only zero when the endpoint gets\r
-                * destroyed, so an endpoint that is not in use has a ref count of 1.\r
-                * Also note that we never expire any multicast endpoints.\r
-                */\r
-               CL_ASSERT( p_endpt->obj.ref_cnt != 0 );\r
-               if( p_endpt->obj.ref_cnt == 1 && p_endpt->h_av && !p_endpt->h_mcast )\r
-                       p_endpt->expired = TRUE;\r
-       }\r
-       cl_obj_unlock( &p_port->obj );\r
-\r
-       IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
-}\r
-\r
-\r
 /*\r
  * The sequence for port up is as follows:\r
  *     1. The port goes active.  This allows the adapter to send SA queries\r
@@ -5675,14 +5779,24 @@ ipoib_port_up(
 \r
        IPOIB_ENTER( IPOIB_DBG_INIT );\r
 \r
+       cl_obj_lock( &p_port->obj );\r
+       if ((p_port->state == IB_QPS_INIT) ||\r
+               (p_port->state == IB_QPS_RTS)){\r
+               cl_obj_unlock( &p_port->obj );\r
+               status = STATUS_SUCCESS;\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("p_port->state = %d - Aborting.\n", p_port->state) );        \r
+               goto up_done;\r
+       }\r
+       p_port->state = IB_QPS_INIT;\r
+       cl_obj_unlock( &p_port->obj );  \r
+\r
+\r
        /* Wait for all work requests to get flushed. */\r
        while( p_port->recv_mgr.depth || p_port->send_mgr.depth )\r
                cl_thread_suspend( 0 );\r
 \r
-       cl_obj_lock( &p_port->obj );\r
-       p_port->state = IB_QPS_INIT;\r
        KeResetEvent( &p_port->sa_event );\r
-       cl_obj_unlock( &p_port->obj );\r
 \r
        mad_out = (ib_mad_t*)cl_zalloc(256);\r
        if(! mad_out)\r
@@ -5742,6 +5856,8 @@ up_done:
                        ipoib_set_inactive( p_port->p_adapter );\r
                        __endpt_mgr_reset_all( p_port );\r
                }\r
+               ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
+               p_port->state = IB_QPS_ERROR;\r
                KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
        }\r
 \r
@@ -5780,8 +5896,8 @@ __endpt_mgr_add_local(
        cl_memclr( &av_attr, sizeof(ib_av_attr_t) );\r
        av_attr.port_num = p_port->port_num;\r
        av_attr.sl = 0;\r
-       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ENDPT,\r
-               ("<__endpt_mgr_add_local>:  av_attr.dlid = p_port_info->base_lid = %d\n",p_port_info->base_lid));\r
+       IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
+               (" av_attr.dlid = p_port_info->base_lid = %d\n", cl_ntoh16( p_port_info->base_lid ) ));\r
        av_attr.dlid = p_port_info->base_lid;\r
        av_attr.static_rate = p_port->ib_mgr.rate;\r
        av_attr.path_bits = 0;\r
@@ -5883,14 +5999,20 @@ __bcast_get_cb(
 \r
        cl_obj_lock( &p_port->obj );\r
        p_port->ib_mgr.h_query = NULL;\r
+\r
+       CL_ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
        if( p_port->state != IB_QPS_INIT )\r
        {\r
                status = IB_CANCELED;\r
                goto done;\r
        }\r
-\r
+       \r
        status = p_query_rec->status;\r
 \r
+       IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+               ("status of request %s\n", \r
+               p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+\r
        switch( status )\r
        {\r
        case IB_SUCCESS:\r
@@ -5919,7 +6041,6 @@ __bcast_get_cb(
                NdisWriteErrorLogEntry( p_port->p_adapter->h_adapter,\r
                        EVENT_IPOIB_BCAST_GET, 1, p_query_rec->status );\r
        }\r
-\r
 done:\r
        cl_obj_unlock( &p_port->obj );\r
 \r
@@ -5930,6 +6051,7 @@ done:
                        ipoib_set_inactive( p_port->p_adapter );\r
                        __endpt_mgr_reset_all( p_port );\r
                }\r
+               p_port->state = IB_QPS_ERROR;\r
                KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
        }\r
 \r
@@ -6160,11 +6282,12 @@ __bcast_cb(
        p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;\r
 \r
        cl_obj_lock( &p_port->obj );\r
+\r
+       ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
        if( p_port->state != IB_QPS_INIT )\r
        {\r
                cl_obj_unlock( &p_port->obj );\r
                if( p_mcast_rec->status == IB_SUCCESS )\r
-\r
                {\r
                        ipoib_port_ref(p_port, ref_leave_mcast);\r
                        p_port->p_adapter->p_ifc->leave_mcast( p_mcast_rec->h_mcast, __leave_error_mcast_cb );\r
@@ -6175,9 +6298,7 @@ __bcast_cb(
                        ("Invalid state - Aborting.\n") );\r
                return;\r
        }\r
-\r
        status = p_mcast_rec->status;\r
-\r
        if( status != IB_SUCCESS )\r
        {\r
                IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
@@ -6223,15 +6344,23 @@ __bcast_cb(
                {\r
                        ipoib_set_inactive( p_port->p_adapter );\r
                        __endpt_mgr_reset_all( p_port );\r
+                       ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
+                       p_port->state = IB_QPS_ERROR;\r
                        KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
                }\r
                ipoib_port_deref( p_port, ref_bcast_req_failed );\r
                IPOIB_EXIT( IPOIB_DBG_INIT );\r
                return;\r
        }\r
-       cl_obj_unlock( &p_port->obj );\r
        p_port->bc_join_retry_cnt = 0;\r
-       if(! p_port->p_local_endpt)\r
+\r
+       while( p_port->endpt_rdr )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               cl_obj_lock( &p_port->obj );\r
+       }\r
+\r
+       if( !p_port->p_local_endpt )\r
        {\r
                ib_port_info_t  port_info;\r
                cl_memclr(&port_info, sizeof(port_info));\r
@@ -6242,9 +6371,13 @@ __bcast_cb(
                        IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
                                ("__endpt_mgr_add_local returned %s\n",\r
                                p_port->p_adapter->p_ifc->get_err_str( status )) );\r
+                               cl_obj_unlock( &p_port->obj );\r
                        goto err;\r
                }\r
        }\r
+\r
+       cl_obj_unlock( &p_port->obj );\r
+\r
        status = __endpt_mgr_add_bcast( p_port, p_mcast_rec );\r
        if( status != IB_SUCCESS )\r
        {\r
@@ -6268,6 +6401,8 @@ __bcast_cb(
 err:\r
                /* Flag the adapter as hung. */\r
                p_port->p_adapter->hung = TRUE;\r
+               ASSERT(p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
+               p_port->state = IB_QPS_ERROR;        \r
                KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
                ipoib_port_deref( p_port, ref_bcast_error );\r
                IPOIB_EXIT( IPOIB_DBG_INIT );\r
@@ -6276,8 +6411,10 @@ err:
 \r
        cl_obj_lock( &p_port->obj );\r
        /* Only change the state if we're still in INIT. */\r
-       if( p_port->state == IB_QPS_INIT )\r
+       ASSERT( p_port->state == IB_QPS_INIT || p_port->state == IB_QPS_ERROR);\r
+       if (p_port->state == IB_QPS_INIT) {\r
                p_port->state = IB_QPS_RTS;\r
+       }\r
        cl_obj_unlock( &p_port->obj );\r
 \r
        /* Prepost receives. */\r
@@ -6286,7 +6423,35 @@ err:
        cl_spinlock_release( &p_port->recv_lock );\r
 \r
        /* Notify the adapter that we now have an active connection. */\r
-       ipoib_set_active( p_port->p_adapter );\r
+       status = ipoib_set_active( p_port->p_adapter );\r
+       if( status != IB_SUCCESS )\r
+       {\r
+               ib_qp_mod_t                     qp_mod;\r
+               ipoib_set_inactive( p_port->p_adapter );\r
+               KeSetEvent( &p_port->sa_event, EVENT_INCREMENT, FALSE );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_INIT,\r
+                       ("ipoib_set_active returned %s.\n",p_port->p_adapter->p_ifc->get_err_str( status )));\r
+               cl_spinlock_acquire( &p_port->recv_lock );\r
+               cl_obj_lock( &p_port->obj );\r
+               p_port->state = IB_QPS_ERROR;\r
+               if( p_port->ib_mgr.h_query )\r
+               {\r
+                       p_port->p_adapter->p_ifc->cancel_query(\r
+                               p_port->p_adapter->h_al, p_port->ib_mgr.h_query );\r
+                       p_port->ib_mgr.h_query = NULL;\r
+               }\r
+               cl_obj_unlock( &p_port->obj );\r
+               cl_spinlock_release( &p_port->recv_lock );\r
+\r
+               CL_ASSERT( p_port->ib_mgr.h_qp );\r
+               cl_memclr( &qp_mod, sizeof(ib_qp_mod_t) );\r
+               qp_mod.req_state = IB_QPS_ERROR;\r
+               status = p_port->p_adapter->p_ifc->modify_qp( p_port->ib_mgr.h_qp, &qp_mod );\r
+               __endpt_mgr_reset_all( p_port );\r
+\r
+               ipoib_port_deref( p_port, ref_join_bcast );\r
+               return;\r
+       }\r
 \r
        if( p_port->p_adapter->params.cm_enabled &&\r
                !p_port->p_local_endpt->conn.h_cm_listen )\r
@@ -6513,7 +6678,6 @@ __mcast_cb(
        ib_api_status_t         status;\r
        ipoib_port_t            *p_port;\r
        cl_fmap_item_t          *p_item;\r
-       cl_map_item_t           *p_qitem;\r
        ipoib_endpt_t           *p_endpt;\r
 \r
        IPOIB_ENTER( IPOIB_DBG_MCAST );\r
@@ -6521,6 +6685,11 @@ __mcast_cb(
        p_port = (ipoib_port_t*)p_mcast_rec->mcast_context;\r
 \r
        cl_obj_lock( &p_port->obj );\r
+       while( p_port->endpt_rdr )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               cl_obj_lock( &p_port->obj );\r
+       }\r
        if( p_port->state != IB_QPS_RTS )\r
        {\r
                cl_obj_unlock( &p_port->obj );\r
@@ -6535,10 +6704,10 @@ __mcast_cb(
                        ("Invalid state - Aborting.\n") );\r
                return;\r
        }\r
-       cl_obj_unlock( &p_port->obj );\r
 \r
        if( p_mcast_rec->status != IB_SUCCESS )\r
        {\r
+               cl_obj_unlock( &p_port->obj );\r
                IPOIB_PRINT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
                        ("Multicast join request failed with status %s.\n",\r
                        p_port->p_adapter->p_ifc->get_err_str( p_mcast_rec->status )) );\r
@@ -6549,7 +6718,6 @@ __mcast_cb(
                return;\r
        }\r
 \r
-       cl_obj_lock( &p_port->obj );\r
        p_item = cl_fmap_get(\r
                &p_port->endpt_mgr.gid_endpts, &p_mcast_rec->p_member_rec->mgid );\r
        if( p_item == cl_fmap_end( &p_port->endpt_mgr.gid_endpts ) )\r
@@ -6591,14 +6759,9 @@ __mcast_cb(
 \r
        /*\r
         * The endpoint is already in the GID and MAC maps.\r
-        * Add it to the LID map if it has local scope.\r
+        * mast endpoint are not used in the LID map.\r
         */\r
-       if( p_endpt->dlid )\r
-       {\r
-               p_qitem = cl_qmap_insert(\r
-                       &p_port->endpt_mgr.lid_endpts, p_endpt->dlid, &p_endpt->lid_item );\r
-               CL_ASSERT( p_qitem == &p_endpt->lid_item );\r
-       }\r
+       CL_ASSERT(p_endpt->dlid == 0);\r
        /* set flag that endpoint is use */\r
        p_endpt->is_in_use = TRUE;\r
        cl_obj_unlock( &p_port->obj );\r
@@ -6728,7 +6891,7 @@ NDIS_STATUS GetLsoHeaderSize(
        }\r
        IpHdr = (ip_hdr_t UNALIGNED*)pSrc;\r
        IpHeaderLen = (uint16_t)IP_HEADER_LENGTH(IpHdr);\r
-       ASSERT(IpHdr->prot == PROTOCOL_TCP);\r
+       ASSERT(IpHdr->prot == IP_PROT_TCP);\r
        if (CurrLength < IpHeaderLen) {\r
                IPOIB_PRINT(TRACE_LEVEL_VERBOSE, IPOIB_DBG_ERROR, ("Error processing packets\n"));\r
                return status;\r
@@ -6824,6 +6987,12 @@ static void __port_do_mcast_garbage(ipoib_port_t* const  p_port)
        cl_qlist_init( &destroy_mc_list );\r
 \r
        cl_obj_lock( &p_port->obj );\r
+       /* Wait for all readers to finish */\r
+       while( p_port->endpt_rdr )\r
+       {\r
+               cl_obj_unlock( &p_port->obj );\r
+               cl_obj_lock( &p_port->obj );\r
+       }\r
        cnt = 0;\r
        p_item = cl_qmap_head( &p_port->endpt_mgr.mac_endpts );\r
        while( (p_item != cl_qmap_end( &p_port->endpt_mgr.mac_endpts )) && (cnt < GC_MAX_LEAVE_NUM))\r
@@ -6862,7 +7031,7 @@ static void __port_do_mcast_garbage(ipoib_port_t* const   p_port)
        /* Destroy all multicast endpoints now that we have released the lock. */\r
        while( cl_qlist_count( &destroy_mc_list ) )\r
        {\r
-               p_endpt = PARENT_STRUCT( cl_qlist_head( &destroy_mc_list ),\r
+               p_endpt = PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list ),\r
                                                                 ipoib_endpt_t, mac_item.pool_item.list_item );\r
                IPOIB_PRINT( TRACE_LEVEL_INFORMATION, IPOIB_DBG_ENDPT,\r
                        ("mcast garbage collector: destroying endpoint %02x:%02x:%02x:%02x:%02x:%02x \n", \r
@@ -6872,9 +7041,7 @@ static void __port_do_mcast_garbage(ipoib_port_t* const   p_port)
                                 p_endpt->mac.addr[3],\r
                                 p_endpt->mac.addr[4],\r
                                 p_endpt->mac.addr[5]) );\r
-\r
-               cl_obj_destroy( &PARENT_STRUCT( cl_qlist_remove_head( &destroy_mc_list ),\r
-                       ipoib_endpt_t, mac_item.pool_item.list_item )->obj );\r
+               cl_obj_destroy( &p_endpt->obj );\r
        }\r
 }\r
 \r
@@ -7019,3 +7186,321 @@ ipoib_endpt_get_path(
        IPOIB_EXIT( IPOIB_DBG_ENDPT );\r
        return STATUS_SUCCESS;\r
 }\r
+\r
+/* \r
+*  Put all fragments into separate WR and chain together.\r
+*  The last WR will be set to generate CQ Event.\r
+*  lookaside buffer is used for ipoib and ip headers attached to each WR.\r
+*  Buffer will be released on last WR send completion.\r
+*/\r
+static NDIS_STATUS\r
+__send_fragments(\r
+IN             ipoib_port_t* const                     p_port,\r
+IN             ipoib_send_desc_t* const        p_desc,\r
+IN             eth_hdr_t* const                        p_eth_hdr,\r
+IN             ip_hdr_t* const                         p_ip_hdr,\r
+IN             uint32_t                                        buf_len,\r
+IN             NDIS_BUFFER*                            p_ndis_buf )\r
+{\r
+       uint32_t        ds_idx = 0;\r
+       uint32_t        wr_idx = 0;\r
+       uint32_t        sgl_idx = 2; //skip eth hdr, ip hdr\r
+       uint32_t        options_len = 0;\r
+       uint8_t*        p_options = NULL;\r
+       uint8_t*        p_buf;\r
+       uint32_t        frag_offset = 0;\r
+       uint32_t        next_sge;\r
+       uint32_t        wr_size = 0;\r
+       uint32_t        ip_hdr_len = IP_HEADER_LENGTH( p_ip_hdr );\r
+       uint32_t        total_ip_len = cl_ntoh16( p_ip_hdr->length );\r
+\r
+       SCATTER_GATHER_LIST             *p_sgl;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_SEND );\r
+\r
+       if( IP_DONT_FRAGMENT(p_ip_hdr) )\r
+                       return NDIS_STATUS_INVALID_PACKET;\r
+       \r
+       p_sgl = NDIS_PER_PACKET_INFO_FROM_PACKET( p_desc->p_pkt, ScatterGatherListPacketInfo );\r
+       if( !p_sgl )\r
+       {\r
+               ASSERT( p_sgl );\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to get SGL from packet.\n") );\r
+               return NDIS_STATUS_FAILURE;\r
+       }\r
+       if( ( p_sgl->NumberOfElements > MAX_SEND_SGE ||\r
+               p_sgl->Elements[0].Length < sizeof(eth_hdr_t)) )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Too many SG Elements in packet.\n") );\r
+               return NDIS_STATUS_FAILURE;\r
+       }\r
+       p_buf = (uint8_t *)\r
+               ExAllocateFromNPagedLookasideList( &p_port->buf_mgr.send_buf_list );\r
+       if( !p_buf )\r
+       {\r
+               IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                       ("Failed to allocate lookaside buffer.\n") );\r
+               return NDIS_STATUS_RESOURCES;\r
+       }\r
+       p_desc->p_buf = (send_buf_t*)p_buf;\r
+\r
+       /* build first fragment WR */\r
+       ((ipoib_hdr_t*)p_buf)->type = p_eth_hdr->type;\r
+       ((ipoib_hdr_t*)p_buf)->resv = 0;\r
+       p_desc->send_wr[0].local_ds[0].vaddr = cl_get_physaddr( (void *)p_buf );\r
+       p_desc->send_wr[0].local_ds[0].length = sizeof( ipoib_hdr_t );\r
+       p_desc->send_wr[0].local_ds[0].lkey = p_port->ib_mgr.lkey;\r
+       \r
+       p_buf += sizeof( ipoib_hdr_t );\r
+\r
+       if( buf_len < ip_hdr_len )\r
+       {       /* ip options in a separate buffer */\r
+               CL_ASSERT( buf_len == sizeof( ip_hdr_t ) );\r
+               NdisGetNextBuffer( p_ndis_buf, &p_ndis_buf );\r
+               if( !p_ndis_buf )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to get IP options buffer.\n") );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+               NdisQueryBufferSafe( p_ndis_buf, &p_options, &options_len, NormalPagePriority );\r
+               if( !p_options )\r
+               {\r
+                       IPOIB_PRINT_EXIT( TRACE_LEVEL_ERROR, IPOIB_DBG_ERROR,\r
+                               ("Failed to query IP options buffer address.\n") );\r
+                       return NDIS_STATUS_FAILURE;\r
+               }\r
+               cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );\r
+               if( p_options && options_len )\r
+               { \r
+                       cl_memcpy( &p_buf[sizeof(ip_hdr_t)], p_options, options_len );\r
+               }\r
+               wr_size = buf_len + options_len;\r
+               sgl_idx++;\r
+       }\r
+       else\r
+       {       /*options probably in the same buffer */\r
+               cl_memcpy( p_buf, p_ip_hdr, buf_len );\r
+               options_len = ip_hdr_len - sizeof( ip_hdr_t );\r
+               if( options_len )\r
+               {\r
+                       p_options = p_buf + sizeof( ip_hdr_t );\r
+               }\r
+               frag_offset += ( buf_len - ip_hdr_len );\r
+               wr_size = buf_len;\r
+       }\r
+       ++ds_idx;\r
+\r
+       p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );\r
+       p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+       p_desc->send_wr[wr_idx].local_ds[ds_idx].length = wr_size;\r
+       \r
+       /* count how much data can be put into the first WR beside IP header.\r
+        * other protocols headers possibly supplied in subsequent buffers.\r
+        */\r
+       for( sgl_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++ )\r
+       {\r
+               next_sge = p_sgl->Elements[sgl_idx].Length;\r
+\r
+               /* add sgl if it can fit into the same WR \r
+               * Note: so far not going to split large SGE between WRs,\r
+               * so first fragment could be a smaller size.\r
+               */\r
+               if( next_sge <= ( p_port->p_adapter->params.payload_mtu - wr_size ) )\r
+               {\r
+                       ++ds_idx;\r
+                       wr_size += next_sge;\r
+                       frag_offset += next_sge;\r
+                       p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = \r
+                                                                       p_sgl->Elements[sgl_idx].Address.QuadPart;\r
+                       p_desc->send_wr[wr_idx].local_ds[ds_idx].length = next_sge;\r
+                       p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+               }\r
+               else\r
+               {\r
+                       /* fix ip hdr for the first fragment and move on */\r
+                       __update_fragment_ip_hdr( (ip_hdr_t* const)p_buf,\r
+                               (uint16_t)wr_size, IP_FRAGMENT_OFFSET(p_ip_hdr), TRUE );\r
+\r
+                       p_desc->send_wr[wr_idx].wr.num_ds = ds_idx + 1;\r
+                       p_buf += ip_hdr_len;\r
+                       p_buf += (( buf_len > ip_hdr_len ) ? ( buf_len - ip_hdr_len ): 0);\r
+                       frag_offset += ( (IP_FRAGMENT_OFFSET(p_ip_hdr)) << 3 );\r
+                       ++wr_idx;\r
+                       ds_idx = 0;\r
+                       break;\r
+               }\r
+       }\r
+       total_ip_len -= wr_size;\r
+       wr_size = 0;\r
+\r
+       for( sgl_idx, wr_idx; sgl_idx < p_sgl->NumberOfElements; sgl_idx++ )\r
+       {\r
+               uint32_t        seg_len;\r
+               uint64_t        next_sgl_addr;\r
+               \r
+               if( wr_idx >= ( MAX_WRS_PER_MSG - 1 ) )\r
+                       return NDIS_STATUS_RESOURCES;\r
+               \r
+               next_sge = p_sgl->Elements[sgl_idx].Length;\r
+               next_sgl_addr = p_sgl->Elements[sgl_idx].Address.QuadPart;\r
+\r
+               while( next_sge )\r
+               {\r
+                       if( ds_idx == 0 )\r
+                       {       /* new ipoib + ip header */\r
+                               ((ipoib_hdr_t*)p_buf)->type = p_eth_hdr->type;\r
+                               ((ipoib_hdr_t*)p_buf)->resv = 0;\r
+                               p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );\r
+                               p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+                               p_desc->send_wr[wr_idx].local_ds[ds_idx].length = sizeof( ipoib_hdr_t );\r
+                               p_buf += sizeof( ipoib_hdr_t );\r
+                               ++ds_idx;\r
+\r
+                               cl_memcpy( p_buf, p_ip_hdr, sizeof( ip_hdr_t ) );\r
+                               if( p_options && options_len )\r
+                               {\r
+                                       /* copy ip options if needed */\r
+                                       __copy_ip_options( &p_buf[sizeof(ip_hdr_t)], \r
+                                                               p_options, options_len, FALSE );\r
+                               }\r
+                               wr_size = ip_hdr_len;\r
+                       }\r
+                       if( ds_idx == 1 )\r
+                       {\r
+                               p_desc->send_wr[wr_idx].local_ds[ds_idx].length = ip_hdr_len;\r
+                               p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = cl_get_physaddr( p_buf );\r
+                               p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+                               ++ds_idx;\r
+                       }\r
+\r
+                       seg_len = ( next_sge > ( p_port->p_adapter->params.payload_mtu - wr_size ) )?\r
+                               ( p_port->p_adapter->params.payload_mtu - wr_size ) : next_sge;\r
+\r
+                       p_desc->send_wr[wr_idx].local_ds[ds_idx].vaddr = next_sgl_addr;\r
+                       p_desc->send_wr[wr_idx].local_ds[ds_idx].length = seg_len;\r
+                       p_desc->send_wr[wr_idx].local_ds[ds_idx].lkey = p_port->ib_mgr.lkey;\r
+                       ++ds_idx;\r
+                       \r
+                       wr_size += seg_len;\r
+                       total_ip_len -= seg_len;\r
+\r
+                       if( wr_size >= p_port->p_adapter->params.payload_mtu || total_ip_len == 0 )\r
+                       {       /* fix ip hdr for that fragment */\r
+                               __update_fragment_ip_hdr( (ip_hdr_t* const)p_buf, (uint16_t)wr_size,\r
+                                       ((uint16_t)(frag_offset >> 3 )), \r
+                                       (BOOLEAN)(( total_ip_len > 0 ) || IP_MORE_FRAGMENTS( p_ip_hdr)) );\r
+                               p_desc->send_wr[wr_idx].wr.num_ds = ds_idx;\r
+                               if( total_ip_len > 0 )\r
+                               {\r
+                                       ++wr_idx;\r
+                                       frag_offset += (wr_size - ip_hdr_len);\r
+                                       wr_size = 0;\r
+                                       ds_idx = 0;\r
+                                       p_buf += ip_hdr_len;\r
+                               }\r
+                       }\r
+                       next_sge -= seg_len;\r
+                       if( next_sge > 0 )\r
+                       {\r
+                               next_sgl_addr += seg_len;\r
+                       }\r
+               }\r
+       }\r
+       p_desc->num_wrs += wr_idx;\r
+       \r
+       IPOIB_EXIT( IPOIB_DBG_SEND );\r
+       return NDIS_STATUS_SUCCESS;\r
+}\r
+\r
+static void\r
+__update_fragment_ip_hdr(\r
+IN             ip_hdr_t* const         p_ip_hdr,\r
+IN             uint16_t                        fragment_size, \r
+IN             uint16_t                        fragment_offset, \r
+IN             BOOLEAN                         more_fragments )\r
+{\r
+\r
+       p_ip_hdr->length = cl_hton16( fragment_size ); // bytes\r
+       p_ip_hdr->offset = cl_hton16( fragment_offset ); // 8-byte units\r
+       if( more_fragments )\r
+       {\r
+               IP_SET_MORE_FRAGMENTS( p_ip_hdr );\r
+       }\r
+       else\r
+       {\r
+               IP_SET_LAST_FRAGMENT( p_ip_hdr );\r
+       }\r
+       p_ip_hdr->chksum = 0;\r
+       p_ip_hdr->chksum = ipchksum( (uint16_t*)p_ip_hdr, IP_HEADER_LENGTH(p_ip_hdr) );\r
+}\r
+\r
+static void\r
+__copy_ip_options(\r
+IN             uint8_t*        p_buf,\r
+IN             uint8_t*        p_options,\r
+IN             uint32_t        options_len,\r
+IN             BOOLEAN         copy_all )\r
+{\r
+       uint32_t        option_length;\r
+       uint32_t        total_length = 0;\r
+       uint32_t        copied_length = 0;\r
+       uint8_t*        p_src = p_options;\r
+       uint8_t*        p_dst = p_buf;\r
+\r
+       if( p_options == NULL || options_len == 0 )\r
+               return;\r
+       if( copy_all )\r
+       {\r
+               cl_memcpy( p_dst, p_src, options_len );\r
+               return;\r
+       }\r
+       do\r
+       {\r
+               if( ( *p_src ) == 0 ) // end of options list\r
+               {\r
+                       total_length++;\r
+                       break;\r
+               }\r
+               if( ( *p_src ) == 0x1 ) // no op\r
+               {\r
+                       p_src++;\r
+                       total_length++;\r
+                       continue;\r
+               }\r
+               /*from RFC791: \r
+               * This option may be used between options, for example, to align\r
+        * the beginning of a subsequent option on a 32 bit boundary.\r
+               */\r
+               if( copied_length && (copied_length % 4) )\r
+               {\r
+                       uint32_t align = 4 - (copied_length % 4);\r
+                       cl_memset( p_dst, 0x1, (size_t)align );\r
+                       p_dst += align;\r
+                       copied_length += align;\r
+               }\r
+               option_length = *(p_src + 1);\r
+\r
+               if( *p_src & 0x80 )\r
+               {\r
+                       cl_memcpy( p_dst, p_src, option_length );\r
+                       p_dst += option_length;\r
+                       copied_length += option_length;\r
+               }\r
+               total_length += option_length;\r
+               p_src += option_length;\r
+\r
+       }while( total_length < options_len );\r
+\r
+       CL_ASSERT( total_length == options_len );\r
+       CL_ASSERT( copied_length <= 40 );\r
+\r
+       /* padding the rest */\r
+       if( options_len > copied_length )\r
+       {\r
+               cl_memclr( p_dst, ( options_len - copied_length ) );\r
+       }\r
+       return;\r
+}\r
index cbdbd2d6049eec12eb64dea179f6d0e60b67c808..c9418c6735d12b7e1bd73db57292811cf043230f 100644 (file)
@@ -337,11 +337,9 @@ typedef struct _ipoib_cm_desc
        cl_list_item_t                          list_item;\r
        uint8_t*                                        p_alloc_buf;\r
        uint8_t*                                        p_buf;\r
-       NDIS_PHYSICAL_ADDRESS           phys_alloc_buf; \r
        uint32_t                                        alloc_buf_size;\r
        uint32_t                                        buf_size;\r
        net32_t                                         lkey;\r
-       net32_t                                         rkey;\r
        ib_mr_handle_t                          h_mr;\r
        NDIS_TCP_IP_CHECKSUM_PACKET_INFO        ndis_csum;\r
 \r
@@ -389,7 +387,17 @@ typedef struct _ipoib_recv_desc
 *      The pool item is always first to allow casting form a cl_pool_item_t or\r
 *      cl_list_item_t to the descriptor.\r
 *********/\r
+typedef struct __ipoib_send_wr\r
+{\r
+       ib_send_wr_t            wr;\r
+       ib_local_ds_t           local_ds[MAX_SEND_SGE]; /* Must be last. */\r
+} ipoib_send_wr_t;\r
 \r
+typedef enum __send_dir\r
+{\r
+       SEND_UD_QP = 1,\r
+       SEND_RC_QP = 2\r
+} send_dir_t;\r
 \r
 typedef struct _ipoib_send_desc\r
 {\r
@@ -397,9 +405,9 @@ typedef struct _ipoib_send_desc
        ipoib_endpt_t           *p_endpt;\r
        send_buf_t                      *p_buf;\r
        ib_qp_handle_t          send_qp;\r
-       ib_send_wr_t            wr;\r
-       ipoib_hdr_t                     pkt_hdr;\r
-       ib_local_ds_t           local_ds[MAX_SEND_SGE]; /* Must be last. */\r
+       send_dir_t                      send_dir;\r
+       uint32_t                        num_wrs;\r
+       ipoib_send_wr_t         send_wr[MAX_WRS_PER_MSG];\r
 \r
 }      ipoib_send_desc_t;\r
 /*\r
@@ -529,6 +537,8 @@ typedef struct _ipoib_port
        ipoib_recv_mgr_t                recv_mgr;\r
        ipoib_send_mgr_t                send_mgr;\r
 \r
+       KDPC                                    recv_dpc;\r
+\r
        ipoib_endpt_mgr_t               endpt_mgr;\r
 \r
        endpt_buf_mgr_t                 cm_buf_mgr;\r
@@ -625,10 +635,6 @@ ipoib_port_remove_endpt(
        IN                              ipoib_port_t* const                     p_port,\r
        IN              const   mac_addr_t                                      mac );\r
 \r
-void\r
-ipoib_port_flush_endpts(\r
-       IN                              ipoib_port_t* const                     p_port );\r
-\r
 void\r
 ipoib_port_send(\r
        IN                              ipoib_port_t* const                     p_port,\r
index d2ee06bf4797abca8f7aa20c6c02abbbfb9aabe8..cff2e31edaeff5db74e8a8017cc9b22f719957a6 100644 (file)
@@ -82,6 +82,7 @@ typedef struct _ipoib_hw_addr
 #include <complib/cl_packoff.h>\r
 \r
 \r
+\r
 #ifdef __cplusplus\r
 extern "C"\r
 {\r
@@ -239,49 +240,53 @@ ipoib_mac_from_mlx_guid(
        \r
        return IB_SUCCESS;\r
 }\r
+/*\r
+* PARAMETERS\r
+*      port_guid\r
+*              The port GUID, in network byte order, for which to generate a\r
+*              MAC address.\r
+*\r
+*      p_mac_addr\r
+*              Pointer to a mac address in which to store the results.\r
+*\r
+* RETURN VALUES\r
+*      IB_SUCCESS\r
+*              The MAC address was successfully converted.\r
+*\r
+*      IB_INVALID_GUID\r
+*              The port GUID provided was not a known GUID format.\r
+*\r
+*********/\r
 \r
-/****f* IPOIB/ipoib_mac_from_dell_guid\r
+\r
+/****f* IPOIB/ipoib_mac_from_voltaire_guid\r
 * NAME\r
-*      ipoib_mac_from_dell_guid\r
+*      ipoib_mac_from_voltaire_guid\r
 *\r
 * DESCRIPTION\r
-*      Generates an ethernet MAC address given a DELL port GUID.\r
+*      Generates an ethernet MAC address given a Voltaire port GUID.\r
 *\r
 * SYNOPSIS\r
 */\r
 static inline ib_api_status_t\r
-ipoib_mac_from_dell_guid(\r
+ipoib_mac_from_voltaire_guid(\r
        IN              const   net64_t                                         port_guid,\r
                OUT                     mac_addr_t* const                       p_mac_addr )\r
 {\r
        const uint8_t   *p_guid = (const uint8_t*)&port_guid;\r
 \r
        /* Port guid is in network byte order.  OUI is in lower 3 bytes. */\r
-       ASSERT( p_guid[0] == 0x00 && p_guid[1] == 0x18 && p_guid[2] == 0x8b );\r
-       \r
+       ASSERT( p_guid[0] == 0x00 && p_guid[1] == 0x08 && p_guid[2] == 0xf1 );\r
+\r
        p_mac_addr->addr[0] = p_guid[0];\r
        p_mac_addr->addr[1] = p_guid[1];\r
        p_mac_addr->addr[2] = p_guid[2];\r
-       p_mac_addr->addr[3] = p_guid[5];\r
-       p_mac_addr->addr[4] = p_guid[6];\r
-       p_mac_addr->addr[5] = p_guid[7];\r
-       \r
+       p_mac_addr->addr[3] = p_guid[4] ^ p_guid[6];\r
+       p_mac_addr->addr[4] = p_guid[5] ^ p_guid[7];\r
+       p_mac_addr->addr[5] = p_guid[5] + p_guid[6] + p_guid[7];\r
+\r
        return IB_SUCCESS;\r
 }\r
-/*\r
-* PARAMETERS\r
-*      port_guid\r
-*              The port GUID, in network byte order, for which to generate a\r
-*              MAC address.\r
-*\r
-*      p_mac_addr\r
-*              Pointer to a mac address in which to store the results.\r
-*\r
-* RETURN VALUES\r
-*      IB_SUCCESS\r
-*              The MAC address was successfully converted.\r
-*\r
-*********/\r
 \r
 \r
 /****f* IPOIB/ipoib_mac_from_guid_mask\r
@@ -325,7 +330,6 @@ ipoib_mac_from_guid_mask(
 \r
        return IB_SUCCESS;\r
 }\r
-\r
 /*\r
 * PARAMETERS\r
 *      port_guid\r
@@ -352,36 +356,6 @@ ipoib_mac_from_guid_mask(
 *********/\r
 \r
 \r
-/****f* IPOIB/ipoib_mac_from_voltaire_guid\r
-* NAME\r
-*      ipoib_mac_from_voltaire_guid\r
-*\r
-* DESCRIPTION\r
-*      Generates an ethernet MAC address given a Voltaire port GUID.\r
-*\r
-* SYNOPSIS\r
-*/\r
-static inline ib_api_status_t\r
-ipoib_mac_from_voltaire_guid(\r
-       IN              const   net64_t                                         port_guid,\r
-               OUT                     mac_addr_t* const                       p_mac_addr )\r
-{\r
-       const uint8_t   *p_guid = (const uint8_t*)&port_guid;\r
-\r
-       /* Port guid is in network byte order.  OUI is in lower 3 bytes. */\r
-       ASSERT( p_guid[0] == 0x00 && p_guid[1] == 0x08 && p_guid[2] == 0xf1 );\r
-\r
-       p_mac_addr->addr[0] = p_guid[0];\r
-       p_mac_addr->addr[1] = p_guid[1];\r
-       p_mac_addr->addr[2] = p_guid[2];\r
-       p_mac_addr->addr[3] = p_guid[4] ^ p_guid[6];\r
-       p_mac_addr->addr[4] = p_guid[5] ^ p_guid[7];\r
-       p_mac_addr->addr[5] = p_guid[5] + p_guid[6] + p_guid[7];\r
-\r
-       return IB_SUCCESS;\r
-}\r
-\r
-\r
 /****f* IPOIB/ipoib_mac_from_guid\r
 * NAME\r
 *      ipoib_mac_from_guid\r
@@ -429,7 +403,8 @@ ipoib_mac_from_guid(
                        status = ipoib_mac_from_sst_guid( port_guid, p_mac_addr );\r
                }\r
                else if( p_guid[1] == 0x1a && p_guid[2] == 0x4b ||\r
-                                p_guid[1] == 0x17 && p_guid[2] == 0x08 )\r
+                                p_guid[1] == 0x17 && p_guid[2] == 0x08 ||\r
+                                p_guid[1] == 0x1e && p_guid[2] == 0x0b )\r
                {\r
                        //HP GUID\r
                        status =ipoib_mac_from_guid_mask( p_guid, guid_default_mask, p_mac_addr );\r
@@ -486,143 +461,6 @@ ipoib_mac_from_guid(
 *********/\r
 \r
 \r
-/****f* IPOIB/ipoib_sst_guid_from_mac\r
-* NAME\r
-*      ipoib_sst_guid_from_mac\r
-*\r
-* DESCRIPTION\r
-*      Generates a port GUID given an ethernet MAC address.\r
-*\r
-* SYNOPSIS\r
-*/\r
-static inline ib_api_status_t\r
-ipoib_sst_guid_from_mac(\r
-       IN              const   mac_addr_t                                      mac,\r
-               OUT                     net64_t* const                          p_port_guid )\r
-{\r
-       uint8_t         *p_guid = (uint8_t*)p_port_guid;\r
-       uint32_t        low24;\r
-\r
-       /* MAC address is in network byte order.  OUI is in lower 3 bytes. */\r
-       if( mac.addr[0] != 0x00 || \r
-               mac.addr[1] != 0x06 || \r
-               mac.addr[2] != 0x6a )\r
-       {\r
-               return IB_INVALID_GUID;\r
-       }\r
-\r
-       low24 = mac.addr[3] << 16 || mac.addr[4] << 8 || mac.addr[5];\r
-\r
-       low24 = 0x00FFF000 - low24;\r
-       /* Divide by two */\r
-       low24 >>= 1;\r
-       /* Add the serial number base offset. */\r
-       low24 += 0x101;\r
-\r
-       /* OUI */\r
-       p_guid[0] = mac.addr[0];\r
-       p_guid[1] = mac.addr[1];\r
-       p_guid[2] = mac.addr[2];\r
-       /* Port number */\r
-       p_guid[3] = mac.addr[5] & 0x01;\r
-       /* Type */\r
-       p_guid[4] = 0x98;\r
-       /* Serial Number */\r
-       p_guid[5] = (uint8_t)(low24 >> 16);\r
-       p_guid[6] = (uint8_t)(low24 >> 8);\r
-       p_guid[7] = (uint8_t)low24;\r
-       \r
-       return IB_SUCCESS;\r
-}\r
-/*\r
-* PARAMETERS\r
-*      port_guid\r
-*              The port GUID, in network byte order, for which to generate a\r
-*              MAC address.\r
-*\r
-*      p_mac_addr\r
-*              Pointer to a mac address in which to store the results.\r
-*\r
-* RETURN VALUES\r
-*      IB_SUCCESS\r
-*              The MAC address was successfully converted.\r
-*\r
-*      IB_INVALID_GUID\r
-*              The port GUID provided was not a known GUID format.\r
-*\r
-* NOTES\r
-*      The algorithm to convert portGuid to MAC address is as per DN0074, and\r
-*      assumes a 2 port HCA.\r
-*\r
-* SEE ALSO\r
-*      IPOIB\r
-*********/\r
-\r
-\r
-/****f* IPOIB/ipoib_mlx_guid_from_mac\r
-* NAME\r
-*      ipoib_mlx_guid_from_mac\r
-*\r
-* DESCRIPTION\r
-*      Generates a port GUID given an ethernet MAC address.\r
-*\r
-* SYNOPSIS\r
-*/\r
-static inline ib_api_status_t\r
-ipoib_mlx_guid_from_mac(\r
-       IN              const   mac_addr_t                                      mac,\r
-               OUT                     net64_t* const                          p_port_guid )\r
-{\r
-       uint8_t         *p_guid = (uint8_t*)p_port_guid;\r
-       uint32_t        low24;\r
-\r
-       /* MAC address is in network byte order.  OUI is in lower 3 bytes. */\r
-       if( mac.addr[0] != 0x00 || \r
-               mac.addr[1] != 0x02 || \r
-               mac.addr[2] != 0xc9 )\r
-       {\r
-               return IB_INVALID_GUID;\r
-       }\r
-\r
-       low24 = mac.addr[3] << 16 || mac.addr[4] << 8 || mac.addr[5];\r
-\r
-       /* OUI */\r
-       p_guid[0] = mac.addr[0];\r
-       p_guid[1] = mac.addr[1];\r
-       p_guid[2] = mac.addr[2];\r
-       p_guid[3] = 0x02;\r
-       p_guid[4] = 0x00;\r
-       /* Serial Number */\r
-       p_guid[5] = (uint8_t)(low24 >> 16);\r
-       p_guid[6] = (uint8_t)(low24 >> 8);\r
-       p_guid[7] = (uint8_t)low24;\r
-       \r
-       return IB_SUCCESS;\r
-}\r
-/*\r
-* PARAMETERS\r
-*      port_guid\r
-*              The port GUID, in network byte order, for which to generate a\r
-*              MAC address.\r
-*\r
-*      p_mac_addr\r
-*              Pointer to a mac address in which to store the results.\r
-*\r
-* RETURN VALUES\r
-*      IB_SUCCESS\r
-*              The MAC address was successfully converted.\r
-*\r
-*      IB_INVALID_GUID\r
-*              The port GUID provided was not a known GUID format.\r
-*\r
-* NOTES\r
-*      The algorithm to convert portGuid to MAC address is as \r
-*\r
-* SEE ALSO\r
-*      IPOIB\r
-*********/\r
-\r
-\r
 /****f* IPOIB/ipoib_is_voltaire_router_gid\r
 * NAME\r
 *      ipoib_is_voltaire_router_gid\r
index 8125bb69484f655627320b0bb5e5927a9edf881b..4f29f500780f2c5ff8dd40ca60e7f5f081fbdeea 100644 (file)
@@ -15,4 +15,3 @@ STAMP=stampinf -a $(_BUILDARCH)
 $(INF_TARGET) : $(_INX)\$(INF_NAME).inx\r
     copy $(_INX)\$(@B).inx $@\r
     $(STAMP) -f $@ -d * -v $(IB_MAJORVERSION).$(IB_MINORVERSION).$(IB_BUILDVERSION).$(OPENIB_REV)\r
-\r
index 3453ac0e8653fc0c9a577ebf80baf3773e1d5466..9abf12760caff4eede56264ba66dcd8cff2bc075 100644 (file)
@@ -7,7 +7,7 @@ Signature   = "$Windows NT$"
 Class       = Net\r
 ClassGUID   = {4d36e972-e325-11ce-bfc1-08002be10318}\r
 Provider    = %OPENIB%\r
-DriverVer=09/09/2008,2.0.0000.1576\r
+DriverVer=10/10/2008,2.0.0000.1630\r
 CatalogFile=ipoib.cat\r
 \r
 [Manufacturer]\r
@@ -21,12 +21,15 @@ ExcludeFromSelect = IBA\IPoIB
 \r
 [OPENIB.ntx86]\r
 %IpoibDesc%      = Ipoib.DDInstall,    IBA\IPoIB   ; Internet Protocol over InfiniBand Adapter\r
+%IpoibDescP%     = Ipoib.DDInstall,    IBA\IPoIBP  ; Internet Protocol over InfiniBand Adapter with partition key\r
 \r
 [OPENIB.ntamd64]\r
 %IpoibDesc%      = Ipoib.DDInstall,    IBA\IPoIB   ; Internet Protocol over InfiniBand Adapter\r
+%IpoibDescP%     = Ipoib.DDInstall,    IBA\IPoIBP  ; Internet Protocol over InfiniBand Adapter with partition key\r
 \r
 [OPENIB.ntia64]\r
 %IpoibDesc%      = Ipoib.DDInstall,    IBA\IPoIB   ; Internet Protocol over InfiniBand Adapter\r
+%IpoibDescP%     = Ipoib.DDInstall,    IBA\IPoIBP  ; Internet Protocol over InfiniBand Adapter with partition key\r
 \r
 [Ipoib.DDInstall.ntx86]\r
 Characteristics = 0x81 ; NCF_HAS_UI | NCF_VIRTUAL\r
@@ -63,7 +66,7 @@ HKR, Ndi,                       Service,    0, "ipoib"
 HKR, Ndi\Interfaces,            UpperRange, 0, "ndis5"\r
 HKR, Ndi\Interfaces,            LowerRange, 0, "ethernet"\r
 \r
-HKR, Ndi\Params\RqDepth,               ParamDesc,      0, "Receive Queue Depth"\r
+HKR, Ndi\Params\RqDepth,               ParamDesc,      0, %RQ_DEPTH_STR%\r
 HKR, Ndi\Params\RqDepth,               Type,           0, "dword"\r
 HKR, Ndi\Params\RqDepth,               Default,        0, "512"\r
 HKR, Ndi\Params\RqDepth,               Optional,       0, "0"\r
@@ -71,7 +74,7 @@ HKR, Ndi\Params\RqDepth,              Min,            0, "128"
 HKR, Ndi\Params\RqDepth,               Max,            0, "1024"\r
 HKR, Ndi\Params\RqDepth,               Step,           0, "128"\r
 \r
-HKR, Ndi\Params\RqLowWatermark,        ParamDesc,      0, "Receive Queue Low Watermark"\r
+HKR, Ndi\Params\RqLowWatermark,        ParamDesc,      0, %RQ_WATERMARK_STR%\r
 HKR, Ndi\Params\RqLowWatermark,        Type,           0, "dword"\r
 HKR, Ndi\Params\RqLowWatermark,        Default,        0, "4"\r
 HKR, Ndi\Params\RqLowWatermark,        Optional,       0, "0"\r
@@ -79,7 +82,7 @@ HKR, Ndi\Params\RqLowWatermark,       Min,            0, "2"
 HKR, Ndi\Params\RqLowWatermark,        Max,            0, "8"\r
 HKR, Ndi\Params\RqLowWatermark,        Step,           0, "1"\r
 \r
-HKR, Ndi\Params\SqDepth,               ParamDesc,      0, "Send Queue Depth"\r
+HKR, Ndi\Params\SqDepth,               ParamDesc,      0, %SQ_DEPTH_STR%\r
 HKR, Ndi\Params\SqDepth,               Type,           0, "dword"\r
 HKR, Ndi\Params\SqDepth,               Default,        0, "512"\r
 HKR, Ndi\Params\SqDepth,               Optional,       0, "0"\r
@@ -87,63 +90,84 @@ HKR, Ndi\Params\SqDepth,            Min,            0, "128"
 HKR, Ndi\Params\SqDepth,               Max,            0, "1024"\r
 HKR, Ndi\Params\SqDepth,               Step,           0, "128"\r
 \r
-HKR, Ndi\Params\SendChksum,            ParamDesc,      0, "Send Checksum Offload"\r
+HKR, Ndi\Params\SendChksum,            ParamDesc,      0, %SQ_CSUM_STR%\r
 HKR, Ndi\Params\SendChksum,            Type,           0, "enum"\r
 HKR, Ndi\Params\SendChksum,            Default,        0, "1"\r
 HKR, Ndi\Params\SendChksum,            Optional,       0, "0"\r
-HKR, Ndi\Params\SendChksum\enum,       "0",    0, "Disabled"\r
-HKR, Ndi\Params\SendChksum\enum,       "1",    0, "Enabled (if supported by HW)"\r
-HKR, Ndi\Params\SendChksum\enum,       "2",    0, "Bypass"\r
+HKR, Ndi\Params\SendChksum\enum,       "0",    0, %DISABLED_STR%\r
+HKR, Ndi\Params\SendChksum\enum,       "1",    0, %ENABLED_IF_STR%\r
+HKR, Ndi\Params\SendChksum\enum,       "2",    0, %BYPASS_STR%\r
 \r
-HKR, Ndi\Params\RecvChksum,            ParamDesc,      0, "Recv Checksum Offload"\r
+HKR, Ndi\Params\RecvChksum,            ParamDesc,      0, %RQ_CSUM_STR%\r
 HKR, Ndi\Params\RecvChksum,            Type,           0, "enum"\r
 HKR, Ndi\Params\RecvChksum,            Default,        0, "1"\r
 HKR, Ndi\Params\RecvChksum,            Optional,       0, "0"\r
-HKR, Ndi\Params\RecvChksum\enum,       "0",    0, "Disabled"\r
-HKR, Ndi\Params\RecvChksum\enum,       "1",    0, "Enabled (if supported by HW)"\r
-HKR, Ndi\Params\RecvChksum\enum,       "2",    0, "Bypass"\r
+HKR, Ndi\Params\RecvChksum\enum,       "0",    0, %DISABLED_STR%\r
+HKR, Ndi\Params\RecvChksum\enum,       "1",    0, %ENABLED_IF_STR%\r
+HKR, Ndi\Params\RecvChksum\enum,       "2",    0, %BYPASS_STR%\r
 \r
-HKR, Ndi\Params\lso,           ParamDesc,      0, "Large Send Offload"\r
+HKR, Ndi\Params\lso,           ParamDesc,      0, %LSO_STR%\r
 HKR, Ndi\Params\lso,           Type,           0, "enum"\r
 HKR, Ndi\Params\lso,           Default,        0, "0"\r
 HKR, Ndi\Params\lso,           Optional,       0, "0"\r
-HKR, Ndi\Params\lso\enum,      "0",    0, "Disabled"\r
-HKR, Ndi\Params\lso\enum,      "1",    0, "Enabled"\r
+HKR, Ndi\Params\lso\enum,      "0",    0, %DISABLED_STR%\r
+HKR, Ndi\Params\lso\enum,      "1",    0, %ENABLED_STR%\r
 \r
 \r
-HKR, Ndi\Params\SaTimeout,             ParamDesc,      0, "SA Query Timeout (ms)"\r
+HKR, Ndi\Params\SaTimeout,             ParamDesc,      0, %SA_QUERY_TO_STR%\r
 HKR, Ndi\Params\SaTimeout,             Type,           0, "dword"\r
 HKR, Ndi\Params\SaTimeout,             Default,        0, "1000"\r
 HKR, Ndi\Params\SaTimeout,             Optional,       0, "0"\r
 HKR, Ndi\Params\SaTimeout,             Min,            0, "500"\r
 HKR, Ndi\Params\SaTimeout,             Step,           0, "250"\r
 \r
-HKR, Ndi\Params\SaRetries,             ParamDesc,      0, "SA Query Retry Count"\r
+HKR, Ndi\Params\SaRetries,             ParamDesc,      0, %SA_QUERY_RETRY_STR%\r
 HKR, Ndi\Params\SaRetries,             Type,           0, "dword"\r
 HKR, Ndi\Params\SaRetries,             Default,        0, "10"\r
 HKR, Ndi\Params\SaRetries,             Optional,       0, "0"\r
 HKR, Ndi\Params\SaRetries,             Min,            0, "1"\r
 \r
-HKR, Ndi\Params\RecvRatio,             ParamDesc,      0, "Receive Pool Ratio"\r
+HKR, Ndi\Params\RecvRatio,             ParamDesc,      0, %RECV_RATIO_STR%\r
 HKR, Ndi\Params\RecvRatio,             Type,           0, "dword"\r
 HKR, Ndi\Params\RecvRatio,             Default,        0, "1"\r
 HKR, Ndi\Params\RecvRatio,             Optional,       0, "0"\r
 HKR, Ndi\Params\RecvRatio,             Min,            0, "1"\r
 HKR, Ndi\Params\RecvRatio,             Max,            0, "10"\r
 \r
-HKR, Ndi\Params\PayloadMtu,            ParamDesc,      0, "Payload Mtu size"\r
+HKR, Ndi\Params\PayloadMtu,            ParamDesc,      0, %MTU_STR%\r
 HKR, Ndi\Params\PayloadMtu,            Type,           0, "dword"\r
 HKR, Ndi\Params\PayloadMtu,            Default,        0, "2044"\r
-HKR, Ndi\Params\PayloadMtu,            Min,            0, "60"\r
-HKR, Ndi\Params\PayloadMtu,            Max,            0, "4092"\r
+HKR, Ndi\Params\PayloadMtu,            Min,            0, "512"\r
+HKR, Ndi\Params\PayloadMtu,            Max,            0, "65520"\r
 \r
-HKR, Ndi\Params\MCLeaveRescan,         ParamDesc,      0, "MC leave rescan (sec)"\r
+HKR, Ndi\Params\MCLeaveRescan,         ParamDesc,      0, %MC_RESCAN_STR%\r
 HKR, Ndi\Params\MCLeaveRescan,         Type,           0, "dword"\r
 HKR, Ndi\Params\MCLeaveRescan,         Default,        0, "260"\r
 HKR, Ndi\Params\MCLeaveRescan,         Optional,       0, "0"\r
 HKR, Ndi\Params\MCLeaveRescan,         Min,            0, "1"\r
 HKR, Ndi\Params\MCLeaveRescan,         Max,            0, "3600"\r
 \r
+HKR, Ndi\Params\GUIDMask,              ParamDesc,      0, %GUID_MASK_STR%\r
+HKR, Ndi\Params\GUIDMask,              Type,           0, "dword"\r
+HKR, Ndi\Params\GUIDMask,              Default,        0, "0"\r
+HKR, Ndi\Params\GUIDMask,              Optional,       0, "0"\r
+HKR, Ndi\Params\GUIDMask,              Min,            0, "0"\r
+HKR, Ndi\Params\GUIDMask,              Max,            0, "252"\r
+\r
+HKR, Ndi\Params\BCJoinRetry,           ParamDesc,      0, %BC_JOIN_RETRY_STR%\r
+HKR, Ndi\Params\BCJoinRetry,           Type,           0, "dword"\r
+HKR, Ndi\Params\BCJoinRetry,           Default,        0, "50"\r
+HKR, Ndi\Params\BCJoinRetry,           Optional,       0, "0"\r
+HKR, Ndi\Params\BCJoinRetry,           Min,            0, "0"\r
+HKR, Ndi\Params\BCJoinRetry,           Max,            0, "1000"\r
+\r
+HKR, Ndi\Params\CmEnabled,             ParamDesc,      0, %CONNECTED_MODE_STR%\r
+HKR, Ndi\Params\CmEnabled,             Type,           0, "enum"\r
+HKR, Ndi\Params\CmEnabled,             Default,        0, "0"\r
+HKR, Ndi\Params\CmEnabled,             Optional,       0, "0"\r
+HKR, Ndi\Params\CmEnabled\enum,        "0",    0,      %DISABLED_STR%\r
+HKR, Ndi\Params\CmEnabled\enum,        "1",    0,      %ENABLED_STR%\r
+\r
 [IpoibService]\r
 DisplayName     = %IpoibServiceDispName%\r
 ServiceType     = 1 ;%SERVICE_KERNEL_DRIVER%\r
@@ -226,3 +250,22 @@ DIRID_SYSTEM_X86     = 16425
 REG_DWORD            = 0x00010001\r
 REG_DWORD_NO_CLOBBER = 0x00010003\r
 \r
+RQ_DEPTH_STR           = "Receive Queue depth"\r
+RQ_WATERMARK_STR       = "Receive Queue Low Watermark"\r
+SQ_DEPTH_STR           = "Send Queue Depth"\r
+SQ_CSUM_STR            = "Send Checksum Offload"\r
+RQ_CSUM_STR            = "Recv Checksum Offload"\r
+LSO_STR                        = "Large Send Offload"\r
+SA_QUERY_TO_STR                = "SA Query Timeout (ms)"\r
+SA_QUERY_RETRY_STR     = "SA Query Retry Count"\r
+RECV_RATIO_STR         = "Receive Pool Ratio"\r
+MTU_STR                        = "Payload Mtu size"\r
+MC_RESCAN_STR          = "MC leave rescan (sec)"\r
+GUID_MASK_STR          = "GUID bitwise mask"\r
+BC_JOIN_RETRY_STR   = "Number of retries connecting to bc"\r
+\r
+ENABLED_IF_STR         = "Enabled (if supported by HW)"\r
+ENABLED_STR            = "Enabled"\r
+DISABLED_STR           = "Disabled"\r
+BYPASS_STR             = "Bypass"\r
+CONNECTED_MODE_STR     = "Connected mode"\r
index b47f1818780d1e8285cc959b179b5f51d1354d14..52caeb5a2fa62e3629a5fbc443099a3249f8b55e 100644 (file)
@@ -1,4 +1,4 @@
-; OpenIB Internet Protocol over InfiniBand Adapter\r
+; OpenFabrics Alliance Internet Protocol over InfiniBand Adapter\r
 ; Copyright 2005 SilverStorm Technologies all Rights Reserved.\r
 ; Copyright 2006 Mellanox Technologies all Rights Reserved.\r
 \r
@@ -7,7 +7,7 @@ Signature   = "$Windows NT$"
 Class       = Net\r
 ClassGUID   = {4d36e972-e325-11ce-bfc1-08002be10318}\r
 Provider    = %OPENIB%\r
-DriverVer=05/15/2008,1.1.0000.1177\r
+DriverVer=06/11/2008,1.0.0000.1207\r
 CatalogFile=ipoib.cat\r
 \r
 [Manufacturer]\r
@@ -21,32 +21,38 @@ ExcludeFromSelect = IBA\IPoIB
 \r
 [OPENIB.ntx86]\r
 %IpoibDesc%      = Ipoib.DDInstall,    IBA\IPoIB   ; Internet Protocol over InfiniBand Adapter\r
+%IpoibDescP%     = Ipoib.DDInstall,    IBA\IPoIBP  ; Internet Protocol over InfiniBand Adapter with partition key\r
 \r
 [OPENIB.ntamd64]\r
 %IpoibDesc%      = Ipoib.DDInstall,    IBA\IPoIB   ; Internet Protocol over InfiniBand Adapter\r
+%IpoibDescP%     = Ipoib.DDInstall,    IBA\IPoIBP  ; Internet Protocol over InfiniBand Adapter with partition key\r
 \r
 [OPENIB.ntia64]\r
 %IpoibDesc%      = Ipoib.DDInstall,    IBA\IPoIB   ; Internet Protocol over InfiniBand Adapter\r
+%IpoibDescP%     = Ipoib.DDInstall,    IBA\IPoIBP  ; Internet Protocol over InfiniBand Adapter with partition key\r
 \r
 [Ipoib.DDInstall.ntx86]\r
 Characteristics = 0x81 ; NCF_HAS_UI | NCF_VIRTUAL\r
 AddReg          = IpoibAddReg\r
 CopyFiles       = IpoibCopyFiles\r
-CopyFiles              = WsdCopyFiles\r
+CopyFiles       = WsdCopyFiles\r
+CopyFiles       = NdCopyFiles\r
 \r
 [Ipoib.DDInstall.ntamd64]\r
 Characteristics = 0x81 ; NCF_HAS_UI | NCF_VIRTUAL\r
 AddReg          = IpoibAddReg\r
 CopyFiles       = IpoibCopyFiles\r
-CopyFiles              = WsdCopyFiles\r
-CopyFiles              = WOW64CopyFiles\r
+CopyFiles       = WsdCopyFiles\r
+CopyFiles       = NdCopyFiles\r
+CopyFiles       = WOW64CopyFiles\r
 \r
 [Ipoib.DDInstall.ntia64]\r
 Characteristics = 0x81 ; NCF_HAS_UI | NCF_VIRTUAL\r
 AddReg          = IpoibAddReg\r
 CopyFiles       = IpoibCopyFiles\r
-CopyFiles              = WsdCopyFiles\r
-CopyFiles              = WOW64CopyFiles\r
+CopyFiles       = WsdCopyFiles\r
+CopyFiles       = NdCopyFiles\r
+CopyFiles       = WOW64CopyFiles\r
 \r
 [Ipoib.DDInstall.ntx86.Services]\r
 AddService = ipoib, 2, IpoibService, IpoibEventLog\r
@@ -58,11 +64,12 @@ AddService = ipoib, 2, IpoibService, IpoibEventLog
 AddService = ipoib, 2, IpoibService, IpoibEventLog\r
 \r
 [IpoibAddReg]\r
+HKR, ,RDMACapable, %REG_DWORD%, 1\r
 HKR, Ndi,                       Service,    0, "ipoib"\r
 HKR, Ndi\Interfaces,            UpperRange, 0, "ndis5"\r
 HKR, Ndi\Interfaces,            LowerRange, 0, "ethernet"\r
 \r
-HKR, Ndi\Params\RqDepth,               ParamDesc,      0, "Receive Queue Depth"\r
+HKR, Ndi\Params\RqDepth,               ParamDesc,      0, %RQ_DEPTH_STR%\r
 HKR, Ndi\Params\RqDepth,               Type,           0, "dword"\r
 HKR, Ndi\Params\RqDepth,               Default,        0, "512"\r
 HKR, Ndi\Params\RqDepth,               Optional,       0, "0"\r
@@ -70,15 +77,15 @@ HKR, Ndi\Params\RqDepth,            Min,            0, "128"
 HKR, Ndi\Params\RqDepth,               Max,            0, "1024"\r
 HKR, Ndi\Params\RqDepth,               Step,           0, "128"\r
 \r
-HKR, Ndi\Params\RqLowWatermark,        ParamDesc,      0, "Receive Queue Low Watermark"\r
+HKR, Ndi\Params\RqLowWatermark,        ParamDesc,      0, %RQ_WATERMARK_STR%\r
 HKR, Ndi\Params\RqLowWatermark,        Type,           0, "dword"\r
 HKR, Ndi\Params\RqLowWatermark,        Default,        0, "4"\r
-HKR, Ndi\Params\RqLowWatermark,        Optional,       0, "1"\r
+HKR, Ndi\Params\RqLowWatermark,        Optional,       0, "0"\r
 HKR, Ndi\Params\RqLowWatermark,        Min,            0, "2"\r
 HKR, Ndi\Params\RqLowWatermark,        Max,            0, "8"\r
 HKR, Ndi\Params\RqLowWatermark,        Step,           0, "1"\r
 \r
-HKR, Ndi\Params\SqDepth,               ParamDesc,      0, "Send Queue Depth"\r
+HKR, Ndi\Params\SqDepth,               ParamDesc,      0, %SQ_DEPTH_STR%\r
 HKR, Ndi\Params\SqDepth,               Type,           0, "dword"\r
 HKR, Ndi\Params\SqDepth,               Default,        0, "512"\r
 HKR, Ndi\Params\SqDepth,               Optional,       0, "0"\r
@@ -86,61 +93,83 @@ HKR, Ndi\Params\SqDepth,            Min,            0, "128"
 HKR, Ndi\Params\SqDepth,               Max,            0, "1024"\r
 HKR, Ndi\Params\SqDepth,               Step,           0, "128"\r
 \r
-HKR, Ndi\Params\SendChksum,            ParamDesc,      0, "Send Checksum Offload"\r
+HKR, Ndi\Params\SendChksum,            ParamDesc,      0, %SQ_CSUM_STR%\r
 HKR, Ndi\Params\SendChksum,            Type,           0, "enum"\r
 HKR, Ndi\Params\SendChksum,            Default,        0, "1"\r
 HKR, Ndi\Params\SendChksum,            Optional,       0, "0"\r
-HKR, Ndi\Params\SendChksum\enum,       "0",    0, "Disabled"\r
-HKR, Ndi\Params\SendChksum\enum,       "1",    0, "Enabled (if supported by HW)"\r
-HKR, Ndi\Params\SendChksum\enum,       "2",    0, "Bypass"\r
+HKR, Ndi\Params\SendChksum\enum,       "0",    0, %DISABLED_STR%\r
+HKR, Ndi\Params\SendChksum\enum,       "1",    0, %ENABLED_IF_STR%\r
+HKR, Ndi\Params\SendChksum\enum,       "2",    0, %BYPASS_STR%\r
 \r
-HKR, Ndi\Params\RecvChksum,            ParamDesc,      0, "Recv Checksum Offload"\r
+HKR, Ndi\Params\RecvChksum,            ParamDesc,      0, %RQ_CSUM_STR%\r
 HKR, Ndi\Params\RecvChksum,            Type,           0, "enum"\r
 HKR, Ndi\Params\RecvChksum,            Default,        0, "1"\r
 HKR, Ndi\Params\RecvChksum,            Optional,       0, "0"\r
-HKR, Ndi\Params\RecvChksum\enum,       "0",    0, "Disabled"\r
-HKR, Ndi\Params\RecvChksum\enum,       "1",    0, "Enabled (if supported by HW)"\r
-HKR, Ndi\Params\RecvChksum\enum,       "2",    0, "Bypass"\r
+HKR, Ndi\Params\RecvChksum\enum,       "0",    0, %DISABLED_STR%\r
+HKR, Ndi\Params\RecvChksum\enum,       "1",    0, %ENABLED_IF_STR%\r
+HKR, Ndi\Params\RecvChksum\enum,       "2",    0, %BYPASS_STR%\r
 \r
-HKR, Ndi\Params\lso,           ParamDesc,      0, "Large Send Offload"\r
+HKR, Ndi\Params\lso,           ParamDesc,      0, %LSO_STR%\r
 HKR, Ndi\Params\lso,           Type,           0, "enum"\r
 HKR, Ndi\Params\lso,           Default,        0, "0"\r
 HKR, Ndi\Params\lso,           Optional,       0, "0"\r
-HKR, Ndi\Params\lso\enum,      "0",    0, "Disabled"\r
-HKR, Ndi\Params\lso\enum,      "1",    0, "Enabled"\r
+HKR, Ndi\Params\lso\enum,      "0",    0, %DISABLED_STR%\r
+HKR, Ndi\Params\lso\enum,      "1",    0, %ENABLED_STR%\r
 \r
-HKR, Ndi\Params\SaTimeout,             ParamDesc,      0, "SA Query Timeout (ms)"\r
+\r
+HKR, Ndi\Params\SaTimeout,             ParamDesc,      0, %SA_QUERY_TO_STR%\r
 HKR, Ndi\Params\SaTimeout,             Type,           0, "dword"\r
 HKR, Ndi\Params\SaTimeout,             Default,        0, "1000"\r
 HKR, Ndi\Params\SaTimeout,             Optional,       0, "0"\r
 HKR, Ndi\Params\SaTimeout,             Min,            0, "500"\r
 HKR, Ndi\Params\SaTimeout,             Step,           0, "250"\r
 \r
-HKR, Ndi\Params\SaRetries,             ParamDesc,      0, "SA Query Retry Count"\r
+HKR, Ndi\Params\SaRetries,             ParamDesc,      0, %SA_QUERY_RETRY_STR%\r
 HKR, Ndi\Params\SaRetries,             Type,           0, "dword"\r
 HKR, Ndi\Params\SaRetries,             Default,        0, "10"\r
 HKR, Ndi\Params\SaRetries,             Optional,       0, "0"\r
 HKR, Ndi\Params\SaRetries,             Min,            0, "1"\r
 \r
-HKR, Ndi\Params\RecvRatio,             ParamDesc,      0, "Receive Pool Ratio"\r
+HKR, Ndi\Params\RecvRatio,             ParamDesc,      0, %RECV_RATIO_STR%\r
 HKR, Ndi\Params\RecvRatio,             Type,           0, "dword"\r
 HKR, Ndi\Params\RecvRatio,             Default,        0, "1"\r
 HKR, Ndi\Params\RecvRatio,             Optional,       0, "0"\r
 HKR, Ndi\Params\RecvRatio,             Min,            0, "1"\r
 HKR, Ndi\Params\RecvRatio,             Max,            0, "10"\r
 \r
-HKR, Ndi\Params\PayloadMtu,            ParamDesc,      0, "Payload Mtu size"\r
+HKR, Ndi\Params\PayloadMtu,            ParamDesc,      0, %MTU_STR%\r
 HKR, Ndi\Params\PayloadMtu,            Type,           0, "dword"\r
 HKR, Ndi\Params\PayloadMtu,            Default,        0, "2044"\r
-HKR, Ndi\Params\PayloadMtu,            Min,            0, "60"\r
+HKR, Ndi\Params\PayloadMtu,            Min,            0, "512"\r
 HKR, Ndi\Params\PayloadMtu,            Max,            0, "65520"\r
 \r
-HKR, Ndi\Params\CmEnabled,             ParamDesc,      0, "Connected Mode"\r
+HKR, Ndi\Params\MCLeaveRescan,         ParamDesc,      0, %MC_RESCAN_STR%\r
+HKR, Ndi\Params\MCLeaveRescan,         Type,           0, "dword"\r
+HKR, Ndi\Params\MCLeaveRescan,         Default,        0, "260"\r
+HKR, Ndi\Params\MCLeaveRescan,         Optional,       0, "0"\r
+HKR, Ndi\Params\MCLeaveRescan,         Min,            0, "1"\r
+HKR, Ndi\Params\MCLeaveRescan,         Max,            0, "3600"\r
+\r
+HKR, Ndi\Params\GUIDMask,              ParamDesc,      0, %GUID_MASK_STR%\r
+HKR, Ndi\Params\GUIDMask,              Type,           0, "dword"\r
+HKR, Ndi\Params\GUIDMask,              Default,        0, "0"\r
+HKR, Ndi\Params\GUIDMask,              Optional,       0, "0"\r
+HKR, Ndi\Params\GUIDMask,              Min,            0, "0"\r
+HKR, Ndi\Params\GUIDMask,              Max,            0, "252"\r
+\r
+HKR, Ndi\Params\BCJoinRetry,           ParamDesc,      0, %BC_JOIN_RETRY_STR%\r
+HKR, Ndi\Params\BCJoinRetry,           Type,           0, "dword"\r
+HKR, Ndi\Params\BCJoinRetry,           Default,        0, "50"\r
+HKR, Ndi\Params\BCJoinRetry,           Optional,       0, "0"\r
+HKR, Ndi\Params\BCJoinRetry,           Min,            0, "0"\r
+HKR, Ndi\Params\BCJoinRetry,           Max,            0, "1000"\r
+\r
+HKR, Ndi\Params\CmEnabled,             ParamDesc,      0, %CONNECTED_MODE_STR%\r
 HKR, Ndi\Params\CmEnabled,             Type,           0, "enum"\r
 HKR, Ndi\Params\CmEnabled,             Default,        0, "0"\r
 HKR, Ndi\Params\CmEnabled,             Optional,       0, "0"\r
-HKR, Ndi\Params\CmEnabled\enum,        "0",    0, "Disabled"\r
-HKR, Ndi\Params\CmEnabled\enum,        "1",    0, "Enabled"\r
+HKR, Ndi\Params\CmEnabled\enum,        "0",    0,      %DISABLED_STR%\r
+HKR, Ndi\Params\CmEnabled\enum,        "1",    0,      %ENABLED_STR%\r
 \r
 [IpoibService]\r
 DisplayName     = %IpoibServiceDispName%\r
@@ -170,8 +199,13 @@ ipoib.sys,,,2
 [WsdCopyFiles]\r
 ibwsd.dll,,,0x00000002\r
 \r
+[NdCopyFiles]\r
+ibndprov.dll,,,0x00000002\r
+ndinstall.exe,,,0x00000002\r
+\r
 [WOW64CopyFiles]\r
 ibwsd.dll,ibwsd32.dll,,0x00000002\r
+ibndprov.dll,ibndprov32.dll,,0x00000002\r
 \r
 [SourceDisksNames.x86]\r
 1 = %IcsDisk1%,,,""\r
@@ -185,29 +219,60 @@ ibwsd.dll,ibwsd32.dll,,0x00000002
 [SourceDisksFiles.x86]\r
 ipoib.sys = 1\r
 ibwsd.dll = 1\r
+ibndprov.dll = 1\r
+ndinstall.exe = 1\r
 \r
 [SourceDisksFiles.amd64]\r
 ipoib.sys = 1\r
 ibwsd.dll = 1\r
 ibwsd32.dll = 1\r
+ibndprov.dll = 1\r
+ibndprov32.dll = 1\r
+ndinstall.exe = 1\r
 \r
 [SourceDisksFiles.ia64]\r
 ipoib.sys = 1\r
 ibwsd.dll = 1\r
 ibwsd32.dll = 1\r
+ibndprov.dll = 1\r
+ibndprov32.dll = 1\r
+ndinstall.exe = 1\r
 \r
 [DestinationDirs]\r
 IpoibCopyFiles    = %DIRID_DRIVERS%\r
 WsdCopyFiles      = %DIRID_SYSTEM%\r
+NdCopyFiles       = %DIRID_SYSTEM%\r
 WOW64CopyFiles    = %DIRID_SYSTEM_X86%\r
 DefaultDestDir    = %DIRID_SYSTEM%\r
 \r
 [Strings]\r
-OPENIB               = "OpenIB Alliance"\r
-IpoibDesc            = "OpenIB IPoIB Adapter"\r
+OPENIB               = "OpenFabrics Alliance"\r
+IpoibDesc            = "OpenFabrics IPoIB Adapter"\r
+IpoibDescP           = "OpenFabrics IPoIB Adapter Partition"\r
 IpoibServiceDispName = "IPoIB"\r
-IcsDisk1             = "OpenIB IPoIB Disk #1"\r
+IcsDisk1             = "OpenFabrics IPoIB Disk #1"\r
 DIRID_SYSTEM         = 11\r
 DIRID_DRIVERS        = 12\r
 DIRID_SYSTEM_X86     = 16425\r
+REG_DWORD            = 0x00010001\r
 REG_DWORD_NO_CLOBBER = 0x00010003\r
+\r
+RQ_DEPTH_STR           = "Receive Queue depth"\r
+RQ_WATERMARK_STR       = "Receive Queue Low Watermark"\r
+SQ_DEPTH_STR           = "Send Queue Depth"\r
+SQ_CSUM_STR            = "Send Checksum Offload"\r
+RQ_CSUM_STR            = "Recv Checksum Offload"\r
+LSO_STR                        = "Large Send Offload"\r
+SA_QUERY_TO_STR                = "SA Query Timeout (ms)"\r
+SA_QUERY_RETRY_STR     = "SA Query Retry Count"\r
+RECV_RATIO_STR         = "Receive Pool Ratio"\r
+MTU_STR                        = "Payload Mtu size"\r
+MC_RESCAN_STR          = "MC leave rescan (sec)"\r
+GUID_MASK_STR          = "GUID bitwise mask"\r
+BC_JOIN_RETRY_STR   = "Number of retries connecting to bc"\r
+\r
+ENABLED_IF_STR         = "Enabled (if supported by HW)"\r
+ENABLED_STR            = "Enabled"\r
+DISABLED_STR           = "Disabled"\r
+BYPASS_STR             = "Bypass"\r
+CONNECTED_MODE_STR     = "Connected mode"
\ No newline at end of file