]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
[VNIC] fixed heartbeat algorithm. Other changes towards graceful handling of surprise...
authoraestrin <aestrin@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Thu, 28 Dec 2006 22:54:11 +0000 (22:54 +0000)
committeraestrin <aestrin@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Thu, 28 Dec 2006 22:54:11 +0000 (22:54 +0000)
git-svn-id: svn://openib.tc.cornell.edu/gen1@569 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

12 files changed:
trunk/ulp/inic/kernel/netvnic.inf
trunk/ulp/inic/kernel/vnic_adapter.c
trunk/ulp/inic/kernel/vnic_adapter.h
trunk/ulp/inic/kernel/vnic_config.h
trunk/ulp/inic/kernel/vnic_control.c
trunk/ulp/inic/kernel/vnic_data.c
trunk/ulp/inic/kernel/vnic_debug.h
trunk/ulp/inic/kernel/vnic_driver.c
trunk/ulp/inic/kernel/vnic_ib.c
trunk/ulp/inic/kernel/vnic_netpath.c
trunk/ulp/inic/kernel/vnic_viport.c
trunk/ulp/inic/kernel/vnic_viport.h

index 45f3c4724e28b105d897c509259b4f5df3b19fce..dadfae6d76d17e6c3a7465cbb29cdaa15a255b13 100644 (file)
@@ -102,12 +102,12 @@ HKR,"Params\PnpInterface",%PNPBus%,%REG_DWORD%,1
 \r
 HKR, Params,   MinMtu,,                                        "1500"\r
 HKR, Params,   MaxMtu,,                                        "9500"\r
-HKR, Params,   MinHostPoolSz,,                         "64"\r
-HKR, Params,   HostRecvPoolEntries,,           "256"\r
-HKR, Params,   MinEiocPoolSz,,                         "64"\r
-HKR, Params,   MaxEiocPoolSz,,                         "256"\r
+HKR, Params,   MinHostPoolSz,,                         "256"\r
+HKR, Params,   HostRecvPoolEntries,,           "512"\r
+HKR, Params,   MinEiocPoolSz,,                         "256"\r
+HKR, Params,   MaxEiocPoolSz,,                         "512"\r
 HKR, Params,   MinHostKickTimeout,,            "50"\r
-HKR, Params,   MaxHostKickTimeout,,            "200"\r
+HKR, Params,   MaxHostKickTimeout,,            "100"\r
 HKR, Params,   MinHostKickEntries,,            "1"\r
 HKR, Params,   MaxHostKickEntries,,            "64"\r
 HKR, Params,   MinHostKickBytes,,                      "0"\r
index 8dc77b79424c8804082857e5a8c568cedcfffbd9..afe25797b0a78e1addb65dde1dffa8161be649ad 100644 (file)
@@ -433,7 +433,7 @@ vnic_get_adapter_params(
        NdisReadConfiguration(\r
                &status, &p_reg_prm, h_config, &keyword, NdisParameterInteger );\r
        if( status == NDIS_STATUS_SUCCESS )\r
-                       g_vnic_dbg_lvl = p_reg_prm->ParameterData.IntegerData;\r
+                       g_vnic_dbg_lvl |= p_reg_prm->ParameterData.IntegerData;\r
 \r
        RtlInitUnicodeString( &keyword, L"MinMtu" );\r
        NdisReadConfiguration(\r
@@ -611,6 +611,7 @@ vnic_viport_allocate(
        data_construct( &p_viport->data, p_viport );\r
 \r
        p_viport->ioc_num = _get_ioc_num_from_iocguid( &p_adapter->ifc_data.guid );\r
+       p_adapter->ioc_num = p_viport->ioc_num;\r
        \r
        *pp_viport = p_viport;\r
 \r
@@ -646,7 +647,7 @@ vnic_set_mcast(
 \r
        VNIC_ENTER( VNIC_DBG_MCAST );\r
 \r
-       VNIC_TRACE( VNIC_DBG_INFO,\r
+       VNIC_TRACE( VNIC_DBG_INIT,\r
                ("MCAST COUNT to set = %d\n", mc_count));\r
        /* Copy the MC address list into the adapter. */\r
        if( mc_count )\r
@@ -852,10 +853,7 @@ __vnic_pnp_cb(
                        VNIC_TRACE( VNIC_DBG_PNP, ("IB_PNP_IOC_REMOVE for %s.\n",\r
                                                        p_adapter->ioc_info.profile.id_string) );\r
                \r
-                       NdisMIndicateStatus( p_adapter->h_handle,\r
-                                       NDIS_STATUS_MEDIA_DISCONNECT, NULL, 0 );\r
-                               NdisMIndicateStatusComplete( p_adapter->h_handle );\r
-                       vnic_viport_cleanup( p_adapter );\r
+                       viport_linkDown( p_adapter->p_viport );\r
                        break;\r
 \r
                case IB_PNP_IOC_PATH_ADD:\r
@@ -902,7 +900,7 @@ __vnic_pnp_cb(
                        if( ib_status != IB_SUCCESS )\r
                        {\r
                                VNIC_TRACE( VNIC_DBG_ERROR,\r
-                                               ("Control connect return s%\n", p_adapter->ifc.get_err_str( ib_status )) );\r
+                                               ("Control connect return %s\n", p_adapter->ifc.get_err_str( ib_status )) );\r
                                vnic_viport_cleanup( p_adapter );\r
                                break;\r
                        }\r
@@ -1004,6 +1002,14 @@ vnic_viport_cleanup(
 \r
        if ( p_adapter->p_viport )\r
        {\r
+               if( ( InterlockedExchange( (volatile LONG *)&p_adapter->state,\r
+                                                       INIC_DEREGISTERING )) == INIC_DEREGISTERING )\r
+               {\r
+                       VNIC_TRACE(VNIC_DBG_INIT,\r
+                                       ("vnic viport cleanup - already destroying\n" ));\r
+                       return;\r
+               }\r
+               viport_timerStop( p_adapter->p_viport );\r
                InterlockedExchange( (volatile LONG *)&p_adapter->p_viport->disconnect, TRUE );\r
                viport_cleanup(p_adapter->p_viport );\r
        }\r
@@ -1013,7 +1019,7 @@ vnic_viport_cleanup(
 }\r
 \r
 void\r
-__vnic_pnp_dereg(\r
+__vnic_pnp_dereg_cb(\r
        IN                      void*                   context )\r
 {\r
        vnic_adapter_t*         p_adapter;\r
@@ -1092,7 +1098,7 @@ vnic_reset_adapter(
        {\r
                h_pnp = p_adapter->h_pnp;\r
                p_adapter->h_pnp  = NULL;\r
-               status = p_adapter->ifc.dereg_pnp( h_pnp, __vnic_pnp_dereg );\r
+               status = p_adapter->ifc.dereg_pnp( h_pnp, __vnic_pnp_dereg_cb );\r
                if( status == IB_SUCCESS )\r
                        status = IB_NOT_DONE;\r
        }\r
index 09068dd233676141443a0b31300dd70b94446f3f..5cd9f28402f0d5069dc1c2a6ed0d4b7717f916fb 100644 (file)
@@ -131,6 +131,8 @@ typedef struct _vnic_adapter {
        mac_addr_t                              mcast_array[MAX_MCAST];\r
        LONG                                    xmitStarted;\r
        LONG                                    carrier;\r
+       uint32_t                                ioc_num;\r
+       uint32_t                                link_speed;\r
        uint32_t                                packet_filter;\r
        int                                             hung;\r
        BOOLEAN                                 reset;\r
@@ -215,7 +217,7 @@ ibregion_physInit(
        IN                      uint64_t                                        len );\r
 \r
 void\r
-__vnic_pnp_dereg(\r
+__vnic_pnp_dereg_cb(\r
        IN              void*                   context );\r
 \r
 ib_api_status_t\r
index 4a91679b4cb3aac4cac437068b638f7426e83a2a..3dccc7ed90f5a1dea62b7c61c938f1837b6a2940 100644 (file)
 #define MAX_MTU                         9500 /*  max Jumbo frame payload size */\r
 #define ETH_VLAN_HLEN                   18   /* ethernet header with VLAN tag */\r
 \r
-#define HOST_RECV_POOL_ENTRIES          128  /* TBD: Abritrary */\r
-#define MIN_HOST_POOL_SZ                64   /* TBD: Abritrary */\r
-#define MIN_EIOC_POOL_SZ                64   /* TBD: Abritrary */\r
-#define MAX_EIOC_POOL_SZ                128  /* TBD: Abritrary */\r
+#define HOST_RECV_POOL_ENTRIES          512  /* TBD: Abritrary */\r
+#define MIN_HOST_POOL_SZ                256   /* TBD: Abritrary */\r
+#define MIN_EIOC_POOL_SZ                256   /* TBD: Abritrary */\r
+#define MAX_EIOC_POOL_SZ                512  /* TBD: Abritrary */\r
 \r
 #define MIN_HOST_KICK_TIMEOUT           100   /* TBD: Arbitrary */\r
 #define MAX_HOST_KICK_TIMEOUT           200  /* In uSec */\r
 \r
 #define MIN_HOST_KICK_ENTRIES           1    /* TBD: Arbitrary */\r
-#define MAX_HOST_KICK_ENTRIES           64  /* TBD: Arbitrary */\r
+#define MAX_HOST_KICK_ENTRIES           128  /* TBD: Arbitrary */\r
 \r
 #define MIN_HOST_KICK_BYTES             0\r
 #define MAX_HOST_KICK_BYTES             5000\r
@@ -77,9 +77,10 @@ get_time_stamp_ms( void )
 #define MEM_REG_SIZE    0xFFFFFFFFFFFFFFFF\r
 \r
 /* link speed in 100 bits/sec units */\r
+#define LINK_SPEED_1MBIT_x100BPS       10000\r
 #define LINK_SPEED_1GBIT_x100BPS       10000000\r
 #define LINK_SPEED_10GBIT_x100BPS      100000000\r
-    /* VEx does not report it's link speed, so set it 1Gb/s so far */\r
+    /* if VEx does not report it's link speed, so set it 1Gb/s so far */\r
 #define DEFAULT_LINK_SPEED_x100BPS     LINK_SPEED_1GBIT_x100BPS\r
 \r
 #define DEFAULT_PARAM(x,y)     if(x == MAXU32) { \\r
@@ -231,6 +232,7 @@ typedef struct InicConfig {
 \r
 typedef enum {\r
        INIC_UNINITIALIZED,\r
+       INIC_DEREGISTERING,\r
        INIC_REGISTERED,\r
 } InicState_t;\r
 \r
index e6ed64f4986bed710f77fa27913975fe2ea81287..799c7a750224227edf9f2057f639f54a3e2837a3 100644 (file)
@@ -228,7 +228,6 @@ control_cleanup(
 \r
        control_timerStop( pControl );\r
        ibqp_detach( &pControl->qp );\r
-       ibqp_cleanup( &pControl->qp );\r
        ibregion_cleanup( pControl->p_viport, &pControl->region );\r
 \r
        if ( pControl->pLocalStorage )\r
@@ -270,7 +269,9 @@ control_processAsync(
                        case INIC_STATUS_LINK_UP:\r
                                VNIC_TRACE( VNIC_DBG_CTRL,\r
                                        ("IOC %d: Link Up\n", pControl->p_viport->ioc_num ) );\r
-\r
+                               /* renew link speed info */\r
+                               pControl->p_viport->p_adapter->link_speed =\r
+                                                       ntoh32( pPkt->cmd.reportStatus.statusInfo );\r
                                viport_linkUp( pControl->p_viport );\r
                                break;\r
 \r
@@ -1247,8 +1248,9 @@ control_recvComplete(
                        !p_viport->errored &&\r
                        !p_viport->disconnect )\r
                {\r
-                       status = FALSE;\r
-                       viport_timer( p_viport, p_viport->port_config.hbInterval );\r
+                       InterlockedExchange(\r
+                               (volatile LONG*)&p_viport->link_hb_state,\r
+                               (LONG)LINK_HEARTBEATRSP );\r
                }\r
                // Don't signal any waiting thread or start processing other updates.\r
                return;\r
@@ -1331,7 +1333,7 @@ control_send(
 \r
        VNIC_ENTER ( VNIC_DBG_CTRL );\r
 \r
-       ASSERT( !pControl->reqOutstanding );\r
+       //ASSERT( !pControl->reqOutstanding );\r
        if ( InterlockedCompareExchange( (volatile LONG*)&pControl->reqOutstanding,\r
                                                                        TRUE, FALSE ) == TRUE )\r
        {\r
index 3c9196cc126df95d8c301c8164855d067ed7c08f..fc69fba0c448308ad29868dd03359920ac484edc 100644 (file)
@@ -39,10 +39,18 @@ static void    _data_kickTimeoutHandler( void *context );
 static BOOLEAN data_allocXmitBuffer(Data_t *pData,\r
                                        BufferPoolEntry_t **ppBpe, RdmaIo_t **ppRdmaIo, BOOLEAN *pLast);\r
 static void    data_checkXmitBuffers(Data_t *pData);\r
-static void    data_rdmaPacket(Data_t *pData, BufferPoolEntry_t *pBpe, RdmaIo_t *pRdmaIo);\r
 \r
-static NDIS_PACKET *\r
-_data_recv_to_ndis_pkt( Data_t *pData, RdmaDest_t *pRdmaDest );\r
+static\r
+ib_api_status_t\r
+data_rdmaPacket(\r
+                               Data_t                          *pData,\r
+                               BufferPoolEntry_t       *pBpe,\r
+                               RdmaIo_t                        *pRdmaIo );\r
+static \r
+NDIS_PACKET *\r
+_data_recv_to_ndis_pkt( \r
+                               Data_t                  *pData,\r
+                               RdmaDest_t              *pRdmaDest );\r
 \r
 static void\r
 _data_allocBuffers(\r
@@ -574,6 +582,10 @@ data_xmitPacket(
                                }\r
                        }\r
                }\r
+               /* hash operation seem quite expensive\r
+               * should figure out anther way to do this\r
+               * meanwhile let's embedded do it for us.\r
+               ********************************************\r
                else if( p_eth_hdr->type == ETH_PROT_TYPE_IP &&\r
                                !( p_eth_hdr->dst.addr[0] & 0x01 ) )\r
                {\r
@@ -584,15 +596,19 @@ data_xmitPacket(
                                if( ((ip_pkt_t*)p_buf)->hdr.prot == IP_PROT_UDP ||\r
                                        ((ip_pkt_t*)p_buf)->hdr.prot == IP_PROT_TCP )\r
                                {\r
-                                       /* use socket src port + dest port to generate hash value\r
-                                       * for link aggregation distribution function.\r
-                                       */\r
-                                       pRdmaIo->p_trailer->connectionHashAndValid = 0x40 |\r
-                                               ((uint8_t)((ip_pkt_t*)p_buf)->prot.tcp.src_port +\r
-                                               (uint8_t)((ip_pkt_t*)p_buf)->prot.tcp.dst_port ) & 0x3f;\r
+                                       // use socket src port + dest port to generate hash value\r
+                                       // for link aggregation distribution function.\r
+                                       //\r
+                                       pRdmaIo->p_trailer->connectionHashAndValid = CHV_VALID |\r
+                                               ((uint8_t)ntoh16(((ip_pkt_t*)p_buf)->prot.tcp.src_port ) +\r
+                                               (uint8_t)ntoh16(((ip_pkt_t*)p_buf)->prot.tcp.dst_port )) & CHV_HASH_MASH;\r
+                                       pRdmaIo->p_trailer->pktFlags |= PF_CHASH_VALID;\r
                                }\r
+                               else\r
+                                       pRdmaIo->p_trailer->pktFlags &= ~PF_CHASH_VALID;\r
                        }\r
                }\r
+               **********************/\r
        }\r
 \r
        pRdmaIo->p_trailer->txChksumFlags = _tx_chksum_flags( p_packet );\r
@@ -611,7 +627,12 @@ data_xmitPacket(
 \r
     pRdmaIo->io.wrq.num_ds =p_sgl->NumberOfElements + 1;\r
 \r
-       data_rdmaPacket( pData, pBpe, pRdmaIo );\r
+       if( data_rdmaPacket( pData, pBpe, pRdmaIo ) != IB_SUCCESS )\r
+       {\r
+               VNIC_TRACE( VNIC_DBG_ERROR,\r
+                                       ("RDMA WRITE Failed\n"));\r
+               return FALSE;\r
+       }\r
 \r
        if( p_xmitPool->sendKicks )\r
        {\r
@@ -749,6 +770,13 @@ _data_receivedKick(
                pData->p_viport->stats.ifInOk += num_pkts;\r
        }\r
 \r
+       if( pData->p_viport->data.connected == TRUE &&\r
+               !pData->p_viport->errored )\r
+       {\r
+               _data_allocBuffers( pData, FALSE );\r
+               _data_sendFreeRecvBuffers( pData );\r
+       }\r
+\r
        VNIC_EXIT( VNIC_DBG_DATA );\r
        return;\r
 }\r
@@ -762,7 +790,6 @@ _data_xmitComplete(
        XmitPool_t     *p_xmitPool = &pData->xmitPool;\r
        NDIS_PACKET             *p_packet;\r
        NDIS_STATUS             ndis_status;\r
-       LIST_ENTRY              *p_list_item;\r
 \r
        VNIC_ENTER( VNIC_DBG_DATA );\r
 \r
@@ -792,22 +819,10 @@ _data_xmitComplete(
                }\r
        }\r
 \r
-       if( !pIo->pViport->p_netpath->carrier )\r
+       if( !pData->p_viport->errored )\r
        {\r
-               while( ( p_list_item = NdisInterlockedRemoveHeadList(\r
-                       &pIo->pViport->send_pending_list,\r
-                       &pIo->pViport->pending_list_lock ) ) != NULL )\r
-               {\r
-                       p_packet = VNIC_PACKET_FROM_LIST_ITEM( p_list_item );\r
-                       NDIS_SET_PACKET_STATUS( p_packet, NDIS_STATUS_FAILURE );\r
-                       NdisMSendComplete( &pIo->pViport->p_adapter->h_handle,\r
-                                                               p_packet, NDIS_STATUS_FAILURE );\r
-                       pIo->pViport->stats.ifOutErrors++;\r
-               }\r
+               data_checkXmitBuffers( pData );\r
        }\r
-\r
-       data_checkXmitBuffers( pData );\r
-\r
        VNIC_EXIT( VNIC_DBG_DATA );\r
        return;\r
 }\r
@@ -947,7 +962,8 @@ data_checkXmitBuffers(
        return;\r
 }\r
 \r
-static void\r
+static\r
+ib_api_status_t\r
 data_rdmaPacket(\r
                        IN                      Data_t                          *pData,\r
                        IN                      BufferPoolEntry_t       *pBpe,\r
@@ -990,14 +1006,14 @@ data_rdmaPacket(
        {\r
                VNIC_TRACE(VNIC_DBG_ERROR,\r
                                        ("Failed sending data to EIOC\n") );\r
-               viport_failure( pData->p_viport );\r
-               return;\r
+               return IB_ERROR;\r
        }\r
 #ifdef VNIC_STATISTIC\r
        pData->statistics.xmitNum++;\r
 #endif /* VNIC_STATISTIC */\r
 \r
        VNIC_EXIT( VNIC_DBG_DATA );\r
+       return IB_SUCCESS;\r
 }\r
 \r
 static NDIS_PACKET *\r
@@ -1188,7 +1204,8 @@ _data_incomingRecv(
                                p_recvPool->kickOnFree = TRUE;\r
                        }\r
                        /* we do not want to indicate packet if  no filter is set */\r
-                       if( pData->p_viport->p_adapter->packet_filter )\r
+                       if( pData->p_viport->p_adapter->packet_filter &&\r
+                               p_recvPool->numPostedBufs > 0 )\r
                        {\r
                                p_packet = _data_recv_to_ndis_pkt( pData, pRdmaDest );\r
                                if ( p_packet != NULL )\r
@@ -1233,12 +1250,6 @@ vnic_return_packet(
        InsertTailList( &p_viport->data.recvPool.availRecvBufs,\r
                                        &p_rdma_dest->listPtrs );\r
 \r
-       if( p_viport->data.connected == TRUE &&\r
-               !p_viport->errored )\r
-       {\r
-               _data_allocBuffers( &p_viport->data, FALSE );\r
-               _data_sendFreeRecvBuffers( &p_viport->data );\r
-       }\r
 }\r
 static void\r
 _data_return_recv(\r
@@ -1268,13 +1279,14 @@ _data_sendFreeRecvBuffers(
 \r
        VNIC_ENTER( VNIC_DBG_DATA );\r
 \r
-       for (   numToSend = p_recvPool->szFreeBundle;\r
+       for (   numToSend = MIN_EIOC_UPDATE_SZ;\r
                        numToSend <= p_recvPool->numFreeBufs;\r
-                       numToSend += p_recvPool->szFreeBundle )\r
+                       numToSend += MIN_EIOC_UPDATE_SZ )\r
        {\r
+\r
                /* Handle multiple bundles as one when possible. */\r
-               nextIncrement = numToSend + p_recvPool->szFreeBundle;\r
-               if (    ( nextIncrement <= p_recvPool->numFreeBufs )\r
+               nextIncrement = numToSend + MIN_EIOC_UPDATE_SZ;\r
+               if (( nextIncrement <= p_recvPool->numFreeBufs )\r
                                && ( p_recvPool->nextFreeBuf + nextIncrement <= p_recvPool->eiocPoolSz ) )\r
                {\r
                        continue;\r
@@ -1316,7 +1328,7 @@ _data_sendFreeRecvBuffers(
                                ("IOC %d: Unable to allocate receive buffers\n",\r
                                        pData->p_viport->ioc_num ) );\r
        \r
-               viport_failure( pData->p_viport );\r
+               //viport_failure( pData->p_viport );\r
        }\r
        VNIC_EXIT( VNIC_DBG_DATA );\r
 }\r
@@ -1328,6 +1340,15 @@ data_cleanup(
 {\r
        VNIC_ENTER( VNIC_DBG_DATA );\r
 \r
+       VNIC_TRACE(VNIC_DBG_INIT,\r
+                       ("IOC[%d]data cleanup\n", pData->p_viport->ioc_num ));\r
+\r
+       if( pData->p_recv_bufs )\r
+       {\r
+               NdisFreeMemory( pData->p_recv_bufs, pData->recv_bufs_sz, 0 );\r
+               pData->p_recv_bufs = NULL;\r
+       }\r
+\r
        if( pData->recvPool.recv_pkt_array )\r
        {\r
                cl_free( pData->recvPool.recv_pkt_array );\r
@@ -1349,20 +1370,14 @@ data_cleanup(
 \r
        if ( pData->h_recv_pkt_pool )\r
        {\r
-               while( NdisPacketPoolUsage(pData->h_recv_pkt_pool) != 0)\r
+               if( NdisPacketPoolUsage(pData->h_recv_pkt_pool) != 0)\r
                {\r
                        VNIC_TRACE( VNIC_DBG_WARN,\r
                                ("Recv packet pool is not empty!!!\n") );\r
-                       NdisMSleep(100);\r
                }\r
                NdisFreePacketPool( pData->h_recv_pkt_pool );\r
                pData->h_recv_pkt_pool = NULL;\r
        }\r
-       if( pData->p_recv_bufs )\r
-       {\r
-               NdisFreeMemory( pData->p_recv_bufs, pData->recv_bufs_sz, 0 );\r
-               pData->p_recv_bufs = NULL;\r
-       }\r
        // clear Qp struct for reuse\r
        cl_memclr( &pData->qp, sizeof( IbQp_t) );\r
 \r
index 37b2252628b8f2c1441e8885d5dcca53f3a312ca..9a69dd47449bb44de8e6e898b2efdb07d45d06d2 100644 (file)
@@ -66,7 +66,7 @@ extern uint32_t               g_vnic_dbg_lvl;
 #define VNIC_DBG_ERROR         CL_DBG_ERROR\r
 #define VNIC_DBG_ALL           CL_DBG_ALL\r
 \r
-#define VNIC_DEBUG_FLAGS ( VNIC_DBG_ERROR | VNIC_DBG_WARN )\r
+#define VNIC_DEBUG_FLAGS ( VNIC_DBG_ERROR | VNIC_DBG_WARN |    VNIC_DBG_INFO | VNIC_DBG_PNP | VNIC_DBG_INIT )\r
 /* Enter and exit macros automatically add VNIC_DBG_FUNC bit */\r
 #define VNIC_ENTER( lvl )      \\r
        CL_ENTER( (lvl | VNIC_DBG_FUNC), g_vnic_dbg_lvl )\r
index 6b29df492548c3efa4a212b4f8d1289797deee7e..cba109e23bfbaf6f1fa95c565ccb8e5b2a153b74 100644 (file)
@@ -128,7 +128,7 @@ DriverEntry(
 \r
        characteristics.MajorNdisVersion                = MAJOR_NDIS_VERSION;\r
        characteristics.MinorNdisVersion                = MINOR_NDIS_VERSION;\r
-       characteristics.CheckForHangHandler             = vnic_check_for_hang;\r
+       //characteristics.CheckForHangHandler           = vnic_check_for_hang;\r
        characteristics.HaltHandler                             = vnic_halt;\r
        characteristics.InitializeHandler               = vnic_initialize;\r
        characteristics.QueryInformationHandler = vnic_oid_query_info;\r
@@ -456,7 +456,10 @@ vnic_oid_query_info(
 \r
                if( p_adapter->p_currentPath->carrier )\r
                {\r
-                       info32 = DEFAULT_LINK_SPEED_x100BPS;  /*  x 100bps units */\r
+                       /* if we get link speed value - it is in Mbps units - have to convert to 100bps*/\r
+                       info32 = ( p_adapter->link_speed )?     \r
+                                       ( p_adapter->link_speed * LINK_SPEED_1MBIT_x100BPS ):\r
+                                       DEFAULT_LINK_SPEED_x100BPS;\r
                }\r
                else\r
                {\r
@@ -878,7 +881,7 @@ vnic_oid_query_info(
                break;\r
 \r
        case OID_802_3_MULTICAST_LIST:\r
-               VNIC_TRACE( VNIC_DBG_INFO,\r
+               VNIC_TRACE( VNIC_DBG_OID,\r
                        ("  received query for OID_802_3_MULTICAST_LIST\n" ) );\r
        \r
                if (!p_adapter->p_currentPath->carrier ||\r
@@ -887,7 +890,7 @@ vnic_oid_query_info(
                        p_adapter->pending_query = TRUE;\r
                        p_adapter->query_oid = oid_info;\r
 \r
-                       VNIC_TRACE( VNIC_DBG_INFO,\r
+                       VNIC_TRACE( VNIC_DBG_OID,\r
                                ("returning NDIS_STATUS_PENDING\n") );\r
                        status = NDIS_STATUS_PENDING;\r
                }\r
@@ -903,7 +906,7 @@ vnic_oid_query_info(
                break;\r
 \r
        case OID_802_3_MAXIMUM_LIST_SIZE:\r
-               VNIC_TRACE( VNIC_DBG_INFO,\r
+               VNIC_TRACE( VNIC_DBG_OID,\r
                        ("  received query for OID_802_3_MAXIMUM_LIST_SIZE\n" ) );\r
                if ( !p_adapter->macSet )\r
                {\r
@@ -1310,7 +1313,7 @@ vnic_oid_set_info(
        {\r
        /* Required General */\r
        case OID_GEN_CURRENT_PACKET_FILTER:\r
-               VNIC_TRACE( VNIC_DBG_INFO,\r
+               VNIC_TRACE( VNIC_DBG_OID,\r
                        ("  IOC %d received set for OID_GEN_CURRENT_PACKET_FILTER, %#x\n",\r
                                                p_adapter->p_currentPath->pViport->ioc_num,\r
                                                *(uint32_t*)info_buf  ));\r
@@ -1367,19 +1370,19 @@ vnic_oid_set_info(
                        status = NDIS_STATUS_NOT_ACCEPTED;\r
                        break;\r
                }\r
-               VNIC_TRACE( VNIC_DBG_INFO,\r
+               VNIC_TRACE( VNIC_DBG_OID,\r
                        ("  IOC %d received set for OID_802_3_MULTICAST_LIST\n",\r
                                p_adapter->p_currentPath->pViport->ioc_num ) );\r
                if( info_buf_len > MAX_MCAST * sizeof(mac_addr_t) )\r
                {\r
-                       VNIC_TRACE( VNIC_DBG_INFO,\r
+                       VNIC_TRACE( VNIC_DBG_OID,\r
                                ("  OID_802_3_MULTICAST_LIST - Multicast list full.\n" ) );\r
                        status = NDIS_STATUS_MULTICAST_FULL;\r
                        *p_bytes_needed = MAX_MCAST * sizeof(mac_addr_t);\r
                }\r
                else if( info_buf_len % sizeof(mac_addr_t) )\r
                {\r
-                       VNIC_TRACE( VNIC_DBG_INFO,\r
+                       VNIC_TRACE( VNIC_DBG_OID,\r
                                ("  OID_802_3_MULTICAST_LIST - Invalid input buffer length.\n" ) );\r
                        status = NDIS_STATUS_INVALID_DATA;\r
                }\r
@@ -1495,7 +1498,6 @@ vnic_send_packets(
                netpath_xmitPacket( p_adapter->p_currentPath,\r
                                                                                        packet_array[packet_num] );\r
        }\r
-       \r
        VNIC_EXIT( VNIC_DBG_SEND );\r
 }\r
 \r
@@ -1515,7 +1517,7 @@ vnic_pnp_notify(
 \r
        p_adapter = (vnic_adapter_t*)adapter_context;\r
 \r
-       VNIC_TRACE( VNIC_DBG_PNP, ("Event %d\n", pnp_event) );\r
+       VNIC_TRACE( VNIC_DBG_PNP, ("Event %d IOC[%d]\n", pnp_event, p_adapter->ioc_num ) );\r
        if( pnp_event != NdisDevicePnPEventPowerProfileChanged )\r
        {\r
                InterlockedExchange( (volatile LONG *)&p_adapter->pnp_state, IB_PNP_IOC_REMOVE );\r
@@ -1530,9 +1532,24 @@ void
 vnic_shutdown(\r
        IN              PVOID           adapter_context )\r
 {\r
+       vnic_adapter_t  *p_adapter;\r
        VNIC_ENTER( VNIC_DBG_INIT );\r
+       p_adapter = (vnic_adapter_t *)adapter_context;\r
+\r
+       if( p_adapter )\r
+       {\r
+               VNIC_TRACE( VNIC_DBG_INIT, \r
+                       ("IOC[%d]Shutdown -early retierement\n", p_adapter->ioc_num ));\r
 \r
-       UNUSED_PARAM( adapter_context );\r
+               if( p_adapter->p_currentPath &&\r
+                       p_adapter->p_currentPath->pViport )\r
+               {\r
+                       viport_stopXmit( p_adapter->p_currentPath->pViport );\r
+                       viport_linkDown( p_adapter->p_currentPath->pViport );\r
+                       InterlockedExchange( &p_adapter->p_currentPath->carrier, (LONG)FALSE );\r
+               }\r
+               vnic_destroy_adapter( p_adapter );\r
+       }\r
 \r
        VNIC_EXIT( VNIC_DBG_INIT );\r
 }\r
@@ -1579,7 +1596,7 @@ vnic_resume_set_oids(
                switch( set_oid.oid )\r
                {\r
                case OID_GEN_CURRENT_PACKET_FILTER:\r
-                               VNIC_TRACE( VNIC_DBG_INFO,\r
+                               VNIC_TRACE( VNIC_DBG_OID,\r
                                        ("  IOC %d resume PACKET_FILTER set \n",\r
                                                p_adapter->p_currentPath->pViport->ioc_num ) );\r
                        /* Validation already performed in the SetInformation path. */\r
@@ -1593,7 +1610,7 @@ vnic_resume_set_oids(
                        break;\r
 \r
                case OID_802_3_MULTICAST_LIST:\r
-                                       VNIC_TRACE( VNIC_DBG_INFO,\r
+                                       VNIC_TRACE( VNIC_DBG_OID,\r
                                                ("  IOC %d resume MULTICAST_LIST\n",\r
                                                p_adapter->p_currentPath->pViport->ioc_num ) );\r
 \r
@@ -1893,7 +1910,7 @@ _vnic_process_packet_filter(
 \r
        ++p_adapter->pending_set;\r
        status = _viport_process_query( p_adapter->p_viport, FALSE );\r
-       VNIC_TRACE( VNIC_DBG_INFO,\r
+       VNIC_TRACE( VNIC_DBG_OID,\r
                                        ("LINK CONFIG status %x\n", status ));\r
        if( status != NDIS_STATUS_PENDING )\r
        {\r
index 940d465584852561cbf6c4b1d6baf7b3000b9b7c..020e8218a11d911a2d78d76c6e3703ebb0061724 100644 (file)
@@ -180,21 +180,20 @@ ibregion_cleanup(
                IN              viport_t        *p_viport,\r
                IN              IbRegion_t      *pRegion )\r
 {\r
-       void    *mr_handle;\r
        ib_api_status_t ib_status;\r
 \r
        VNIC_ENTER( VNIC_DBG_IB );\r
 \r
-       if( ( mr_handle = InterlockedExchangePointer( (void *)&pRegion->h_mr, NULL )) != NULL )\r
+       if( pRegion->h_mr != NULL )\r
        {\r
-               ib_status = p_viport->p_adapter->ifc.dereg_mr( (ib_mr_handle_t)mr_handle );\r
+               ib_status = p_viport->p_adapter->ifc.dereg_mr( pRegion->h_mr );\r
                if ( ib_status != IB_SUCCESS )\r
                {\r
                        VNIC_TRACE_EXIT( VNIC_DBG_ERROR,\r
-                       ("Dereg MR failed status %s(%d)\n",\r
-                                               p_viport->p_adapter->ifc.get_err_str(ib_status), ib_status ) );\r
+                       ("Dereg MR failed status (%d)\n", ib_status ));\r
                        return;\r
                }\r
+               InterlockedExchangePointer( (void *)&pRegion->h_mr, NULL );\r
        }\r
 \r
        VNIC_EXIT( VNIC_DBG_IB );\r
@@ -497,11 +496,10 @@ ibqp_detach(
 \r
        VNIC_ENTER( VNIC_DBG_IB );\r
 \r
-       NdisAcquireSpinLock( &pQp->qpLock );\r
-\r
-       if( pQp->qpState == IB_ATTACHED )\r
+       if( InterlockedCompareExchange( &pQp->qpState, \r
+                       IB_DETACHING, IB_ATTACHED ) == IB_ATTACHED )\r
        {\r
-               InterlockedExchange ( &pQp->qpState, IB_DETACHING );\r
+               NdisAcquireSpinLock( &pQp->qpLock );\r
 \r
                cm_dreq.h_qp = pQp->qp;\r
                cm_dreq.qp_type = IB_QPT_RELIABLE_CONN;\r
@@ -515,9 +513,17 @@ ibqp_detach(
                                (" cm_dreq failed status %s\n",\r
                                pQp->pViport->p_adapter->ifc.get_err_str( ib_status )));\r
                }\r
+\r
+               NdisReleaseSpinLock( &pQp->qpLock );\r
+\r
                ib_status = pQp->pViport->p_adapter->ifc.destroy_qp( pQp->qp, NULL );\r
+               if ( ib_status != IB_SUCCESS )\r
+               {\r
+                       VNIC_TRACE( VNIC_DBG_ERROR,\r
+                               (" QP destroy failed status %s\n",\r
+                               pQp->pViport->p_adapter->ifc.get_err_str( ib_status )));\r
+               }\r
        }\r
-       NdisReleaseSpinLock( &pQp->qpLock );\r
 \r
        VNIC_EXIT( VNIC_DBG_IB );\r
        return;\r
@@ -730,7 +736,7 @@ err:
 }\r
 \r
 \r
-#define WC_LIST_SIZE_TO_POLL 4\r
+#define WC_LIST_SIZE_TO_POLL 32\r
 static void\r
 _ib_qpCompletion(\r
                IN                      IbQp_t          *pQp )\r
@@ -780,50 +786,33 @@ _ib_qpCompletion(
        {\r
                pIo = (Io_t *)(uintn_t)p_done_wc->wr_id;\r
 \r
-               if (pIo)\r
+               /* keep completion status for proper ndis packet return status */\r
+               pIo->wc_status = p_done_wc->status;\r
+\r
+               if( p_done_wc->status != IB_WCS_SUCCESS )\r
                {\r
-                       /* keep completion status for proper ndis packet return status */\r
-                       pIo->wc_status = p_done_wc->status;\r
-#ifdef VNIC_STATISTIC\r
-                       if (pIo->type == RECV)\r
-                       {\r
-                               pIo->time = compTime;\r
-                       }\r
-                       else if (pIo->type == RDMA)\r
-                       {\r
-                               pQp->statistics.rdmaCompTime += compTime - pIo->time;\r
-                               pQp->statistics.rdmaCompIos++;\r
-                       }\r
-                       else if (pIo->type == SEND)\r
-                       {\r
-                               pQp->statistics.sendCompTime += compTime - pIo->time;\r
-                               pQp->statistics.sendCompIos++;\r
-                       }\r
-                       pQp->statistics.numIos++;\r
-                       if ( ++compNum > pQp->statistics.maxIos)\r
-                       {\r
-                                       pQp->statistics.maxIos = compNum;\r
-                       }\r
-#endif /* VNIC_STATISTIC */\r
                        VNIC_TRACE( VNIC_DBG_IB,\r
-                               ("ib_workCompletion: WcType = %d, Status = %d, Length = %d\n",\r
-                                       p_done_wc->wc_type,\r
-                                       p_done_wc->status,\r
-                                       ( p_done_wc->wc_type == IB_WC_RECV )? p_done_wc->length : 0 ) );\r
+                       ("Failed Completion: WcType = %d, Status = %d, Length = %d\n",\r
+                       p_done_wc->wc_type,\r
+                       p_done_wc->status,\r
+                       ( p_done_wc->wc_type == IB_WC_RECV )? p_done_wc->length : 0 ) );\r
 \r
-                       if( pIo->pRoutine )\r
+                       if( pIo && pIo->type == RDMA )\r
                        {\r
+                               VNIC_TRACE( VNIC_DBG_ERROR,\r
+                               ("Failed RDMA Op, WC type = %d, WC status = %d IO type %d\n",\r
+                                       p_done_wc->wc_type,     p_done_wc->status, pIo->type ));\r
+\r
+                               /* we must complete send packets */\r
                                (*pIo->pRoutine)( pIo );\r
                        }\r
                }\r
-\r
-               if (p_done_wc->status != IB_WCS_SUCCESS )\r
+               else if(pIo)\r
                {\r
-                       VNIC_TRACE( VNIC_DBG_IB,\r
-                                       ("Failed completion, type = %d, status = %d (%s)\n",\r
-                                       p_done_wc->wc_type,\r
-                                       p_done_wc->status,\r
-                                       pQp->pViport->p_adapter->ifc.get_wc_status_str (p_done_wc->status) ) );\r
+                       if( pIo->pRoutine )\r
+                       {\r
+                               (*pIo->pRoutine)( pIo );\r
+                       }\r
                }\r
 \r
                p_done_wc = p_done_wc->p_next;\r
@@ -836,6 +825,7 @@ _ib_qpCompletion(
                VNIC_TRACE( VNIC_DBG_ERROR,\r
                        ("Rearm CQ failed status %d(%s)\n", ib_status,\r
                                                pQp->pViport->p_adapter->ifc.get_err_str( ib_status )) );\r
+               viport_failure( pQp->pViport );\r
        }\r
        return;\r
 }\r
@@ -861,28 +851,27 @@ void
 ib_asyncEvent(\r
        IN              ib_async_event_rec_t            *pEventRecord )\r
 {\r
-       IbQp_t   *pQp;\r
+       vnic_adapter_t  *p_adapter;\r
 \r
        VNIC_ENTER ( VNIC_DBG_IB );\r
 \r
        if ( pEventRecord )\r
        {\r
+               p_adapter = (vnic_adapter_t * __ptr64 )pEventRecord->context;\r
+\r
                switch ( pEventRecord->code )\r
                {\r
                        case IB_AE_QP_COMM:\r
                        case IB_AE_QP_FATAL:\r
-\r
-                               pQp = (IbQp_t * __ptr64 )pEventRecord->context;\r
-                               if (pQp)\r
-                               {\r
                                        VNIC_TRACE( VNIC_DBG_ERROR,\r
-                                               ("Async Event %d  QP State %#x\n",\r
-                                               pEventRecord->code, pQp->qpState ));\r
-                               }\r
+                                               ("Async Event %d\n", pEventRecord->code ));\r
                                break;\r
+                       case IB_AE_PORT_DOWN:\r
                        default:\r
                                VNIC_TRACE( VNIC_DBG_ERROR,\r
                                        ("Async Event %d received\n", pEventRecord->code) );\r
+                               if( p_adapter && p_adapter->p_viport )\r
+                                       viport_stopXmit( p_adapter->p_viport );\r
                                break;\r
                }\r
        }\r
index 65926a7e9537d003e0d62af60bb11ccbfb463234..9d2af3b17d18c3fc42f51f81502abfa7bfa68d61 100644 (file)
@@ -119,7 +119,10 @@ void netpath_restartXmit(
 \r
        if (pNetpath == pNetpath->p_adapter->p_currentPath )\r
        {\r
-               InterlockedCompareExchange( &pNetpath->p_adapter->xmitStarted, 1, 0 );\r
+               if( !pNetpath->pViport->errored )\r
+               {\r
+                       InterlockedCompareExchange( &pNetpath->p_adapter->xmitStarted, 1, 0 );\r
+               }\r
        }\r
 #ifdef INIC_STATISTICS\r
                if (pNetpath->p_adapter->statistics.xmitRef != 0)\r
index d6e823dd87304ae580e348e1bb1df975227d3da8..e8238f4513e9cd5696522eb4f3790d9100df3db0 100644 (file)
@@ -217,10 +217,11 @@ viport_cleanup(
 \r
        if( p_viport )\r
        {\r
+               VNIC_TRACE(VNIC_DBG_INIT,\r
+                       ("IOC[%d]viport cleanup\n", p_viport->ioc_num ));\r
                InterlockedExchange( &p_viport->p_adapter->carrier, FALSE );\r
                InterlockedExchange( &p_viport->p_netpath->carrier, FALSE );\r
                viport_timerStop( p_viport );\r
-\r
                data_disconnect( &p_viport->data );\r
 \r
                control_cleanup( &p_viport->control );\r
@@ -235,6 +236,9 @@ viport_cleanup(
 \r
                cl_timer_destroy( &p_viport->timer );\r
 \r
+               InterlockedExchange( (volatile LONG *)&p_viport->p_adapter->state,\r
+                       INIC_UNINITIALIZED );\r
+\r
                NdisFreeMemory ( p_viport, sizeof(viport_t), 0 );\r
        }\r
        VNIC_EXIT( VNIC_DBG_VIPORT );\r
@@ -253,7 +257,7 @@ viport_setPath(
 \r
        VNIC_ENTER( VNIC_DBG_FUNC );\r
 \r
-       VNIC_TRACE( VNIC_DBG_INFO,\r
+       VNIC_TRACE( VNIC_DBG_PNP,\r
                ("Using SLID=%d DLID=%d Target:%s\n",\r
                                                        cl_ntoh16( p_path->slid ),\r
                                                        cl_ntoh16( p_path->dlid ),\r
@@ -527,9 +531,10 @@ viport_xmitPacket(
                IN              viport_t*       const   p_viport,\r
                IN              NDIS_PACKET* const      p_packet )\r
 {\r
-       BOOLEAN status = FALSE;\r
+       BOOLEAN status = TRUE;\r
     KIRQL              flags;\r
        LIST_ENTRY      *p_list_item;\r
+       NDIS_PACKET     *p_packet_from_list;\r
 \r
        VNIC_ENTER( VNIC_DBG_VIPORT );\r
 \r
@@ -540,21 +545,59 @@ viport_xmitPacket(
                                        VNIC_LIST_ITEM_FROM_PACKET( p_packet ),\r
                                        &p_viport->pending_list_lock );\r
        }\r
-       else \r
+       else\r
        {\r
+               KeAcquireSpinLock( &p_viport->lock, &flags );\r
+\r
                while( ( p_list_item = NdisInterlockedRemoveHeadList(\r
-                       &p_viport->send_pending_list,\r
-                       &p_viport->pending_list_lock ) ) != NULL )\r
+                               &p_viport->send_pending_list,\r
+                               &p_viport->pending_list_lock ) ) != NULL )\r
                {\r
-                       KeAcquireSpinLock( &p_viport->lock, &flags );\r
-                       status = data_xmitPacket( &p_viport->data,\r
-                               VNIC_PACKET_FROM_LIST_ITEM( p_list_item ));\r
+                       p_packet_from_list = VNIC_PACKET_FROM_LIST_ITEM( p_list_item );\r
+\r
+                       status = data_xmitPacket( &p_viport->data, p_packet_from_list );\r
+                       if( !status )\r
+                       {\r
+                               VNIC_TRACE( VNIC_DBG_ERROR,\r
+                                       ("IOC[%d] Xmit Pending Packet failed\n", p_viport->ioc_num ));\r
+                               /* put it back on pending list - will complete it on cleanup */\r
+                               NdisInterlockedInsertTailList( \r
+                                       &p_viport->send_pending_list,\r
+                                       VNIC_LIST_ITEM_FROM_PACKET( p_packet_from_list ),\r
+                                       &p_viport->pending_list_lock );\r
+                               viport_stopXmit( p_viport );\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               if( !status )\r
+               { /*do not try to send, just exit */\r
+                       NdisInterlockedInsertTailList( \r
+                               &p_viport->send_pending_list,\r
+                               VNIC_LIST_ITEM_FROM_PACKET( p_packet ),\r
+                               &p_viport->pending_list_lock );\r
+                       viport_stopXmit( p_viport );\r
+                       \r
                        KeReleaseSpinLock( &p_viport->lock, flags );\r
+                       VNIC_EXIT( VNIC_DBG_VIPORT );\r
+                       return status;\r
                }\r
 \r
                /* just send a packet */\r
-               KeAcquireSpinLock( &p_viport->lock, &flags );\r
                status = data_xmitPacket( &p_viport->data, p_packet );\r
+\r
+               if( !status )\r
+               {\r
+                       VNIC_TRACE( VNIC_DBG_ERROR,\r
+                                       ("IOC[%d] XmitPacket failed\n", p_viport->ioc_num ));\r
+                       /* put it on pending list - will complete it on cleanup */\r
+                       NdisInterlockedInsertTailList( \r
+                               &p_viport->send_pending_list,\r
+                               VNIC_LIST_ITEM_FROM_PACKET( p_packet ),\r
+                               &p_viport->pending_list_lock );\r
+                       viport_stopXmit( p_viport );\r
+               }\r
+\r
                KeReleaseSpinLock( &p_viport->lock, flags );\r
        }\r
 \r
@@ -630,6 +673,7 @@ viport_failure(
        \r
        if( InterlockedExchange( (volatile LONG*)&p_viport->errored,  TRUE ) == FALSE )\r
        {\r
+               viport_stopXmit( p_viport );\r
                viport_linkDown( p_viport );\r
        }\r
 \r
@@ -645,20 +689,19 @@ viport_timeout(
        CL_ASSERT( p_viport );\r
 \r
        InterlockedExchange( &p_viport->timerActive, FALSE );\r
+       // did we get response from previous query ?\r
+       if( p_viport->link_hb_state != LINK_HEARTBEATRSP )\r
+       {\r
+               VNIC_TRACE( VNIC_DBG_ERROR,\r
+                       ("IOC[%d] NO HEARTBEAT RESPONSE\n", p_viport->ioc_num ));\r
+               viport_failure( p_viport );\r
+               return;\r
+       }\r
        if( p_viport &&\r
                p_viport->data.connected &&\r
                !p_viport->errored )\r
        {\r
-               // TODO: What about send failure?\r
-               if( !p_viport->control.reqOutstanding )\r
-               {\r
-                        control_heartbeatReq( &p_viport->control,\r
-                                               p_viport->port_config.hbTimeout );\r
-               }\r
-               else\r
-               {       /* send WQE is taken, send heartbeat later */\r
-                       viport_timer( p_viport, p_viport->port_config.hbInterval );\r
-               }\r
+               viport_timer( p_viport, p_viport->port_config.hbInterval );\r
        }\r
 }\r
 \r
@@ -668,11 +711,29 @@ viport_timer(
                IN               viport_t       *p_viport,\r
                IN              int                     timeout )\r
 {\r
+       ib_api_status_t ib_status;\r
+\r
        VNIC_ENTER( VNIC_DBG_VIPORT );\r
 \r
-       InterlockedExchange( &p_viport->timerActive, TRUE );\r
-       cl_timer_start( &p_viport->timer, (uint32_t)timeout );\r
+       if( !p_viport->control.reqOutstanding )\r
+       {\r
+               InterlockedExchange( &p_viport->timerActive, TRUE );\r
+               p_viport->link_hb_state = LINK_HEARTBEATREQ;\r
+\r
+               cl_timer_start( &p_viport->timer, (uint32_t)timeout );\r
 \r
+               ib_status = control_heartbeatReq( &p_viport->control,\r
+                       p_viport->port_config.hbTimeout );\r
+\r
+               if( ib_status != IB_SUCCESS )\r
+               {\r
+                       viport_timerStop( p_viport );\r
+                       VNIC_TRACE( VNIC_DBG_ERROR,\r
+                               ("IOC[%d] HEARTBEAT send failed\n", p_viport->ioc_num ));\r
+                       viport_failure( p_viport );\r
+                       return;\r
+               }\r
+       }\r
        VNIC_EXIT( VNIC_DBG_VIPORT );\r
 }\r
 \r
@@ -759,9 +820,10 @@ viport_control_connect(
        ib_status = ibqp_connect( &p_viport->control.qp );\r
        if( ib_status != IB_SUCCESS )\r
        {\r
-               VNIC_TRACE( VNIC_DBG_INFO,\r
+               VNIC_TRACE_EXIT( VNIC_DBG_ERROR,\r
                                ("control QP connect failed\n"));\r
-               goto err1;\r
+               control_cleanup( &p_viport->control );\r
+               return ib_status;\r
        }\r
 \r
        InterlockedExchange( (volatile LONG*)&p_viport->linkState,\r
@@ -770,18 +832,21 @@ viport_control_connect(
        ib_status = control_initInicReq( &p_viport->control );\r
        if( ib_status != IB_SUCCESS )\r
        {\r
-               VNIC_TRACE( VNIC_DBG_INFO, ("CMD_INIT_INIC  REQ failed\n") );\r
-               goto err2;\r
+               VNIC_TRACE_EXIT( VNIC_DBG_ERROR, \r
+                       ("CMD_INIT_INIC  REQ failed\n") );\r
+               control_cleanup( &p_viport->control );\r
+               return ib_status;\r
        }\r
        cl_event_wait_on( &p_viport->conn_event,\r
                                                (p_viport->control.p_conf->rspTimeout << 11), TRUE );\r
 \r
        if( p_viport->linkState != LINK_INITINICRSP )\r
        {\r
-               VNIC_TRACE( VNIC_DBG_INFO,\r
+               VNIC_TRACE_EXIT( VNIC_DBG_ERROR,\r
                                        ("CMD_INIT_INIC RSP failed\n"));\r
                ib_status = IB_INSUFFICIENT_RESOURCES;\r
-               goto err2;\r
+               control_cleanup( &p_viport->control );\r
+               return ib_status;\r
        }\r
 \r
        vnic_resume_oids( p_viport->p_adapter );\r
@@ -789,11 +854,8 @@ viport_control_connect(
        ib_status = viport_initMacAddresses( p_viport );\r
        if( ib_status != IB_SUCCESS )\r
        {\r
-               VNIC_TRACE( VNIC_DBG_INFO,\r
+               VNIC_TRACE( VNIC_DBG_ERROR,\r
                                ("Init MAC Addresses failed\n"));\r
-err2:\r
-               control_resetReq( &p_viport->control );\r
-err1:\r
                control_cleanup( &p_viport->control );\r
        }\r
 \r
@@ -917,7 +979,7 @@ _viport_process_query(
        if ( p_viport->state != VIPORT_CONNECTED ||\r
                p_viport->errored != 0 )\r
        {\r
-               VNIC_TRACE_EXIT( VNIC_DBG_WARN, ("Invalid state or error.\n") );\r
+               VNIC_TRACE_EXIT( VNIC_DBG_INFO, ("Invalid state or error.\n") );\r
                return NDIS_STATUS_NOT_ACCEPTED;\r
        }\r
 \r
@@ -950,7 +1012,7 @@ _viport_process_query(
        // Handle update bits one at a time.\r
        if( p_viport->updates & NEED_ADDRESS_CONFIG )\r
        {\r
-               VNIC_TRACE( VNIC_DBG_INFO,\r
+               VNIC_TRACE( VNIC_DBG_OID,\r
                        ("QUERY NEED_ADDRESS_CONFIG\n"));\r
                KeAcquireSpinLock(&p_viport->lock, &irql );\r
                p_viport->linkState = LINK_CONFIGADDRSREQ;\r
@@ -968,7 +1030,7 @@ _viport_process_query(
        }\r
        else if( p_viport->updates & NEED_LINK_CONFIG )\r
        {\r
-               VNIC_TRACE( VNIC_DBG_INFO,\r
+               VNIC_TRACE( VNIC_DBG_OID,\r
                        ("QUERY NEED_LINK_CONFIG\n"));\r
 \r
                KeAcquireSpinLock(&p_viport->lock, &irql );\r
@@ -1001,7 +1063,7 @@ _viport_process_query(
        else if( p_viport->updates & NEED_STATS )\r
        {\r
                // TODO: This is dead code.\r
-               VNIC_TRACE( VNIC_DBG_INFO,\r
+               VNIC_TRACE( VNIC_DBG_OID,\r
                        ("QUERY NEED_STATS\n"));\r
 \r
                KeAcquireSpinLock( &p_viport->lock, &irql );\r
index 6023e3f11a1b0322b7f9601871eb2cdbac850fe3..f4da643211b93a7faf3f7d93fba60e46e8f9cd65 100644 (file)
@@ -168,6 +168,7 @@ typedef struct _viport {
 \r
        // State machine state?\r
        LinkState_t                                             linkState;\r
+       LinkState_t                                             link_hb_state;\r
 \r
        Inic_CmdReportStatisticsRsp_t   stats;\r
        uint64_t                                                lastStatsTime;\r