]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
- Fixed locking issue with resuming pended sends that could
authorftillier <ftillier@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Wed, 6 Jul 2005 19:19:26 +0000 (19:19 +0000)
committerftillier <ftillier@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Wed, 6 Jul 2005 19:19:26 +0000 (19:19 +0000)
result in QP overrun.
- Changed receive processing to silently drop all loopback traffic since
the driver reports itself as needing SW loopback (which is higher performing).
- Fixed bug where code assumed that a success result from the SA implied
non-zero records.  Code now checks the number of records in addition to status.
- Fixed initialization to perform PnP registration after flagging the device as
a deserialized miniport with NdisMSetAttributesEx to allow calling
NdisMSetInformation at DISPATCH level.  Without this, the driver causes an
assertion in checked versions of NDIS.sys.

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

branches/fab_cm_branch/ulp/ipoib/kernel/ipoib_adapter.c
branches/fab_cm_branch/ulp/ipoib/kernel/ipoib_adapter.h
branches/fab_cm_branch/ulp/ipoib/kernel/ipoib_driver.c
branches/fab_cm_branch/ulp/ipoib/kernel/ipoib_endpoint.c
branches/fab_cm_branch/ulp/ipoib/kernel/ipoib_port.c

index ccbd53ff99f8f2e5fc1e9962d687e5aac67e3ec7..276c8e02c6b7481f52712f1aa7e8aa833d3c3e68 100644 (file)
@@ -205,6 +205,21 @@ ipoib_create_adapter(
 }\r
 \r
 \r
+ib_api_status_t\r
+ipoib_start_adapter(\r
+       IN                              ipoib_adapter_t* const          p_adapter )\r
+{\r
+       ib_api_status_t status;\r
+\r
+       IPOIB_ENTER( IPOIB_DBG_INIT );\r
+\r
+       status = __ipoib_pnp_reg( p_adapter, IB_PNP_FLAG_REG_SYNC );\r
+\r
+       IPOIB_EXIT( IPOIB_DBG_INIT );\r
+       return status;\r
+}\r
+\r
+\r
 void\r
 ipoib_destroy_adapter(\r
        IN                              ipoib_adapter_t* const          p_adapter )\r
@@ -340,8 +355,6 @@ adapter_init(
                return status;\r
        }\r
 \r
-       status = __ipoib_pnp_reg( p_adapter, IB_PNP_FLAG_REG_SYNC );\r
-\r
        IPOIB_EXIT( IPOIB_DBG_INIT );\r
        return status;\r
 }\r
@@ -562,6 +575,9 @@ __ipoib_pnp_cb(
                case IB_PNP_PORT_ADD:\r
                        /* If we were initializing, we might have pended some OIDs. */\r
                        ipoib_resume_oids( p_adapter );\r
+                       NdisMIndicateStatus( p_adapter->h_adapter,\r
+                               NDIS_STATUS_MEDIA_DISCONNECT, NULL, 0 );\r
+                       NdisMIndicateStatusComplete( p_adapter->h_adapter );\r
                        break;\r
 \r
                default:\r
@@ -819,13 +835,17 @@ ipoib_set_active(
         * If we had a pending OID request for OID_GEN_LINK_SPEED,\r
         * complete it now.\r
         */\r
-       if( old_state == IB_PNP_PORT_ADD ||\r
-               old_state == IB_PNP_PORT_REMOVE )\r
+       switch( old_state )\r
        {\r
+       case IB_PNP_PORT_ADD:\r
+               ipoib_reg_addrs( p_adapter );\r
+               /* Fall through. */\r
+\r
+       case IB_PNP_PORT_REMOVE:\r
                ipoib_resume_oids( p_adapter );\r
-       }\r
-       else\r
-       {\r
+               break;\r
+\r
+       default:\r
                /* Join all programmed multicast groups. */\r
                for( i = 0; i < p_adapter->mcast_array_size; i++ )\r
                {\r
index 1d71c55c788c3b2d9f0e3a3e826684e241cf2d62..c82572cc238a04d24fbe76dd17719bc21ffdb44d 100644 (file)
@@ -303,6 +303,11 @@ ipoib_create_adapter(
        OUT             ipoib_adapter_t**  const        pp_adapter );\r
 \r
 \r
+ib_api_status_t\r
+ipoib_start_adapter(\r
+       IN                              ipoib_adapter_t* const          p_adapter );\r
+\r
+\r
 void\r
 ipoib_destroy_adapter(\r
        IN                              ipoib_adapter_t* const          p_adapter );\r
index 72cb514dc1e77579291af58538a7d45ca3bef476..bedeaf8bf026d52f3f9901eb55ace08aabf70e2a 100644 (file)
@@ -522,7 +522,6 @@ ipoib_initialize(
 \r
        *p_selected_medium_index = medium_index;\r
 \r
-\r
        /* Create the adapter adapter */\r
        ib_status = ipoib_create_adapter( wrapper_config_context, h_adapter, &p_adapter );\r
        if( ib_status != IB_SUCCESS )\r
@@ -550,6 +549,16 @@ ipoib_initialize(
        }\r
 #endif\r
 \r
+       /* Create the adapter adapter */\r
+       ib_status = ipoib_start_adapter( p_adapter );\r
+       if( ib_status != IB_SUCCESS )\r
+       {\r
+               ipoib_destroy_adapter( p_adapter );\r
+               IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR,\r
+                       ("ipoib_start_adapter returned status %d.\n", ib_status ) );\r
+               return NDIS_STATUS_FAILURE;\r
+       }\r
+\r
        IPOIB_EXIT( IPOIB_DBG_INIT );\r
        return status;\r
 }\r
index 90384d6e855e096c9c99370a5baeaa14559c77e9..5fe1c547809044dbad89adcb03a9ac663b72c3d1 100644 (file)
@@ -358,7 +358,7 @@ __path_query_cb(
        }\r
        cl_obj_unlock( &p_endpt->obj );\r
 \r
-       if( p_query_rec->status != IB_SUCCESS )\r
+       if( p_query_rec->status != IB_SUCCESS || !p_query_rec->result_cnt )\r
        {\r
                p_port->p_adapter->hung = TRUE;\r
                ipoib_endpt_deref( p_endpt );\r
index cbd5f9d7d405e03c7b03351ee3b30e575bfd0ca5..3589d410db7ee524b27b2e34dd3db4ccb282d217 100644 (file)
@@ -1754,6 +1754,20 @@ __recv_mgr_filter(
                p_eth = &p_desc->p_buf->eth.pkt;\r
 #endif /*IPOIB_INLINE_RECV */\r
 \r
+               /* Don't report loopback traffic - we requested SW loopback. */\r
+               if( !cl_memcmp( &p_port->p_adapter->mac, &p_eth->hdr.src,\r
+                       sizeof(p_port->p_adapter->mac) ) )\r
+               {\r
+                       /*\r
+                        * "This is not the packet you're looking for" - don't update\r
+                        * receive statistics, the packet never happened.\r
+                        */\r
+                       cl_qlist_insert_tail( p_bad_list, &p_desc->item.list_item );\r
+                       /* Dereference the port object on behalf of the failed receive. */\r
+                       cl_obj_deref( &p_port->obj );\r
+                       continue;\r
+               }\r
+\r
                switch( p_ipoib->hdr.type )\r
                {\r
                case ETH_PROT_TYPE_IP:\r
@@ -1921,6 +1935,8 @@ __recv_dhcp(
 \r
        IPOIB_ENTER( IPOIB_DBG_RECV );\r
 \r
+       UNUSED_PARAM( p_port );\r
+\r
        /* Create the ethernet header. */\r
        status = __recv_gen( p_ipoib, p_eth, p_src, p_dst );\r
        if( status != IB_SUCCESS )\r
@@ -1938,17 +1954,6 @@ __recv_dhcp(
                IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("Invalid DHCP op code.\n") );\r
                return IB_INVALID_SETTING;\r
        }\r
-       /* find a better way to check for echo packets ? */\r
-       if ( p_port->p_adapter->mac.addr[0] == p_eth->hdr.src.addr[0] &&\r
-                p_port->p_adapter->mac.addr[1] == p_eth->hdr.src.addr[1] &&\r
-                p_port->p_adapter->mac.addr[2] == p_eth->hdr.src.addr[2] &&\r
-                p_port->p_adapter->mac.addr[3] == p_eth->hdr.src.addr[3] &&\r
-                p_port->p_adapter->mac.addr[4] == p_eth->hdr.src.addr[4] &&\r
-                p_port->p_adapter->mac.addr[5] == p_eth->hdr.src.addr[5] )\r
-       {\r
-               IPOIB_TRACE_EXIT( IPOIB_DBG_ERROR, ("Local echo dhcp msg.\n") );\r
-               return IB_INVALID_PARAMETER;\r
-       }\r
 \r
        /*\r
         * Find the client identifier option, making sure to skip\r
@@ -3405,6 +3410,7 @@ ipoib_port_send(
 \r
        IPOIB_ENTER( IPOIB_DBG_SEND );\r
 \r
+       cl_spinlock_acquire( &p_port->send_lock );\r
        for( i = 0; i < num_packets; i++ )\r
        {\r
                desc.p_pkt = p_packet_array[i];\r
@@ -3424,7 +3430,6 @@ ipoib_port_send(
                        continue;\r
                }\r
 \r
-               cl_spinlock_acquire( &p_port->send_lock );\r
                cl_perf_start( SendMgrQueue );\r
                status = __send_mgr_queue( p_port, p_eth_hdr, &desc.p_endpt );\r
                cl_perf_stop( &p_port->p_adapter->perf, SendMgrQueue );\r
@@ -3438,10 +3443,8 @@ ipoib_port_send(
                                        IPOIB_LIST_ITEM_FROM_PACKET( p_packet_array[i++] ) );\r
                        }\r
                        cl_perf_stop( &p_port->p_adapter->perf, QueuePacket );\r
-                       cl_spinlock_release( &p_port->send_lock );\r
-                       return;\r
+                       break;\r
                }\r
-               cl_spinlock_release( &p_port->send_lock );\r
                if( status != NDIS_STATUS_SUCCESS )\r
                {\r
                        ASSERT( status == NDIS_STATUS_NO_ROUTE_TO_DESTINATION );\r
@@ -3455,7 +3458,6 @@ ipoib_port_send(
                        continue;\r
                }\r
 \r
-               /* No lock needed to build the work request. */\r
                cl_perf_start( BuildSendDesc );\r
                status = __build_send_desc( p_port, p_eth_hdr, p_buf, buf_len, &desc );\r
                cl_perf_stop( &p_port->p_adapter->perf, BuildSendDesc );\r
@@ -3486,6 +3488,7 @@ ipoib_port_send(
 \r
                cl_atomic_inc( &p_port->send_mgr.depth );\r
        }\r
+       cl_spinlock_release( &p_port->send_lock );\r
 \r
        IPOIB_EXIT( IPOIB_DBG_SEND );\r
 }\r