\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
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
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
\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
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
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
\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
}\r
\r
void\r
-__vnic_pnp_dereg(\r
+__vnic_pnp_dereg_cb(\r
IN void* context )\r
{\r
vnic_adapter_t* p_adapter;\r
{\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
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
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
#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
#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
\r
typedef enum {\r
INIC_UNINITIALIZED,\r
+ INIC_DEREGISTERING,\r
INIC_REGISTERED,\r
} InicState_t;\r
\r
\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
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
!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
\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
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
}\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
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
\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
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
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
}\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
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
{\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
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
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
\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
("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
{\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
\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
#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
\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
\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
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
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
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
{\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
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
netpath_xmitPacket( p_adapter->p_currentPath,\r
packet_array[packet_num] );\r
}\r
- \r
VNIC_EXIT( VNIC_DBG_SEND );\r
}\r
\r
\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
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
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
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
\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
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
\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
(" 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
}\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
{\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
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
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
\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
\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
\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
\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
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
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
\r
if( InterlockedExchange( (volatile LONG*)&p_viport->errored, TRUE ) == FALSE )\r
{\r
+ viport_stopXmit( p_viport );\r
viport_linkDown( p_viport );\r
}\r
\r
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
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
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
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
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
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
// 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
}\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
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
\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