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
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
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
__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
/* 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
\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
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
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
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
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
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
/* 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
\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
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
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
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
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
\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
("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
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
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
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
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
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
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
*/\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
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
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
{\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
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
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
__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
{\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
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
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
{\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
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
\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
(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
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
&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
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
("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
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
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
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
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
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
\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
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
{\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
{\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
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
// 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
\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
\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
\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