]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
[VNIC] added support for ipv6 checksum offload.
authoraestrin <aestrin@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Fri, 8 Feb 2008 22:06:09 +0000 (22:06 +0000)
committeraestrin <aestrin@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Fri, 8 Feb 2008 22:06:09 +0000 (22:06 +0000)
- fixed potential netpath null dereference
- fixed control path initialization potential flaw,
- simplified LBFO a bit and removed NdisMRemoveMiniport since
  it breaks adapter reset-reinitialization.
- removed cmd reset request (doesn't make sense when path is broken).
- hung flag set change
- debug messages, replace some macros with inline funcs, some code cleanup and formatting.
INF changes
 - fixed service name.
 - mtu payload size can be modified in 100 bytes increments( was 500).

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

13 files changed:
trunk/ulp/qlc_vnic/kernel/SOURCES
trunk/ulp/qlc_vnic/kernel/netvnic.inf
trunk/ulp/qlc_vnic/kernel/vnic_adapter.c
trunk/ulp/qlc_vnic/kernel/vnic_adapter.h
trunk/ulp/qlc_vnic/kernel/vnic_config.h
trunk/ulp/qlc_vnic/kernel/vnic_control.c
trunk/ulp/qlc_vnic/kernel/vnic_data.c
trunk/ulp/qlc_vnic/kernel/vnic_driver.c
trunk/ulp/qlc_vnic/kernel/vnic_ib.c
trunk/ulp/qlc_vnic/kernel/vnic_ib.h
trunk/ulp/qlc_vnic/kernel/vnic_netpath.c
trunk/ulp/qlc_vnic/kernel/vnic_viport.c
trunk/ulp/qlc_vnic/kernel/vnic_viport.h

index 481cdaf133784c13c4f315506300dc1856ed16c0..a096eda7eeebae3c0b5aaa6406b695db159d0b59 100644 (file)
@@ -51,7 +51,12 @@ SOURCES=     inic.rc \
 INCLUDES=..;..\..\..\inc;..\..\..\inc\kernel;\r
 \r
 C_DEFINES=$(C_DEFINES) -DNDIS_MINIPORT_DRIVER -DNDIS_WDM=1 \\r
-       -DDEPRECATE_DDK_FUNCTIONS -DNDIS51_MINIPORT -DBINARY_COMPATIBLE=0 -DLBFO_ENABLED\r
+       -DDEPRECATE_DDK_FUNCTIONS -DNDIS51_MINIPORT -DBINARY_COMPATIBLE=0 -DLBFO_ENABLED=1\r
+\r
+#!if $(FREEBUILD)\r
+#  Free build will printout error messages\r
+#C_DEFINES=$(C_DEFINES) -DFREE_BUILD_DBG=1\r
+#!endif\r
 \r
 TARGETLIBS= \\r
        $(DDK_LIB_PATH)\ntoskrnl.lib \\r
index 8948bbc0dd7f60d3551a0700b80126a6a963eaa5..91db0ed0132cb67e2c19b6fb0aadbc62c2642b8d 100644 (file)
@@ -80,7 +80,7 @@ AddService = vnic,%SPSVCINST_ASSOCSERVICE%,vnic.ServiceInstall,vnic.EventLogInst
 qlc_vnic.sys,,,2\r
 \r
 [vnic.AddReg]\r
-HKR, Ndi,                       Service,    0, "qlc_vnic"\r
+HKR, Ndi,                       Service,    0, "vnic"\r
 HKR, Ndi\Interfaces,            UpperRange, 0, "ndis5"\r
 HKR, Ndi\Interfaces,            LowerRange, 0, "ethernet"\r
 \r
@@ -106,7 +106,7 @@ HKR, Ndi\Params\PayloadMtu,       Type,           0, "dword"
 HKR, Ndi\Params\PayloadMtu,       Default,        0, "1500"\r
 HKR, Ndi\Params\PayloadMtu,       Min,            0, "1500"\r
 HKR, Ndi\Params\PayloadMtu,       Max,            0, "9500"\r
-HKR, Ndi\Params\PayloadMtu,       Step,           0, "500"\r
+HKR, Ndi\Params\PayloadMtu,       Step,           0, "100"\r
 HKR, Ndi\Params\PayloadMtu,       Base,           0, "10"\r
 \r
 HKR, Ndi\Params\UseTxCsum,        ParamDesc,      0, "Send Chksum Offload"\r
index 1b5c14c990403f94b7a68eb2e670fc933b2c3632..7be95023b0cb5edbedf0f4fde4ec4eccec093e29 100644 (file)
@@ -121,7 +121,7 @@ static void
 __adapter_cleanup(\r
        IN      vnic_adapter_t          *p_adapter );\r
 \r
-#if defined( LBFO_ENABLED )\r
+#if ( LBFO_ENABLED )\r
 \r
 static NDIS_STATUS\r
 __adapter_set_failover_primary(\r
@@ -221,7 +221,7 @@ vnic_create_adapter(
        /* set adapter level params here */\r
        p_adapter->vlan_info = p_adapter->params.VlanInfo;\r
 \r
-#if defined (LBFO_ENABLED)\r
+#if ( LBFO_ENABLED )\r
 \r
        p_adapter->failover.bundle_id = p_adapter->params.bundle_id;\r
        p_adapter->failover.fo_state = _ADAPTER_NOT_BUNDLED;\r
@@ -264,7 +264,7 @@ vnic_destroy_adapter(
 \r
        _adapter_close_ca( p_adapter );\r
 \r
-#if defined( LBFO_ENABLED )\r
+#if ( LBFO_ENABLED )\r
 \r
        __adapter_remove_from_failover_list( p_adapter );\r
 \r
@@ -567,7 +567,7 @@ vnic_get_adapter_params(
        p_params->ViportHbInterval = ( status != NDIS_STATUS_SUCCESS ) ?\r
                VIPORT_HEARTBEAT_INTERVAL : p_reg_prm->ParameterData.IntegerData;\r
 \r
-#if defined(LBFO_ENABLED)\r
+#if ( LBFO_ENABLED )\r
        /* read Failover group Name/Number */\r
 \r
        RtlInitUnicodeString( &keyword, L"BundleId" );\r
@@ -657,8 +657,8 @@ adapter_viport_allocate(
        NdisZeroMemory( p_viport, sizeof(viport_t) );\r
        NdisAllocateSpinLock( &p_viport->lock );\r
        InitializeListHead( &p_viport->listPtrs );\r
-       KeInitializeEvent( &p_viport->sync_event, SynchronizationEvent, FALSE );\r
-\r
+       cl_event_init( &p_viport->sync_event, FALSE );\r
+       \r
        p_viport->p_adapter = p_adapter;\r
        viport_config_defaults ( p_viport );\r
 \r
@@ -975,7 +975,7 @@ __vnic_pnp_cb(
        vnic_path_record_t              *p_path_record;\r
        Netpath_t*                              p_netpath = NULL;\r
 \r
-#if defined( LBFO_ENABLED )\r
+#if ( LBFO_ENABLED )\r
        vnic_adapter_t                  *p_primary_adapter;     \r
 #endif\r
 \r
@@ -1050,15 +1050,6 @@ __vnic_pnp_cb(
                                        netpath_linkDown( p_adapter->p_currentPath );\r
                                        __pending_queue_cleanup( p_adapter );\r
                                }\r
-                               /*\r
-                               if( p_adapter->p_currentPath == &p_adapter->primaryPath )\r
-                                       p_netpath = &p_adapter->secondaryPath;\r
-                               else\r
-                                       p_netpath = &p_adapter->primaryPath;\r
-\r
-                               netpath_free( p_adapter->p_currentPath );\r
-                               netpath_free( p_netpath );\r
-                               */\r
                        }\r
                        break;\r
 \r
@@ -1112,14 +1103,12 @@ __vnic_pnp_cb(
                                break;\r
                        }\r
 \r
-                       if( ( InterlockedCompareExchange( (volatile LONG *)&p_adapter->state,   \r
-                                               INIC_REGISTERED, INIC_UNINITIALIZED ) == INIC_UNINITIALIZED )\r
-#if defined( LBFO_ENABLED )\r
-                                               || ( p_adapter->failover.fo_state == _ADAPTER_NOT_BUNDLED )\r
-#endif\r
-                               )\r
+                       InterlockedCompareExchange( (volatile LONG *)&p_adapter->state, \r
+                                                                                       INIC_REGISTERED, INIC_UNINITIALIZED );\r
+#if ( LBFO_ENABLED )\r
+\r
+                       if( p_adapter->failover.fo_state == _ADAPTER_NOT_BUNDLED )\r
                        {\r
-#if defined( LBFO_ENABLED )\r
                                /* we don't look for zero id, since it meant to be primary by default */\r
                                if( p_adapter->failover.bundle_id != 0 && \r
                                        ( p_primary_adapter = __adapter_find_on_failover_list( _ADAPTER_PRIMARY,\r
@@ -1134,8 +1123,10 @@ __vnic_pnp_cb(
                                        /* bundle_id '0' , all go to primary */\r
                                        __adapter_set_failover_primary( p_adapter, FALSE );\r
                                }\r
-#endif // LBFO_ENABLED\r
                        }\r
+\r
+#endif // LBFO_ENABLED\r
+\r
                        break;\r
 \r
                case IB_PNP_IOC_PATH_REMOVE:\r
@@ -1323,7 +1314,7 @@ __vnic_pnp_dereg_cb(
        \r
        if( p_adapter->pnp_state != IB_PNP_IOC_REMOVE )\r
        {\r
-\r
+               p_adapter->pnp_state = IB_PNP_IOC_ADD;\r
                /* Register for IOC events */\r
                pnp_req.pfn_pnp_cb = __vnic_pnp_cb;\r
                pnp_req.pnp_class = IB_PNP_IOC | IB_PNP_FLAG_REG_SYNC;\r
@@ -1368,25 +1359,26 @@ adapter_reset(
                return IB_INVALID_STATE;\r
 \r
        p_adapter->reset = TRUE;\r
+       p_adapter->hung = 0;\r
 \r
+#if ( LBFO_ENABLED )\r
        __adapter_remove_from_failover_list( p_adapter );\r
 \r
+#endif // LBFO_ENABLED\r
+\r
        if( p_adapter->h_pnp )\r
        {\r
                h_pnp = p_adapter->h_pnp;\r
                p_adapter->h_pnp  = NULL;\r
-\r
-               p_adapter->hung = 0;\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
        else\r
        {\r
                status = IB_NOT_FOUND;\r
        }\r
-\r
-       if( status == IB_SUCCESS )\r
-               status = IB_NOT_DONE;\r
-\r
+       \r
        VNIC_EXIT( VNIC_DBG_INIT );\r
        return status;\r
 }\r
@@ -1623,7 +1615,10 @@ adapter_netpath_update_and_connect(
                        p_viport->p_netpath->instance,\r
                        netpath_to_string( p_viport->p_netpath ) ));\r
 \r
-       p_adapter->num_paths++;\r
+       if( p_viport->state == VIPORT_CONNECTED )\r
+       {\r
+               p_adapter->num_paths++;\r
+       }\r
 \r
        if( p_adapter->num_paths > 1 &&\r
                p_viport->p_netpath != p_adapter->p_currentPath )\r
@@ -1651,7 +1646,7 @@ err:
        return ib_status;\r
 }\r
 \r
-#if defined( LBFO_ENABLED )\r
+#if ( LBFO_ENABLED )\r
 \r
 static void\r
 __adapter_add_to_failover_list(\r
@@ -1692,8 +1687,7 @@ __adapter_remove_from_failover_list(
        if( lbfo_state == _ADAPTER_PRIMARY )\r
        {\r
                cl_qlist_remove_item( &g_vnic.primary_list, &p_adapter->list_item );\r
-               NdisMRemoveMiniport( p_adapter->h_handle );\r
-\r
+       \r
                /* search for secondary adapter with same id && (id != 0 ) */\r
                if( bundle_id != 0 )\r
                {\r
@@ -1702,8 +1696,8 @@ __adapter_remove_from_failover_list(
                \r
                        if( p_adapter_to_promote &&\r
                                p_adapter_to_promote->pnp_state != IB_PNP_IOC_REMOVE &&\r
-                               ( p_adapter_to_promote->reset == FALSE || \r
-                               p_adapter_to_promote->hung  < p_adapter_to_promote->num_paths ) )\r
+                               p_adapter_to_promote->state == INIC_REGISTERED &&\r
+                               p_adapter_to_promote->reset == FALSE )\r
                        {\r
                                /* a small recursion */\r
                                __adapter_set_failover_primary( p_adapter_to_promote, TRUE );\r
@@ -1717,9 +1711,11 @@ __adapter_remove_from_failover_list(
                                ("IOC[%d]  LBFO bundle %d Secondary Adapter Removed\n", \r
                                p_adapter->ioc_num, p_adapter->failover.bundle_id ));\r
        }\r
-       else\r
-               VNIC_TRACE( VNIC_DBG_ERROR,\r
+       else if( lbfo_state == _ADAPTER_NOT_BUNDLED )\r
+       {\r
+               VNIC_TRACE( VNIC_DBG_INFO,\r
                ("IOC[%d] Adapter not bundled\n", p_adapter->ioc_num ));\r
+       }\r
 \r
        return;\r
 }\r
index 969c363e6058a930077c58ce93a2b4fcefbf64a1..cd143b52c64dad0d93b041853d2f767a45fab985 100644 (file)
@@ -139,7 +139,7 @@ typedef struct _vnic_adapter {
        struct Netpath                  secondaryPath;\r
        struct Netpath                  *p_currentPath;\r
        vnic_params_t                   params;\r
-       int                                             num_paths;\r
+       uint32_t                                num_paths;\r
        int                                             macSet;\r
        int                                             mc_count;\r
        mac_addr_t                              mcast_array[MAX_MCAST];\r
@@ -149,7 +149,7 @@ typedef struct _vnic_adapter {
        uint32_t                                link_speed;\r
        uint32_t                                packet_filter;\r
        uint32_t                                vlan_info;\r
-       int                                             hung;\r
+       uint32_t                                hung;\r
        BOOLEAN                                 reset;\r
        BOOLEAN                                 pending_set;\r
        BOOLEAN                                 pending_query;\r
@@ -157,7 +157,7 @@ typedef struct _vnic_adapter {
        pending_oid_t                   set_oid;\r
        ib_svc_entry_t                  svc_entries[2];\r
 \r
-#if defined( LBFO_ENABLED )\r
+#if ( LBFO_ENABLED )\r
        lbfo_failover_t                 failover;\r
 #endif\r
 #ifdef VNIC_STATISTIC\r
index 96dad841309ba17b3f2b453e89607e1d27d4aa14..9568b08ffe25ba5d68df42183d889296e7b875c7 100644 (file)
@@ -191,7 +191,7 @@ typedef struct {
 typedef struct _vnic_globals {\r
        NDIS_HANDLE                     ndis_handle; // ndis wrapper handle\r
        NDIS_SPIN_LOCK          lock;\r
-#if defined (LBFO_ENABLED)\r
+#if ( LBFO_ENABLED )\r
        cl_qlist_t                      primary_list;\r
        cl_qlist_t                      secondary_list;\r
 #endif\r
index f3fb07f9de72809918ebd1ca3e10646dbc877e27..c8967a8621b2696a7133721ba007eaa8db3aaa89 100644 (file)
@@ -1236,9 +1236,10 @@ control_recvComplete(
                        return;\r
        }\r
 \r
-       if( (pCHdr->pktSeqNum != pControl->seqNum) ||\r
-               !InterlockedExchange( (volatile LONG*)&pControl->rspExpected, FALSE ) )\r
+       if( !InterlockedExchange( (volatile LONG*)&pControl->rspExpected, FALSE ) )\r
        {\r
+               VNIC_TRACE_EXIT( VNIC_DBG_ERROR,\r
+                       ("UNEXPECTED RSP Packet CMD: %d\n",     pCHdr->pktCmd ) );\r
                return;\r
        }\r
 \r
@@ -1410,12 +1411,10 @@ static ib_api_status_t
 control_send(\r
        IN              Control_t               *pControl )\r
 {\r
-       ib_api_status_t ib_status;\r
        Inic_ControlPacket_t *pPkt = control_packet(&pControl->sendIo);\r
 \r
        VNIC_ENTER ( VNIC_DBG_CTRL );\r
 \r
-       //ASSERT( !pControl->reqOutstanding );\r
        if ( InterlockedCompareExchange( (volatile LONG*)&pControl->reqOutstanding,\r
                                                                        TRUE, FALSE ) == TRUE )\r
        {\r
@@ -1425,14 +1424,12 @@ control_send(
                 */\r
                VNIC_TRACE_EXIT( VNIC_DBG_ERROR,\r
                        ("IB Send never completed\n" ) );\r
-               viport_failure( pControl->p_viport );\r
-               return IB_ERROR;\r
+               goto failure;\r
        }\r
 \r
 #ifdef _DEBUG_\r
        //__control_logControlPacket( pPkt );\r
 #endif\r
-\r
        InterlockedExchange( (volatile LONG*)&pControl->rspExpected,\r
                                                                                (LONG)pPkt->hdr.pktCmd );\r
 \r
@@ -1442,18 +1439,23 @@ control_send(
        pControl->statistics.requestTime = cl_get_time_stamp();\r
 #endif /* VNIC_STATISTIC */\r
 \r
-       ib_status = ibqp_postSend( &pControl->qp, &pControl->sendIo.io );\r
-       if( ib_status != IB_SUCCESS )\r
+       if( ( ibqp_postSend( &pControl->qp, &pControl->sendIo.io )) != IB_SUCCESS )\r
        {\r
                InterlockedExchange((volatile LONG*)&pControl->reqOutstanding, FALSE );\r
 \r
                VNIC_TRACE( VNIC_DBG_ERROR,\r
                        ("IOC %d: Failed to post send\n", pControl->p_viport->ioc_num ) );\r
-               viport_failure( pControl->p_viport );\r
+               goto failure;\r
        }\r
+       \r
+       VNIC_EXIT( VNIC_DBG_CTRL );\r
+       return IB_SUCCESS;\r
 \r
+failure:\r
+       pControl->p_viport->p_adapter->hung++;\r
+       viport_failure( pControl->p_viport );\r
        VNIC_EXIT( VNIC_DBG_CTRL );\r
-       return ib_status;\r
+       return IB_ERROR;\r
 }\r
 \r
 \r
@@ -1583,7 +1585,6 @@ control_getRsp(
                        VNIC_TRACE( VNIC_DBG_ERROR,\r
                                ("IOC %d: Control packet retry exceeded\n",\r
                                                pControl->p_viport->ioc_num ) );\r
-                       viport_failure(pControl->p_viport );\r
                }\r
                else\r
                {\r
index 8f007a579642bc2493ff3e1befa2ecdeafb57ef4..4f39a64352dcafeec8ca3c4a842feaa23f6d4f5e 100644 (file)
@@ -609,7 +609,7 @@ data_xmitPacket(
        {\r
                pRdmaIo->p_trailer->txChksumFlags = 0;\r
        }\r
-       pRdmaIo->p_trailer->connectionHashAndValid |= CHV_VALID;\r
+       pRdmaIo->p_trailer->connectionHashAndValid = CHV_VALID;\r
 \r
        if( last )\r
                pRdmaIo->p_trailer->pktFlags |= PF_KICK;\r
@@ -664,18 +664,27 @@ _tx_chksum_flags(
                packet_info = PtrToUlong( NDIS_PER_PACKET_INFO_FROM_PACKET( p_packet, TcpIpChecksumPacketInfo));\r
                p_packet_info = ( NDIS_TCP_IP_CHECKSUM_PACKET_INFO *)&packet_info;\r
 \r
-               if( p_packet_info &&\r
-                       p_packet_info->Transmit.NdisPacketChecksumV4 )\r
+               if( p_packet_info )\r
                {\r
-                       txChksumFlags = TX_CHKSUM_FLAGS_CHECKSUM_V4\r
-                       | ( p_packet_info->Transmit.NdisPacketIpChecksum ? TX_CHKSUM_FLAGS_IP_CHECKSUM: 0 )\r
-                       | ( p_packet_info->Transmit.NdisPacketTcpChecksum ? TX_CHKSUM_FLAGS_TCP_CHECKSUM: 0 )\r
-                       | ( p_packet_info->Transmit.NdisPacketUdpChecksum ? TX_CHKSUM_FLAGS_UDP_CHECKSUM: 0 );\r
+                       if( p_packet_info->Transmit.NdisPacketChecksumV4 )\r
+                       {\r
+                               txChksumFlags = TX_CHKSUM_FLAGS_CHECKSUM_V4\r
+                               | ( p_packet_info->Transmit.NdisPacketIpChecksum ? TX_CHKSUM_FLAGS_IP_CHECKSUM: 0 )\r
+                               | ( p_packet_info->Transmit.NdisPacketTcpChecksum ? TX_CHKSUM_FLAGS_TCP_CHECKSUM: 0 )\r
+                               | ( p_packet_info->Transmit.NdisPacketUdpChecksum ? TX_CHKSUM_FLAGS_UDP_CHECKSUM: 0 );\r
+                       }\r
+                       else if( p_packet_info->Transmit.NdisPacketChecksumV6 )\r
+                       {\r
+                               txChksumFlags = TX_CHKSUM_FLAGS_CHECKSUM_V6\r
+                               | ( p_packet_info->Transmit.NdisPacketIpChecksum ? TX_CHKSUM_FLAGS_IP_CHECKSUM: 0 )\r
+                               | ( p_packet_info->Transmit.NdisPacketTcpChecksum ? TX_CHKSUM_FLAGS_TCP_CHECKSUM: 0 )\r
+                               | ( p_packet_info->Transmit.NdisPacketUdpChecksum ? TX_CHKSUM_FLAGS_UDP_CHECKSUM: 0 );\r
+                       }\r
                }\r
        }\r
        \r
        VNIC_TRACE( VNIC_DBG_DATA ,\r
-                               ("txChksumFlags = %d: V4 %c, V6 %c, IP %c, TCP %c, UDP %c\n",\r
+               ("txChksumFlags = %#x: V4 %c, V6 %c, IP %c, TCP %c, UDP %c\n",\r
                                txChksumFlags,\r
                                ((txChksumFlags & TX_CHKSUM_FLAGS_CHECKSUM_V4 )? '+': '-'),\r
                                ((txChksumFlags & TX_CHKSUM_FLAGS_CHECKSUM_V6 )? '+': '-'),\r
@@ -1073,7 +1082,7 @@ _data_recv_to_ndis_pkt(
                rxChksumFlags = pTrailer->rxChksumFlags;\r
 \r
                VNIC_TRACE( VNIC_DBG_DATA,\r
-                       ("rxChksumFlags = %d, LOOP = %c, IP = %c, TCP = %c, UDP = %c\n",\r
+                       ("rxChksumFlags = %#x, LOOP = %c, IP = %c, TCP = %c, UDP = %c\n",\r
                        rxChksumFlags,\r
                        (rxChksumFlags & RX_CHKSUM_FLAGS_LOOPBACK)? 'Y': 'N',\r
                        (rxChksumFlags & RX_CHKSUM_FLAGS_IP_CHECKSUM_SUCCEEDED)? 'Y':\r
index e5ede83a96bb9be803300ddb1309a666a3b3c9c4..942fa571f2bc6d6f3af00661b345d5ae99694ca5 100644 (file)
@@ -181,7 +181,7 @@ DriverEntry(
                __vnic_read_machine_name();\r
                __vnic_read_service_registry( p_registry_path );\r
 \r
-#if defined (LBFO_ENABLED)\r
+#if ( LBFO_ENABLED )\r
                cl_qlist_init( &g_vnic.primary_list );\r
                cl_qlist_init( &g_vnic.secondary_list );\r
 #endif\r
@@ -291,16 +291,24 @@ vnic_initialize(
        {\r
                VNIC_TRACE( VNIC_DBG_ERROR,\r
                        ("ib_reg_pnp returned %s\n", p_adapter->ifc.get_err_str( ib_status )) );\r
+               NdisWriteErrorLogEntry( h_handle,\r
+                       NDIS_ERROR_CODE_OUT_OF_RESOURCES, 0);\r
                status = NDIS_STATUS_FAILURE;\r
-               goto failure;\r
+       }\r
+       else if( p_adapter->state != INIC_REGISTERED )\r
+       {\r
+               status = NDIS_STATUS_OPEN_FAILED;\r
+               *p_open_status = NDIS_STATUS_DEVICE_FAILED;\r
+\r
+               VNIC_TRACE( VNIC_DBG_ERROR,\r
+                       ("IOC[%d] ADAPTER Initialization Failed\n",     p_adapter->ioc_num ) );\r
+               NdisWriteErrorLogEntry( h_handle, \r
+                       NDIS_ERROR_CODE_HARDWARE_FAILURE, 1, p_adapter->ioc_num );\r
        }\r
 \r
-       if( p_adapter->state != INIC_REGISTERED )\r
+       if( status != NDIS_STATUS_SUCCESS )\r
        {\r
-               status = NDIS_STATUS_FAILURE;\r
-failure:\r
                vnic_destroy_adapter( p_adapter );\r
-               return status;\r
        }\r
 \r
        VNIC_EXIT( VNIC_DBG_INIT );\r
@@ -352,8 +360,9 @@ vnic_check_for_hang(
        if( p_adapter->hung != 0 && \r
                p_adapter->hung >= p_adapter->num_paths )\r
        {\r
-                       VNIC_TRACE( VNIC_DBG_WARN, \r
-                               ("IOC[%d] Adapter Hung\n", p_adapter->ioc_num ));\r
+               VNIC_TRACE( VNIC_DBG_ERROR, \r
+                       ("IOC[%d] Adapter Hung: %d NumPath: %d\n",\r
+                       p_adapter->ioc_num,     p_adapter->hung, p_adapter->num_paths ) );\r
                        return TRUE;\r
        }\r
 \r
@@ -1088,7 +1097,6 @@ __vnic_get_tcp_task_offload(
        ULONG                                           buf_len;\r
        uint32_t                                        enabled_TxCsum;\r
        uint32_t                                        enabled_RxCsum;\r
-       viport_t                                        *p_viport;\r
 \r
        buf_len = sizeof(NDIS_TASK_OFFLOAD_HEADER) +\r
                sizeof(NDIS_TASK_OFFLOAD) +\r
@@ -1108,20 +1116,18 @@ __vnic_get_tcp_task_offload(
        {\r
                return NDIS_STATUS_INVALID_DATA;\r
        }\r
-       p_viport = p_adapter->p_currentPath->pViport;\r
-\r
        /* too early, we didn't get response on CMD_INIT_INIC yet */\r
-       if( !p_viport || !viport_features( p_viport ) )\r
+       if( !netpath_is_connected( p_adapter->p_currentPath ) )\r
        {\r
                return NDIS_STATUS_NOT_ACCEPTED;\r
        }\r
-\r
        enabled_RxCsum = \r
                (uint32_t)( p_adapter->params.UseRxCsum && \r
-                                       viport_canRxCsum( p_adapter->p_currentPath->pViport ) );\r
+               netpath_canRxCsum( p_adapter->p_currentPath ) );\r
+\r
        enabled_TxCsum = \r
-               (uint32_t)( p_adapter->params.UseTxCsum && \r
-                                       viport_canTxCsum( p_adapter->p_currentPath->pViport ) );\r
+               (uint32_t)( p_adapter->params.UseTxCsum &&\r
+               netpath_canTxCsum( p_adapter->p_currentPath ) );\r
 \r
        p_offload_hdr->OffsetFirstTask = sizeof(NDIS_TASK_OFFLOAD_HEADER);\r
        p_offload_task = (NDIS_TASK_OFFLOAD*)(p_offload_hdr + 1);\r
@@ -1145,15 +1151,15 @@ __vnic_get_tcp_task_offload(
        p_offload_chksum->V4Receive.UdpChecksum = enabled_RxCsum;\r
        p_offload_chksum->V4Receive.IpChecksum = enabled_RxCsum;\r
 \r
-       p_offload_chksum->V6Transmit.IpOptionsSupported = FALSE;\r
-       p_offload_chksum->V6Transmit.TcpOptionsSupported = FALSE;\r
-       p_offload_chksum->V6Transmit.TcpChecksum = FALSE;\r
-       p_offload_chksum->V6Transmit.UdpChecksum = FALSE;\r
+       p_offload_chksum->V6Transmit.IpOptionsSupported = enabled_TxCsum;\r
+       p_offload_chksum->V6Transmit.TcpOptionsSupported = enabled_TxCsum;\r
+       p_offload_chksum->V6Transmit.TcpChecksum = enabled_TxCsum;\r
+       p_offload_chksum->V6Transmit.UdpChecksum = enabled_TxCsum;\r
 \r
-       p_offload_chksum->V6Receive.IpOptionsSupported = FALSE;\r
-       p_offload_chksum->V6Receive.TcpOptionsSupported = FALSE;\r
-       p_offload_chksum->V6Receive.TcpChecksum = FALSE;\r
-       p_offload_chksum->V6Receive.UdpChecksum = FALSE;\r
+       p_offload_chksum->V6Receive.IpOptionsSupported = enabled_RxCsum;\r
+       p_offload_chksum->V6Receive.TcpOptionsSupported = enabled_RxCsum;\r
+       p_offload_chksum->V6Receive.TcpChecksum = enabled_RxCsum;\r
+       p_offload_chksum->V6Receive.UdpChecksum = enabled_RxCsum;\r
 \r
        *(p_oid_info->p_bytes_used) = buf_len;\r
 \r
@@ -1175,6 +1181,11 @@ __vnic_set_tcp_task_offload(
 \r
        VNIC_ENTER( VNIC_DBG_OID );\r
 \r
+       if( !netpath_is_connected( p_adapter->p_currentPath ) )\r
+       {\r
+               return NDIS_STATUS_NOT_ACCEPTED;\r
+       }\r
+\r
        p_offload_hdr = (NDIS_TASK_OFFLOAD_HEADER*)p_info_buf;\r
 \r
        if( *p_info_len < sizeof(NDIS_TASK_OFFLOAD_HEADER) )\r
@@ -1211,16 +1222,22 @@ __vnic_set_tcp_task_offload(
                (NDIS_TASK_TCP_IP_CHECKSUM*)p_offload_task->TaskBuffer;\r
 \r
        enabled_TxCsum = \r
-               ( p_adapter->params.UseTxCsum && viport_canTxCsum( p_adapter->p_currentPath->pViport ) );\r
+               ( p_adapter->params.UseTxCsum && \r
+                       netpath_canTxCsum( p_adapter->p_currentPath ) );\r
        enabled_RxCsum = \r
-               ( p_adapter->params.UseRxCsum && viport_canRxCsum( p_adapter->p_currentPath->pViport ) );\r
+               ( p_adapter->params.UseRxCsum && \r
+                       netpath_canRxCsum( p_adapter->p_currentPath ) );\r
        \r
        if( !enabled_TxCsum &&\r
                (p_offload_chksum->V4Transmit.IpOptionsSupported ||\r
                p_offload_chksum->V4Transmit.TcpOptionsSupported ||\r
                p_offload_chksum->V4Transmit.TcpChecksum ||\r
                p_offload_chksum->V4Transmit.UdpChecksum ||\r
-               p_offload_chksum->V4Transmit.IpChecksum) )\r
+               p_offload_chksum->V4Transmit.IpChecksum ||\r
+               p_offload_chksum->V6Transmit.IpOptionsSupported ||\r
+               p_offload_chksum->V6Transmit.TcpOptionsSupported ||\r
+               p_offload_chksum->V6Transmit.TcpChecksum ||\r
+               p_offload_chksum->V6Transmit.UdpChecksum ) )\r
        {\r
                return NDIS_STATUS_NOT_SUPPORTED;\r
        }\r
@@ -1230,22 +1247,15 @@ __vnic_set_tcp_task_offload(
                p_offload_chksum->V4Receive.TcpOptionsSupported ||\r
                p_offload_chksum->V4Receive.TcpChecksum ||\r
                p_offload_chksum->V4Receive.UdpChecksum ||\r
-               p_offload_chksum->V4Receive.IpChecksum) )\r
-       {\r
-               return NDIS_STATUS_NOT_SUPPORTED;\r
-       }\r
-\r
-       if( p_offload_chksum->V6Receive.IpOptionsSupported ||\r
+               p_offload_chksum->V4Receive.IpChecksum ||\r
+               p_offload_chksum->V6Receive.IpOptionsSupported ||\r
                p_offload_chksum->V6Receive.TcpOptionsSupported ||\r
                p_offload_chksum->V6Receive.TcpChecksum ||\r
-               p_offload_chksum->V6Receive.UdpChecksum  ||\r
-               p_offload_chksum->V6Transmit.IpOptionsSupported ||\r
-               p_offload_chksum->V6Transmit.TcpOptionsSupported ||\r
-               p_offload_chksum->V6Transmit.TcpChecksum ||\r
-               p_offload_chksum->V6Transmit.UdpChecksum )\r
+               p_offload_chksum->V6Receive.UdpChecksum ) )\r
        {\r
                return NDIS_STATUS_NOT_SUPPORTED;\r
        }\r
+\r
        VNIC_EXIT( VNIC_DBG_OID );\r
 \r
        return NDIS_STATUS_SUCCESS;\r
@@ -1830,7 +1840,7 @@ vnic_resume_oids(
                                                        &query_oid,\r
                                                        status,\r
                                                        p_netpath->p_adapter->mcast_array,\r
-                                                       ( sizeof( p_netpath->p_adapter->mcast_array ) * sizeof( mac_addr_t ) ) );\r
+                                                       p_adapter->mc_count * sizeof( mac_addr_t ) );\r
                         break;\r
                case OID_GEN_TRANSMIT_BUFFER_SPACE:\r
                        if( status == NDIS_STATUS_SUCCESS )\r
@@ -2020,7 +2030,8 @@ _vnic_process_packet_filter(
                if( !( p_viport->flags & INIC_FLAG_ENABLE_NIC ) )\r
                {\r
                        p_viport->newFlags &= ~INIC_FLAG_DISABLE_NIC;\r
-                       p_viport->newFlags |= INIC_FLAG_ENABLE_NIC;\r
+                       p_viport->newFlags |= INIC_FLAG_ENABLE_NIC | INIC_FLAG_SET_MTU;\r
+                       p_viport->newMtu = (uint16_t)p_adapter->params.MinMtu;\r
                        InterlockedOr( (volatile LONG*)&need_updates, NEED_LINK_CONFIG );\r
                }\r
 \r
index e9c1cb360e05fa5b2fb9aadda41ced1a32669e06..31f2884b42b626222ebf8d08168084a9f10ddd97 100644 (file)
@@ -450,7 +450,8 @@ _ibqp_rej_cb(
                                ("Conn req reject status %d\n",\r
                                                cl_ntoh16( p_rej_rec->rej_status )) );\r
        }\r
-       viport_failure( pQp->pViport );\r
+\r
+       pQp->pViport->p_adapter->hung++;\r
        cl_event_signal( &pQp->pViport->sync_event );\r
 }\r
 \r
@@ -729,10 +730,10 @@ _ibqp_connect_cb(
        if ( ib_status != IB_SUCCESS )\r
        {\r
                VNIC_TRACE_EXIT( VNIC_DBG_ERROR,\r
-                                       ("Send RTU failed\n") );\r
+                       ("Send RTU failed: status %#x\n", ib_status ) );\r
 err:\r
                InterlockedExchange( &pQp->qpState, IB_DETACHED );\r
-               viport_failure( p_viport );\r
+               pQp->pViport->p_adapter->hung++;\r
        }\r
        else\r
        {\r
index 1503321ed92386ff00862a186c0a47554520f478..8dde7deb722aeb6cb32a2f709bf85e38f42a0d8c 100644 (file)
@@ -181,30 +181,56 @@ void
 ibqp_construct(\r
        IN      OUT             IbQp_t                  *pQp,\r
        IN                      struct _viport  *pViport );\r
-ib_api_status_t ibqp_init(IbQp_t *pQp, uint64_t guid, struct IbConfig *p_conf);\r
-ib_api_status_t ibqp_connect(IbQp_t *pQp);\r
-void    ibqp_detach(IbQp_t *pQp);\r
-void    ibqp_cleanup(IbQp_t *pQp);\r
-ib_api_status_t ibqp_postSend(IbQp_t *pQp, Io_t *pIo);\r
-ib_api_status_t ibqp_postRecv(IbQp_t *pQp, Io_t *pIo);\r
 \r
-uint8_t  ibca_findPortNum( struct _viport *p_viport, uint64_t guid );\r
+ib_api_status_t \r
+ibqp_init(\r
+       IN              IbQp_t                          *pQp, \r
+       IN              uint64_t                        guid,\r
+       IN      OUT     struct IbConfig         *p_conf);\r
+\r
+ib_api_status_t \r
+ibqp_connect(\r
+       IN              IbQp_t                          *pQp);\r
+\r
+void\r
+ibqp_detach(\r
+       IN              IbQp_t                          *pQp);\r
+\r
+void\r
+ibqp_cleanup(\r
+       IN              IbQp_t                          *pQp);\r
+\r
+ib_api_status_t\r
+ibqp_postSend(\r
+       IN              IbQp_t          *pQp,\r
+       IN              Io_t            *pIo);\r
+\r
+ib_api_status_t\r
+ibqp_postRecv(\r
+       IN              IbQp_t          *pQp,\r
+       IN              Io_t            *pIo);\r
+uint8_t\r
+ibca_findPortNum( \r
+       IN              struct _viport  *p_viport,\r
+       IN              uint64_t                guid );\r
 \r
 ib_api_status_t\r
 ibregion_init(\r
-               IN              struct _viport          *p_viport,\r
-               OUT             IbRegion_t                      *pRegion,\r
-               IN              ib_pd_handle_t          hPd,\r
-               IN              void* __ptr64           vaddr,\r
-               IN              uint64_t                        len,\r
-               IN              ib_access_t                     access_ctrl );\r
+       IN              struct _viport          *p_viport,\r
+       OUT             IbRegion_t                      *pRegion,\r
+       IN              ib_pd_handle_t          hPd,\r
+       IN              void* __ptr64           vaddr,\r
+       IN              uint64_t                        len,\r
+       IN              ib_access_t                     access_ctrl );\r
 \r
 void\r
 ibregion_cleanup(\r
-                                struct _viport *p_viport,\r
-                                IbRegion_t *pRegion );\r
+       IN              struct _viport          *p_viport,\r
+       IN              IbRegion_t                      *pRegion );\r
 \r
-void ib_asyncEvent( ib_async_event_rec_t       *pEventRecord );\r
+void \r
+ib_asyncEvent( \r
+       IN              ib_async_event_rec_t    *pEventRecord );\r
 \r
 #define ibpd_fromCa(pCa) (&(pCa)->pd)\r
 \r
index b1b589a5539875561eff661a7aeb3531cb9263df..98ddb3749c11ff6e007316515f4af75cfa981a83 100644 (file)
@@ -269,29 +269,26 @@ netpath_stopXmit(
 void netpath_restartXmit(\r
                IN              Netpath_t               *pNetpath )\r
 {\r
-               VNIC_ENTER( VNIC_DBG_NETPATH );\r
+       VNIC_ENTER( VNIC_DBG_NETPATH );\r
 \r
-       if (pNetpath == pNetpath->p_adapter->p_currentPath )\r
+       if( ( netpath_is_connected( pNetpath ) ) &&\r
+               pNetpath == pNetpath->p_adapter->p_currentPath )\r
        {\r
-               if( !pNetpath->pViport->errored &&\r
-                       pNetpath->pViport->state == VIPORT_CONNECTED )\r
-               {\r
-                       InterlockedCompareExchange( &pNetpath->p_adapter->xmitStarted, 1, 0 );\r
-                       VNIC_TRACE( VNIC_DBG_NETPATH,\r
-                                       ("IOC[%d] instance %d Restart TRANSMIT\n", \r
-                                                       pNetpath->pViport->ioc_num, \r
-                                                       pNetpath->instance ));\r
-       \r
-               }\r
+               InterlockedCompareExchange( &pNetpath->p_adapter->xmitStarted, 1, 0 );\r
+               VNIC_TRACE( VNIC_DBG_NETPATH,\r
+                       ("IOC[%d] instance %d Restart TRANSMIT\n", \r
+                       pNetpath->pViport->ioc_num, \r
+                       pNetpath->instance ));\r
+\r
        }\r
 #ifdef INIC_STATISTICS\r
-               if (pNetpath->p_adapter->statistics.xmitRef != 0)\r
-               {\r
-                       pNetpath->p_adapter->statistics.xmitOffTime +=\r
-                               get_time_stamp_ms() - pNetpath->p_adapter->statistics.xmitRef;\r
-                       pNetpath->p_adapter->statistics.xmitOffNum++;\r
-                       pNetpath->p_adapter->statistics.xmitRef = 0;\r
-               }\r
+       if (pNetpath->p_adapter->statistics.xmitRef != 0)\r
+       {\r
+               pNetpath->p_adapter->statistics.xmitOffTime +=\r
+                       get_time_stamp_ms() - pNetpath->p_adapter->statistics.xmitRef;\r
+               pNetpath->p_adapter->statistics.xmitOffNum++;\r
+               pNetpath->p_adapter->statistics.xmitRef = 0;\r
+       }\r
 #endif /* INIC_STATISTICS */\r
        return;\r
 }\r
index 47fd0fbb57b4e432bd2c0262d22295a9d67d9570..f34c8bf43c903d62f9427ab8ec4d5f814bcdf8f4 100644 (file)
@@ -273,7 +273,11 @@ viport_unsetParent(
        InterlockedExchange( &p_viport->p_netpath->carrier, FALSE );\r
        p_viport->p_netpath->pViport = NULL;\r
        p_viport->p_netpath = NULL;\r
-       p_viport->p_adapter->num_paths--;\r
+       \r
+       if( p_viport->state == VIPORT_CONNECTED )\r
+       {\r
+               p_viport->p_adapter->num_paths--;\r
+       }\r
        return TRUE;\r
 }\r
 \r
@@ -286,7 +290,7 @@ viport_setLink(
                IN              BOOLEAN                 sync )\r
 {\r
 \r
-       NDIS_STATUS     status;\r
+       NDIS_STATUS     status = NDIS_STATUS_SUCCESS;\r
 \r
        VNIC_ENTER( VNIC_DBG_VIPORT );\r
 \r
@@ -300,16 +304,20 @@ viport_setLink(
 \r
        NdisAcquireSpinLock( &p_viport->lock );\r
        \r
-       if( ( (p_viport->flags & flags ) != flags ) || (p_viport->mtu != mtu ))\r
+       if( ( (p_viport->newFlags & flags ) != flags ) || \r
+               ( p_viport->newMtu != mtu ) )\r
        {\r
                p_viport->newFlags = flags;\r
                p_viport->newMtu = mtu;\r
                InterlockedOr( &p_viport->updates, NEED_LINK_CONFIG );\r
+       \r
+               NdisReleaseSpinLock( &p_viport->lock );\r
+       \r
+               status = _viport_process_query( p_viport, sync );\r
        }\r
-       NdisReleaseSpinLock( &p_viport->lock );\r
+       else\r
+               NdisReleaseSpinLock( &p_viport->lock );\r
 \r
-       status = _viport_process_query( p_viport, sync );\r
-       \r
        VNIC_EXIT( VNIC_DBG_VIPORT );\r
        return status;\r
 }\r
@@ -845,6 +853,7 @@ viport_control_connect(
        IN              viport_t*       const   p_viport )\r
 {\r
        ib_api_status_t ib_status;\r
+       cl_status_t             cl_status;\r
 \r
        VNIC_ENTER( VNIC_DBG_INIT );\r
 \r
@@ -873,19 +882,20 @@ viport_control_connect(
        {\r
                VNIC_TRACE_EXIT( VNIC_DBG_ERROR, \r
                        ("CMD_INIT_INIC  REQ failed\n") );\r
-               control_resetReq( &p_viport->control );\r
+\r
                control_cleanup( &p_viport->control );\r
                return ib_status;\r
        }\r
-       cl_event_wait_on( &p_viport->sync_event,\r
-                                               (p_viport->control.p_conf->rspTimeout << 11), TRUE );\r
+       cl_status = cl_event_wait_on( &p_viport->sync_event,\r
+                                               (p_viport->control.p_conf->rspTimeout << 11), FALSE );\r
 \r
        if( p_viport->linkState != LINK_INITINICRSP )\r
        {\r
                VNIC_TRACE_EXIT( VNIC_DBG_ERROR,\r
-                                       ("CMD_INIT_INIC RSP failed\n"));\r
+                       ("CMD_INIT_INIC RSP failed: return linkstate: %d, cl_status: %d\n",\r
+                       p_viport->linkState, cl_status ));\r
+\r
                ib_status = IB_INSUFFICIENT_RESOURCES;\r
-               control_resetReq( &p_viport->control );\r
                control_cleanup( &p_viport->control );\r
                return ib_status;\r
        }\r
@@ -897,8 +907,6 @@ viport_control_connect(
        {\r
                VNIC_TRACE( VNIC_DBG_ERROR,\r
                                ("Init MAC Addresses failed\n"));\r
-               \r
-               control_resetReq( &p_viport->control );\r
                control_cleanup( &p_viport->control );\r
        }\r
 \r
@@ -1183,3 +1191,42 @@ _viport_process_query(
        return status;\r
 }\r
 \r
+BOOLEAN\r
+viport_canTxCsum(\r
+       IN              viport_t*       p_viport ) \r
+{\r
+       if( !p_viport )\r
+               return FALSE;\r
+\r
+       return( BOOLEAN )( ( p_viport->featuresSupported &  \r
+                       ( INIC_FEAT_IPV4_HEADERS | \r
+                         INIC_FEAT_IPV6_HEADERS |\r
+                         INIC_FEAT_IPV4_CSUM_TX |\r
+                         INIC_FEAT_TCP_CSUM_TX  | \r
+                         INIC_FEAT_UDP_CSUM_TX ) ) == \r
+                       ( INIC_FEAT_IPV4_HEADERS | \r
+                         INIC_FEAT_IPV6_HEADERS | \r
+                         INIC_FEAT_IPV4_CSUM_TX | \r
+                         INIC_FEAT_TCP_CSUM_TX  |\r
+                         INIC_FEAT_UDP_CSUM_TX ) );\r
+}\r
+\r
+BOOLEAN\r
+viport_canRxCsum(\r
+       IN      viport_t*               p_viport )\r
+{\r
+       if( !p_viport )\r
+               return FALSE;\r
+\r
+       return( BOOLEAN )( ( p_viport->featuresSupported &  \r
+                       ( INIC_FEAT_IPV4_HEADERS | \r
+                         INIC_FEAT_IPV6_HEADERS |\r
+                         INIC_FEAT_IPV4_CSUM_RX |\r
+                         INIC_FEAT_TCP_CSUM_RX  | \r
+                         INIC_FEAT_UDP_CSUM_RX ) ) == \r
+                       ( INIC_FEAT_IPV4_HEADERS | \r
+                         INIC_FEAT_IPV6_HEADERS | \r
+                         INIC_FEAT_IPV4_CSUM_RX | \r
+                         INIC_FEAT_TCP_CSUM_RX  |\r
+                         INIC_FEAT_UDP_CSUM_RX ) );\r
+}\r
index eb0b2bd5bb42595d7ef79e3b981857f8c9fe8b94..b881e69f2a8b5312880966ba149de656dd016471 100644 (file)
@@ -143,7 +143,7 @@ typedef struct _viport {
        // connected/disconnected state of control and data QPs.\r
        viport_state_t                                  state;\r
 \r
-       // State machine state?\r
+       // Control Path cmd state Query/Rsp\r
        LinkState_t                                             linkState;\r
        LinkState_t                                             link_hb_state;\r
        Inic_CmdReportStatisticsRsp_t   stats;\r
@@ -157,11 +157,9 @@ typedef struct _viport {
 \r
        // Indicates actions (to the VEx) that need to be taken.\r
        volatile LONG                                   updates;\r
-       // ???\r
+\r
        uint8_t                                                 flags;\r
-       // TODO: Can we eliminate newFlags?\r
        uint8_t                                                 newFlags;\r
-\r
        uint16_t                                                mtu;\r
        uint16_t                                                newMtu;\r
        uint32_t                                                errored;\r
@@ -367,8 +365,16 @@ netpath_to_string(
 \r
 BOOLEAN\r
 netpath_setUnicast(\r
-               IN              Netpath_t*              p_netpath,\r
-               IN              uint8_t*                p_address );\r
+       IN              Netpath_t*              p_netpath,\r
+       IN              uint8_t*                p_address );\r
+\r
+BOOLEAN\r
+viport_canTxCsum(\r
+       IN              viport_t*               p_viport );\r
+\r
+BOOLEAN\r
+viport_canRxCsum(\r
+       IN              viport_t*               p_viport );\r
 \r
 #define  viport_portGuid(pViport) ((pViport)->portGuid)\r
 #define  viport_maxMtu(pViport) data_maxMtu(&(pViport)->data)\r
@@ -378,20 +384,13 @@ netpath_setUnicast(
 \r
 #define  viport_features(pViport) ( (pViport)->featuresSupported )\r
 \r
-#define  viport_canTxCsum(pViport) \\r
-               ( (pViport) && ((pViport)->featuresSupported & \\r
-               (INIC_FEAT_IPV4_CSUM_TX|INIC_FEAT_TCP_CSUM_TX|INIC_FEAT_UDP_CSUM_TX)) \\r
-               == (INIC_FEAT_IPV4_CSUM_TX|INIC_FEAT_TCP_CSUM_TX|INIC_FEAT_UDP_CSUM_TX))\r
-\r
-#define  viport_canRxCsum(pViport) \\r
-                       ( (pViport) && ((pViport)->featuresSupported & \\r
-                       (INIC_FEAT_IPV4_CSUM_RX|INIC_FEAT_TCP_CSUM_RX|INIC_FEAT_UDP_CSUM_RX)) \\r
-                       == (INIC_FEAT_IPV4_CSUM_RX|INIC_FEAT_TCP_CSUM_RX|INIC_FEAT_UDP_CSUM_RX))\r
-\r
 #define netpath_getHwAddr(pNetpath, pAddress) \\r
                        viport_getHwAddr((pNetpath)->pViport, pAddress)\r
 \r
 #define netpath_canTxCsum(pNetpath) \\r
                        viport_canTxCsum( (pNetpath)->pViport )\r
 \r
+#define netpath_canRxCsum(pNetpath) \\r
+                       viport_canRxCsum( (pNetpath)->pViport )\r
+\r
 #endif /* _VNIC_VIPORT_H_ */\r