From: aestrin Date: Sun, 15 Oct 2006 00:13:46 +0000 (+0000) Subject: [VNIC] memory leak in data_disconnect. added reset+pnp_dereg.Changed debug flags... X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=64c95e1a61f97d5174f749b9391833a43d621c34;p=~shefty%2Frdma-win.git [VNIC] memory leak in data_disconnect. added reset+pnp_dereg.Changed debug flags and messages to more friendly format.Set asserting counter on set OIDs. Replaced cl_qlist* send_pending_list on Ndis* provided API.Some other cleanup efforts. git-svn-id: svn://openib.tc.cornell.edu/gen1@522 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/trunk/ulp/inic/kernel/vnic_adapter.c b/trunk/ulp/inic/kernel/vnic_adapter.c index 624a6b1a..8e6508aa 100644 --- a/trunk/ulp/inic/kernel/vnic_adapter.c +++ b/trunk/ulp/inic/kernel/vnic_adapter.c @@ -594,7 +594,8 @@ vnic_viport_allocate( KeInitializeSpinLock( &p_viport->lock ); InitializeListHead( &p_viport->listPtrs ); - cl_qlist_init( &p_viport->send_pending_list ); + InitializeListHead( &p_viport->send_pending_list ); + NdisAllocateSpinLock(&p_viport->pending_list_lock ); KeInitializeEvent( &p_viport->conn_event, SynchronizationEvent, FALSE ); @@ -608,6 +609,8 @@ vnic_viport_allocate( control_construct( &p_viport->control, p_viport ); data_construct( &p_viport->data, p_viport ); + p_viport->ioc_num = _get_ioc_num_from_iocguid( &p_adapter->ifc_data.guid ); + *pp_viport = p_viport; NdisReleaseSpinLock( &p_adapter->lock ); @@ -642,6 +645,8 @@ vnic_set_mcast( VNIC_ENTER( VNIC_DBG_MCAST ); + VNIC_TRACE( VNIC_DBG_INFO, + ("MCAST COUNT to set = %d\n", mc_count)); /* Copy the MC address list into the adapter. */ if( mc_count ) { @@ -653,11 +658,11 @@ vnic_set_mcast( if( !p_adapter->p_currentPath->pViport ) return NDIS_STATUS_SUCCESS; - p_adapter->pending_set = TRUE; + ++p_adapter->pending_set; status = viport_setMulticast( p_adapter->p_currentPath->pViport ); if( status != NDIS_STATUS_PENDING ) { - p_adapter->pending_set = FALSE; + --p_adapter->pending_set; } VNIC_EXIT( VNIC_DBG_MCAST ); @@ -896,8 +901,7 @@ __vnic_pnp_cb( if( ib_status != IB_SUCCESS ) { VNIC_TRACE( VNIC_DBG_ERROR, - ("Control path connect failed status s%\n", - p_adapter->ifc.get_err_str( ib_status )) ); + ("Control connect return s%\n", p_adapter->ifc.get_err_str( ib_status )) ); vnic_viport_cleanup( p_adapter ); break; } @@ -949,15 +953,13 @@ vnic_get_adapter_interface( IN NDIS_HANDLE h_handle, IN vnic_adapter_t *p_adapter) { - NTSTATUS status; ib_al_ifc_data_t data; IO_STACK_LOCATION io_stack; - DEVICE_OBJECT *p_pdo; VNIC_ENTER( VNIC_DBG_ADAPTER ); - NdisMGetDeviceProperty( h_handle, &p_pdo, NULL, NULL, NULL, NULL ); + NdisMGetDeviceProperty( h_handle, &p_adapter->p_pdo, NULL, NULL, NULL, NULL ); data.size = sizeof(ioc_ifc_data_t); data.type = &GUID_IOC_INTERFACE_DATA; @@ -971,7 +973,7 @@ vnic_get_adapter_interface( io_stack.Parameters.QueryInterface.InterfaceSpecificData = &data; io_stack.Parameters.QueryInterface.InterfaceType = &GUID_IB_AL_INTERFACE; - status = cl_fwd_query_ifc( p_pdo, &io_stack ); + status = cl_fwd_query_ifc( p_adapter->p_pdo, &io_stack ); if( !NT_SUCCESS( status ) ) { @@ -1005,3 +1007,104 @@ vnic_viport_cleanup( VNIC_EXIT( VNIC_DBG_ADAPTER ); } + +void +__vnic_pnp_dereg( + IN void* context ) +{ + vnic_adapter_t* p_adapter; + ib_api_status_t ib_status; + ib_pnp_event_t state; + ib_pnp_req_t pnp_req; + viport_t *p_viport; + + VNIC_ENTER( VNIC_DBG_INIT ); + + p_adapter = (vnic_adapter_t*)context; + + CL_ASSERT( !p_adapter->h_pnp ); + + if( p_adapter->pnp_state != IB_PNP_IOC_REMOVE ) + p_adapter->pnp_state = IB_PNP_IOC_ADD; + + state = p_adapter->pnp_state; + + /* Destroy the current port instance if it still exists. */ + p_viport = InterlockedExchangePointer( (void *)&p_adapter->p_viport, NULL ); + + if( p_viport ) + { + viport_cleanup( p_viport ); + } + + if( state != IB_PNP_IOC_REMOVE ) + { + /* Register for IOC events */ + pnp_req.pfn_pnp_cb = __vnic_pnp_cb; + pnp_req.pnp_class = IB_PNP_IOC | IB_PNP_FLAG_REG_SYNC; + pnp_req.pnp_context = p_adapter; + + ib_status = p_adapter->ifc.reg_pnp( p_adapter->h_al, &pnp_req, &p_adapter->h_pnp ); + if( ib_status != IB_SUCCESS ) + { + p_adapter->reset = FALSE; + VNIC_TRACE( VNIC_DBG_ERROR, + ("pnp_reg returned %s\n", + p_adapter->ifc.get_err_str( ib_status )) ); + NdisMResetComplete( + p_adapter->h_handle, NDIS_STATUS_HARD_ERRORS, TRUE ); + } + } + else + { + p_adapter->reset = FALSE; + NdisMResetComplete( + p_adapter->h_handle, NDIS_STATUS_SUCCESS, TRUE ); + ib_status = IB_SUCCESS; + } + + VNIC_EXIT( VNIC_DBG_INIT ); +} + + +ib_api_status_t +vnic_reset_adapter( + IN vnic_adapter_t* const p_adapter ) +{ + + ib_api_status_t status; + ib_pnp_handle_t h_pnp; + ib_pnp_req_t pnp_req; + + VNIC_ENTER( VNIC_DBG_INIT ); + + if( p_adapter->reset ) + return IB_INVALID_STATE; + + p_adapter->hung = 0; + p_adapter->reset = TRUE; + + if( p_adapter->h_pnp ) + { + h_pnp = p_adapter->h_pnp; + p_adapter->h_pnp = NULL; + status = p_adapter->ifc.dereg_pnp( h_pnp, __vnic_pnp_dereg ); + if( status == IB_SUCCESS ) + status = IB_NOT_DONE; + } + else + { + /* Register for IOC events */ + pnp_req.pfn_pnp_cb = __vnic_pnp_cb; + pnp_req.pnp_class = IB_PNP_IOC | IB_PNP_FLAG_REG_SYNC; + pnp_req.pnp_context = p_adapter; + + status = p_adapter->ifc.reg_pnp( p_adapter->h_al, &pnp_req, &p_adapter->h_pnp ); + if( status == IB_SUCCESS ) + { + p_adapter->hung = FALSE; + } + } + VNIC_EXIT( VNIC_DBG_INIT ); + return status; +} diff --git a/trunk/ulp/inic/kernel/vnic_adapter.h b/trunk/ulp/inic/kernel/vnic_adapter.h index dcb0b251..ca271ee0 100644 --- a/trunk/ulp/inic/kernel/vnic_adapter.h +++ b/trunk/ulp/inic/kernel/vnic_adapter.h @@ -108,7 +108,7 @@ typedef struct _vnic_params { typedef struct _vnic_adapter { LIST_ENTRY list_entry; NDIS_HANDLE h_handle; - PDRIVER_OBJECT p_drv_obj; + DEVICE_OBJECT *p_pdo; // cl_obj_t obj; NDIS_SPIN_LOCK lock; ib_al_ifc_t ifc; @@ -133,8 +133,10 @@ typedef struct _vnic_adapter { LONG xmitStarted; LONG carrier; uint32_t packet_filter; - BOOLEAN hung; - BOOLEAN pending_set; + int hung; + BOOLEAN reset; + //BOOLEAN pending_set; + int pending_set; BOOLEAN pending_query; pending_oid_t query_oid; pending_oid_t set_oid; @@ -213,4 +215,12 @@ ibregion_physInit( IN uint64_t *p_vaddr, IN uint64_t len ); +void +__vnic_pnp_dereg( + IN void* context ); + +ib_api_status_t +vnic_reset_adapter( + IN vnic_adapter_t* const p_adapter ); + #endif /* !defined _VNIC_ADAPTER_H_ */ diff --git a/trunk/ulp/inic/kernel/vnic_config.h b/trunk/ulp/inic/kernel/vnic_config.h index 9a054cae..4a91679b 100644 --- a/trunk/ulp/inic/kernel/vnic_config.h +++ b/trunk/ulp/inic/kernel/vnic_config.h @@ -19,16 +19,16 @@ #define MAX_MTU 9500 /* max Jumbo frame payload size */ #define ETH_VLAN_HLEN 18 /* ethernet header with VLAN tag */ -#define HOST_RECV_POOL_ENTRIES 512 /* TBD: Abritrary */ +#define HOST_RECV_POOL_ENTRIES 128 /* TBD: Abritrary */ #define MIN_HOST_POOL_SZ 64 /* TBD: Abritrary */ #define MIN_EIOC_POOL_SZ 64 /* TBD: Abritrary */ -#define MAX_EIOC_POOL_SZ 256 /* TBD: Abritrary */ +#define MAX_EIOC_POOL_SZ 128 /* TBD: Abritrary */ -#define MIN_HOST_KICK_TIMEOUT 10 /* TBD: Arbitrary */ -#define MAX_HOST_KICK_TIMEOUT 100 /* In uSec */ +#define MIN_HOST_KICK_TIMEOUT 100 /* TBD: Arbitrary */ +#define MAX_HOST_KICK_TIMEOUT 200 /* In uSec */ #define MIN_HOST_KICK_ENTRIES 1 /* TBD: Arbitrary */ -#define MAX_HOST_KICK_ENTRIES 128 /* TBD: Arbitrary */ +#define MAX_HOST_KICK_ENTRIES 64 /* TBD: Arbitrary */ #define MIN_HOST_KICK_BYTES 0 #define MAX_HOST_KICK_BYTES 5000 diff --git a/trunk/ulp/inic/kernel/vnic_control.c b/trunk/ulp/inic/kernel/vnic_control.c index 9ca242fa..e6ed64f4 100644 --- a/trunk/ulp/inic/kernel/vnic_control.c +++ b/trunk/ulp/inic/kernel/vnic_control.c @@ -80,15 +80,6 @@ static void __control_logControlPacket( Inic_ControlPacket_t *pPkt ); -static inline char* -control_ifcfg_name( Control_t *pControl ) -{ - if (! pControl) - return "NCtl"; - return (pControl->p_viport->p_adapter->name ); -} - - void control_construct( IN Control_t *pControl, @@ -145,7 +136,7 @@ control_init( &pControl->qp, guid, &pConfig->ibConfig ); if( ib_status != IB_SUCCESS ) { - VNIC_TRACE_EXIT( VNIC_DBG_ERROR, ("%s: ibqp_init returned %s\n", + VNIC_TRACE_EXIT( VNIC_DBG_ERROR, ("ibqp_init returned %s\n", pViport->p_adapter->ifc.get_err_str( ib_status )) ); goto failure; } @@ -158,8 +149,7 @@ control_init( if ( pControl->pLocalStorage == NULL ) { VNIC_TRACE_EXIT( VNIC_DBG_ERROR, - ("%s: Failed allocating space for local storage\n", - control_ifcfg_name(pControl)) ); + ("Failed allocating space for local storage\n" )); ibqp_cleanup(&pControl->qp); ib_status = IB_INSUFFICIENT_MEMORY; @@ -181,9 +171,9 @@ control_init( * as the receive buffers. I'm doing this to combine them * into a single region, and conserve a region. */ - VNIC_TRACE_EXIT( VNIC_DBG_ERROR|VNIC_DBG_CTRL, - ("%s: Failed setting up control space region\n", - control_ifcfg_name(pControl)) ); + VNIC_TRACE_EXIT( VNIC_DBG_ERROR , + (" Failed setting up control space region\n" )); + ibqp_cleanup( &pControl->qp ); cl_free( pControl->pLocalStorage ); goto failure; @@ -267,9 +257,9 @@ control_processAsync( if ( pRecvIo != NULL ) { - VNIC_TRACE( VNIC_DBG_CTRL | VNIC_DBG_INFO, - ("%s: processing info packet\n", - control_ifcfg_name(pControl)) ); + VNIC_TRACE( VNIC_DBG_CTRL, + ("IOC %d: processing info packet\n", + pControl->p_viport->ioc_num ) ); pPkt = control_packet( pRecvIo ); @@ -278,25 +268,23 @@ control_processAsync( switch( ntoh32(pPkt->cmd.reportStatus.statusNumber) ) { case INIC_STATUS_LINK_UP: - VNIC_TRACE( VNIC_DBG_CTRL | VNIC_DBG_INFO, - ("%s: Link Up\n", - control_ifcfg_name(pControl)) ); + VNIC_TRACE( VNIC_DBG_CTRL, + ("IOC %d: Link Up\n", pControl->p_viport->ioc_num ) ); viport_linkUp( pControl->p_viport ); break; case INIC_STATUS_LINK_DOWN: - VNIC_TRACE( VNIC_DBG_CTRL | VNIC_DBG_INFO, - ("%s: Link Down\n", - control_ifcfg_name(pControl)) ); + VNIC_TRACE( VNIC_DBG_CTRL, + ("IOC %d: Link Down\n", pControl->p_viport->ioc_num ) ); viport_linkDown( pControl->p_viport ); break; default: VNIC_TRACE( VNIC_DBG_CTRL | VNIC_DBG_ERROR, - ("%s: Asynchronous status received from EIOC\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: Asynchronous status received from EIOC\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( pPkt ); break; } @@ -314,17 +302,17 @@ control_processAsync( while ( !IsListEmpty( &pControl->failureList ) ) { - VNIC_TRACE( VNIC_DBG_CTRL | VNIC_DBG_INFO, - ("%s: processing error packet\n", - control_ifcfg_name(pControl)) ); + VNIC_TRACE( VNIC_DBG_CTRL, + ("IOC %d: processing error packet\n", + pControl->p_viport->ioc_num ) ); p_list_entry = ExInterlockedRemoveHeadList( &pControl->failureList, &pControl->ioLock ); pRecvIo = (RecvIo_t *)p_list_entry; pPkt = control_packet( pRecvIo ); - VNIC_TRACE( VNIC_DBG_CTRL | VNIC_DBG_INFO, - ("%s: Asynchronous error received from EIOC\n", - control_ifcfg_name(pControl)) ); + VNIC_TRACE( VNIC_DBG_CTRL, + ("IOC %d: Asynchronous error received from EIOC\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( pPkt ); @@ -352,7 +340,11 @@ control_initInicReq( ib_api_status_t ib_status; VNIC_ENTER( VNIC_DBG_CTRL ); - + + if( pControl->p_viport->errored ) + { + return IB_ERROR; + } control_initHdr( pControl, CMD_INIT_INIC ); pPkt = control_packet( &pControl->sendIo ); @@ -396,14 +388,14 @@ control_initInicRsp( { VNIC_TRACE( VNIC_DBG_CTRL | VNIC_DBG_ERROR, - ("%s: Sent control request:\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: Sent control request:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( control_lastReq( pControl ) ); VNIC_TRACE_EXIT( VNIC_DBG_CTRL | VNIC_DBG_ERROR, - ("%s: Received control response:\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: Received control response:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( pPkt ); goto failure; @@ -421,45 +413,45 @@ control_initInicRsp( ( pControl->minVer > INIC_MINORVERSION )) ) { VNIC_TRACE_EXIT( VNIC_DBG_CTRL | VNIC_DBG_ERROR, - ("%s: Unsupported version\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: Unsupported version\n", + pControl->p_viport->ioc_num ) ); goto failure; } if ( numDataPaths != 1 ) { VNIC_TRACE_EXIT( VNIC_DBG_CTRL | VNIC_DBG_ERROR, - ("%s: EIOC returned too many datapaths\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: EIOC returned too many datapaths\n", + pControl->p_viport->ioc_num ) ); goto failure; } if ( *pNumAddrs > p_conf->maxAddressEntries ) { VNIC_TRACE_EXIT( VNIC_DBG_CTRL | VNIC_DBG_ERROR, - ("%s: EIOC returned more Address entries than requested\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: EIOC returned more Address entries than requested\n", + pControl->p_viport->ioc_num) ); goto failure; } if ( *pNumAddrs < p_conf->minAddressEntries ) { VNIC_TRACE_EXIT( VNIC_DBG_CTRL | VNIC_DBG_ERROR, - ("%s: Not enough address entries\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: Not enough address entries\n", + pControl->p_viport->ioc_num ) ); goto failure; } if ( numLanSwitches < 1 ) { VNIC_TRACE_EXIT( VNIC_DBG_CTRL | VNIC_DBG_ERROR, - ("%s: EIOC returned no lan switches\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: EIOC returned no lan switches\n", + pControl->p_viport->ioc_num ) ); goto failure; } if ( numLanSwitches > 1 ) { VNIC_TRACE_EXIT( VNIC_DBG_CTRL | VNIC_DBG_ERROR, - ("%s: EIOC returned multiple lan switches\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: EIOC returned multiple lan switches\n", + pControl->p_viport->ioc_num ) ); goto failure; } @@ -497,7 +489,11 @@ control_configDataPathReq( ib_api_status_t ib_status; VNIC_ENTER( VNIC_DBG_CTRL ); - + + if( pControl->p_viport->errored ) + { + return IB_ERROR; + } control_initHdr( pControl, CMD_CONFIG_DATA_PATH ); pPkt = control_packet( &pControl->sendIo ); @@ -539,14 +535,14 @@ control_configDataPathRsp( if ( pPkt->hdr.pktCmd != CMD_CONFIG_DATA_PATH ) { VNIC_TRACE( VNIC_DBG_ERROR, - ("%s: Sent control request:\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: Sent control request:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( control_lastReq( pControl ) ); VNIC_TRACE( VNIC_DBG_ERROR, - ("%s: Received control response:\n", - control_ifcfg_name( pControl )) ); + ("IOC %d: Received control response:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( pPkt ); goto failure; @@ -557,8 +553,8 @@ control_configDataPathRsp( if ( pConfigDataPath->dataPath != 0 ) { VNIC_TRACE( VNIC_DBG_ERROR, - ("%s: Received CMD_CONFIG_DATA_PATH response for wrong data path: %u\n", - control_ifcfg_name( pControl ), pConfigDataPath->dataPath) ); + ("IOC %d: Received CMD_CONFIG_DATA_PATH response for wrong data path: %u\n", + pControl->p_viport->ioc_num , pConfigDataPath->dataPath) ); goto failure; } @@ -593,6 +589,10 @@ control_exchangePoolsReq( VNIC_ENTER( VNIC_DBG_CTRL ); + if( pControl->p_viport->errored ) + { + return IB_ERROR; + } control_initHdr(pControl, CMD_EXCHANGE_POOLS ); pPkt = control_packet( &pControl->sendIo ); @@ -629,14 +629,14 @@ control_exchangePoolsRsp( if ( pPkt->hdr.pktCmd != CMD_EXCHANGE_POOLS ) { VNIC_TRACE( VNIC_DBG_ERROR, - ("%s: Sent control request:\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: Sent control request:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( control_lastReq(pControl ) ); VNIC_TRACE( VNIC_DBG_ERROR, - ("%s: Received control response:\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: Received control response:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( pPkt ); goto failure; @@ -649,8 +649,8 @@ control_exchangePoolsRsp( if ( hton32( pExchangePools->dataPath ) != 0 ) { VNIC_TRACE_EXIT( VNIC_DBG_ERROR, - ("%s: Received CMD_EXCHANGE_POOLS response for wrong data path: %u\n", - control_ifcfg_name(pControl), pExchangePools->dataPath ) ); + ("IOC %d: Received CMD_EXCHANGE_POOLS response for wrong data path: %u\n", + pControl->p_viport->ioc_num , pExchangePools->dataPath ) ); goto failure; } @@ -676,7 +676,11 @@ control_configLinkReq( ib_api_status_t ib_status; VNIC_ENTER( VNIC_DBG_CTRL ); - + + if( pControl->p_viport->errored ) + { + return IB_ERROR; + } control_initHdr( pControl, CMD_CONFIG_LINK ); pPkt = control_packet( &pControl->sendIo ); @@ -745,14 +749,14 @@ control_configLinkRsp( if ( pPkt->hdr.pktCmd != CMD_CONFIG_LINK ) { VNIC_TRACE( VNIC_DBG_ERROR, - ("%s: Sent control request:\n", - control_ifcfg_name( pControl )) ); + ("IOC %d: Sent control request:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( control_lastReq( pControl ) ); VNIC_TRACE( VNIC_DBG_ERROR, - ("%s: Received control response:\n", - control_ifcfg_name( pControl )) ); + ("IOC %d: Received control response:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( pPkt ); goto failure; @@ -796,6 +800,10 @@ control_configAddrsReq( VNIC_ENTER( VNIC_DBG_CTRL ); + if( pControl->p_viport->errored ) + { + return IB_ERROR; + } control_initHdr( pControl, CMD_CONFIG_ADDRESSES ); pPkt = control_packet( &pControl->sendIo ); @@ -851,14 +859,14 @@ control_configAddrsRsp( if ( pPkt->hdr.pktCmd != CMD_CONFIG_ADDRESSES ) { VNIC_TRACE( VNIC_DBG_ERROR, - ("%s: Sent control request:\n", - control_ifcfg_name( pControl )) ); + ("IOC %d: Sent control request:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( control_lastReq( pControl ) ); VNIC_TRACE_EXIT(VNIC_DBG_ERROR, - ("%s: Received control response:\n", - control_ifcfg_name( pControl )) ); + ("IOC %d: Received control response:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( pPkt ); @@ -918,14 +926,14 @@ control_reportStatisticsRsp( if ( pPkt->hdr.pktCmd != CMD_REPORT_STATISTICS ) { VNIC_TRACE(VNIC_DBG_ERROR, - ("%s: Sent control request:\n", - control_ifcfg_name( pControl )) ); + ("IOC %d: Sent control request:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( control_lastReq( pControl ) ); VNIC_TRACE_EXIT(VNIC_DBG_ERROR, - ("%s: Received control response:\n", - control_ifcfg_name( pControl ) ) ); + ("IOC %d: Received control response:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( pPkt ); @@ -998,14 +1006,14 @@ control_resetRsp( if ( pPkt->hdr.pktCmd != CMD_RESET ) { VNIC_TRACE( VNIC_DBG_ERROR, - ("%s: Sent control request:\n", - control_ifcfg_name( pControl )) ); + ("IOC %d: Sent control request:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( control_lastReq( pControl ) ); VNIC_TRACE( VNIC_DBG_ERROR, - ("%s: Received control response:\n", - control_ifcfg_name( pControl )) ); + ("IOC %d: Received control response:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( pPkt ); @@ -1032,7 +1040,10 @@ control_heartbeatReq( ib_api_status_t ib_status; VNIC_ENTER( VNIC_DBG_CTRL ); - + if( pControl->p_viport->errored ) + { + return IB_ERROR; + } control_initHdr(pControl, CMD_HEARTBEAT); pPkt = control_packet(&pControl->sendIo); @@ -1042,7 +1053,6 @@ control_heartbeatReq( pHeartbeatReq->hbInterval = hton32( hbInterval*1000 ); ib_status = control_send( pControl ); - ASSERT( ib_status == IB_SUCCESS ); VNIC_EXIT( VNIC_DBG_CTRL ); return ib_status; } @@ -1067,14 +1077,14 @@ control_heartbeatRsp( if ( pPkt->hdr.pktCmd != CMD_HEARTBEAT ) { VNIC_TRACE( VNIC_DBG_ERROR, - ("%s: Sent control request:\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: Sent control request:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( control_lastReq(pControl) ); VNIC_TRACE( VNIC_DBG_ERROR, - ("%s: Received control response:\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: Received control response:\n", + pControl->p_viport->ioc_num ) ); __control_logControlPacket( pPkt ); goto failure; @@ -1118,6 +1128,10 @@ control_recvComplete( Inic_ControlPacket_t *pPkt = control_packet(pRecvIo); Inic_ControlHeader_t *pCHdr = &pPkt->hdr; + if( p_viport->errored ) + { + return; + } switch ( pCHdr->pktType ) { case TYPE_INFO: @@ -1169,7 +1183,7 @@ control_recvComplete( break; case CMD_CONFIG_DATA_PATH: - status = control_configDataPathRsp( &p_viport->control, + status = control_configDataPathRsp( pControl, data_hostPool( &p_viport->data ), data_eiocPool( &p_viport->data ), data_hostPoolMax( &p_viport->data ), @@ -1212,10 +1226,16 @@ control_recvComplete( if( p_viport->flags & INIC_FLAG_ENABLE_NIC ) { InterlockedExchange( &p_viport->p_netpath->carrier, TRUE ); + /* don't indicate media state yet if in sync query */ + if( !( p_viport->updates & SYNC_QUERY ) ) + { + viport_linkUp( p_viport ); + } } else { InterlockedExchange( &p_viport->p_netpath->carrier, FALSE ); + viport_linkDown( p_viport ); } InterlockedAnd( &p_viport->updates, ~NEED_LINK_CONFIG ); } @@ -1236,15 +1256,19 @@ control_recvComplete( case CMD_CONFIG_ADDRESSES: status = control_configAddrsRsp( pControl ); if( status == TRUE ) - { - if( pControl->p_viport->addrs_query_done == 0 ) + { // need more entries to send? + if( p_viport->addrs_query_done == 0 ) { - // need more entries to send - // TODO: Handle a send failure. - control_configAddrsReq( pControl, - pControl->p_viport->macAddresses, - pControl->p_viport->numMacAddresses, - &pControl->p_viport->addrs_query_done ); + if( !p_viport->errored ) + { + if( control_configAddrsReq( pControl, + p_viport->macAddresses, + p_viport->numMacAddresses, + &p_viport->addrs_query_done ) != IB_SUCCESS ) + { + viport_failure( p_viport ); + } + } // Don't signal any waiting thread or start processing other updates. return; } @@ -1259,7 +1283,8 @@ control_recvComplete( status = control_reportStatisticsRsp( pControl, &p_viport->stats ); if ( status ) { - if( p_viport->stats.ethernetStatus > 0 ) + if( p_viport->stats.ethernetStatus > 0 && + !p_viport->errored ) { viport_linkUp( p_viport ); } @@ -1339,7 +1364,7 @@ control_send( InterlockedExchange((volatile LONG*)&pControl->reqOutstanding, FALSE ); VNIC_TRACE( VNIC_DBG_ERROR, - ("%s: Failed to post send\n", control_ifcfg_name(pControl)) ); + ("IOC %d: Failed to post send\n", pControl->p_viport->ioc_num ) ); viport_failure( pControl->p_viport ); } @@ -1461,8 +1486,8 @@ control_getRsp( Inic_ControlHeader_t *pHdr = &pPkt->hdr; VNIC_TRACE( VNIC_DBG_CTRL| VNIC_DBG_ERROR, - ("%s: No response received from EIOC\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: No response received from EIOC\n", + pControl->p_viport->ioc_num ) ); #ifdef VNIC_STATISTIC pControl->statistics.timeoutNum++; #endif /* VNIC_STATISTIC */ @@ -1472,8 +1497,8 @@ control_getRsp( if ( pControl->reqRetryCounter >= pControl->p_conf->reqRetryCount ) { VNIC_TRACE( VNIC_DBG_CTRL| VNIC_DBG_ERROR, - ("%s: Control packet retry exceeded\n", - control_ifcfg_name(pControl)) ); + ("IOC %d: Control packet retry exceeded\n", + pControl->p_viport->ioc_num ) ); viport_failure(pControl->p_viport ); } else @@ -1618,43 +1643,43 @@ __control_logControlPacket( switch( pPkt->hdr.pktCmd ) { case CMD_INIT_INIC: - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, ("ControlPacket: pktType = %s, pktCmd = CMD_INIT_INIC\n", type ) ); - VNIC_PRINT( VNIC_DBG_CTRL| VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL, (" pktSeqNum = %u, pktRetryCount = %u\n", pPkt->hdr.pktSeqNum, pPkt->hdr.pktRetryCount) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" inicMajorVersion = %u, inicMinorVersion = %u\n", ntoh16(pPkt->cmd.initInicReq.inicMajorVersion), ntoh16(pPkt->cmd.initInicReq.inicMinorVersion)) ); if (pPkt->hdr.pktType == TYPE_REQ) { - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" inicInstance = %u, numDataPaths = %u\n", pPkt->cmd.initInicReq.inicInstance, pPkt->cmd.initInicReq.numDataPaths) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT| VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" numAddressEntries = %u\n", ntoh16(pPkt->cmd.initInicReq.numAddressEntries)) ); } else { - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" numLanSwitches = %u, numDataPaths = %u\n", pPkt->cmd.initInicRsp.numLanSwitches, pPkt->cmd.initInicRsp.numDataPaths) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" numAddressEntries = %u, featuresSupported = %08x\n", ntoh16(pPkt->cmd.initInicRsp.numAddressEntries), ntoh32(pPkt->cmd.initInicRsp.featuresSupported)) ); if (pPkt->cmd.initInicRsp.numLanSwitches != 0) { - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, ("lanSwitch[0] lanSwitchNum = %u, numEnetPorts = %08x\n", pPkt->cmd.initInicRsp.lanSwitch[0].lanSwitchNum, pPkt->cmd.initInicRsp.lanSwitch[0].numEnetPorts) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" defaultVlan = %u, hwMacAddress = %02x:%02x:%02x:%02x:%02x:%02x\n", ntoh16(pPkt->cmd.initInicRsp.lanSwitch[0].defaultVlan), pPkt->cmd.initInicRsp.lanSwitch[0].hwMacAddress[0], @@ -1667,99 +1692,99 @@ __control_logControlPacket( } break; case CMD_CONFIG_DATA_PATH: - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, ( "ControlPacket: pktType = %s, pktCmd = CMD_CONFIG_DATA_PATH\n", type) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" pktSeqNum = %u, pktRetryCount = %u\n", pPkt->hdr.pktSeqNum, pPkt->hdr.pktRetryCount) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" pathIdentifier = %"PRIx64", dataPath = %u\n", pPkt->cmd.configDataPathReq.pathIdentifier, pPkt->cmd.configDataPathReq.dataPath) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, ("Host Config sizeRecvPoolEntry = %u, numRecvPoolEntries = %u\n", ntoh32(pPkt->cmd.configDataPathReq.hostRecvPoolConfig.sizeRecvPoolEntry), ntoh32(pPkt->cmd.configDataPathReq.hostRecvPoolConfig.numRecvPoolEntries)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" timeoutBeforeKick = %u, numRecvPoolEntriesBeforeKick = %u\n", ntoh32(pPkt->cmd.configDataPathReq.hostRecvPoolConfig.timeoutBeforeKick), ntoh32(pPkt->cmd.configDataPathReq.hostRecvPoolConfig.numRecvPoolEntriesBeforeKick)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" numRecvPoolBytesBeforeKick = %u, freeRecvPoolEntriesPerUpdate = %u\n", ntoh32(pPkt->cmd.configDataPathReq.hostRecvPoolConfig.numRecvPoolBytesBeforeKick), ntoh32(pPkt->cmd.configDataPathReq.hostRecvPoolConfig.freeRecvPoolEntriesPerUpdate)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, ("Eioc Config sizeRecvPoolEntry = %u, numRecvPoolEntries = %u\n", ntoh32(pPkt->cmd.configDataPathReq.eiocRecvPoolConfig.sizeRecvPoolEntry), ntoh32(pPkt->cmd.configDataPathReq.eiocRecvPoolConfig.numRecvPoolEntries)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" timeoutBeforeKick = %u, numRecvPoolEntriesBeforeKick = %u\n", ntoh32(pPkt->cmd.configDataPathReq.eiocRecvPoolConfig.timeoutBeforeKick), ntoh32(pPkt->cmd.configDataPathReq.eiocRecvPoolConfig.numRecvPoolEntriesBeforeKick)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" numRecvPoolBytesBeforeKick = %u, freeRecvPoolEntriesPerUpdate = %u\n", ntoh32(pPkt->cmd.configDataPathReq.eiocRecvPoolConfig.numRecvPoolBytesBeforeKick), ntoh32(pPkt->cmd.configDataPathReq.eiocRecvPoolConfig.freeRecvPoolEntriesPerUpdate)) ); break; case CMD_EXCHANGE_POOLS: - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, ("ControlPacket: pktType = %s, pktCmd = CMD_EXCHANGE_POOLS\n", type ) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" pktSeqNum = %u, pktRetryCount = %u\n", pPkt->hdr.pktSeqNum, pPkt->hdr.pktRetryCount) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" datapath = %u\n", pPkt->cmd.exchangePoolsReq.dataPath) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" poolRKey = %08x poolAddr = %"PRIx64"\n", ntoh32(pPkt->cmd.exchangePoolsReq.poolRKey), ntoh64(pPkt->cmd.exchangePoolsReq.poolAddr)) ); break; case CMD_CONFIG_ADDRESSES: - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, ( "ControlPacket: pktType = %s, pktCmd = CMD_CONFIG_ADDRESSES\n", type ) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" pktSeqNum = %u, pktRetryCount = %u\n", pPkt->hdr.pktSeqNum, pPkt->hdr.pktRetryCount) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" numAddressOps = %x, lanSwitchNum = %d\n", pPkt->cmd.configAddressesReq.numAddressOps, pPkt->cmd.configAddressesReq.lanSwitchNum) ); for (i = 0; ( i < pPkt->cmd.configAddressesReq.numAddressOps) && (i < 16); i++) { - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" listAddressOps[%u].index = %u\n", i, ntoh16(pPkt->cmd.configAddressesReq.listAddressOps[i].index)) ); switch(pPkt->cmd.configAddressesReq.listAddressOps[i].operation) { case INIC_OP_GET_ENTRY: - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" listAddressOps[%u].operation = INIC_OP_GET_ENTRY\n", i) ); break; case INIC_OP_SET_ENTRY: - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" listAddressOps[%u].operation = INIC_OP_SET_ENTRY\n", i) ); break; default: - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" listAddressOps[%u].operation = UNKNOWN(%d)\n", i, pPkt->cmd.configAddressesReq.listAddressOps[i].operation) ); break; } - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" listAddressOps[%u].valid = %u\n", i, pPkt->cmd.configAddressesReq.listAddressOps[i].valid) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" listAddressOps[%u].address = %02x:%02x:%02x:%02x:%02x:%02x\n", i, pPkt->cmd.configAddressesReq.listAddressOps[i].address[0], pPkt->cmd.configAddressesReq.listAddressOps[i].address[1], @@ -1768,56 +1793,56 @@ __control_logControlPacket( pPkt->cmd.configAddressesReq.listAddressOps[i].address[4], pPkt->cmd.configAddressesReq.listAddressOps[i].address[5]) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" listAddressOps[%u].vlan = %u\n", i, ntoh16(pPkt->cmd.configAddressesReq.listAddressOps[i].vlan)) ); } break; case CMD_CONFIG_LINK: - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, ("ControlPacket: pktType = %s, pktCmd = CMD_CONFIG_LINK\n", type) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" pktSeqNum = %u, pktRetryCount = %u\n", pPkt->hdr.pktSeqNum, pPkt->hdr.pktRetryCount) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" cmdFlags = %x\n", pPkt->cmd.configLinkReq.cmdFlags) ); if ( pPkt->cmd.configLinkReq.cmdFlags & INIC_FLAG_ENABLE_NIC ) - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" INIC_FLAG_ENABLE_NIC\n") ); if ( pPkt->cmd.configLinkReq.cmdFlags & INIC_FLAG_DISABLE_NIC ) - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" INIC_FLAG_DISABLE_NIC\n") ); if ( pPkt->cmd.configLinkReq.cmdFlags & INIC_FLAG_ENABLE_MCAST_ALL ) - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" INIC_FLAG_ENABLE_MCAST_ALL\n") ); if ( pPkt->cmd.configLinkReq.cmdFlags & INIC_FLAG_DISABLE_MCAST_ALL ) - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" INIC_FLAG_DISABLE_MCAST_ALL\n") ); if ( pPkt->cmd.configLinkReq.cmdFlags & INIC_FLAG_ENABLE_PROMISC ) - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" INIC_FLAG_ENABLE_PROMISC\n") ); if ( pPkt->cmd.configLinkReq.cmdFlags & INIC_FLAG_DISABLE_PROMISC ) - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" INIC_FLAG_DISABLE_PROMISC\n") ); if ( pPkt->cmd.configLinkReq.cmdFlags & INIC_FLAG_SET_MTU ) - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" INIC_FLAG_SET_MTU\n") ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" lanSwitchNum = %x, mtuSize = %d\n", pPkt->cmd.configLinkReq.lanSwitchNum, ntoh16(pPkt->cmd.configLinkReq.mtuSize)) ); if ( pPkt->hdr.pktType == TYPE_RSP ) { - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" defaultVlan = %u, hwMacAddress = %02x:%02x:%02x:%02x:%02x:%02x\n", ntoh16(pPkt->cmd.configLinkReq.defaultVlan), pPkt->cmd.configLinkReq.hwMacAddress[0], @@ -1829,148 +1854,148 @@ __control_logControlPacket( } break; case CMD_REPORT_STATISTICS: - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, ("ControlPacket: pktType = %s, pktCmd = CMD_REPORT_STATISTICS\n", type ) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" pktSeqNum = %u, pktRetryCount = %u\n", pPkt->hdr.pktSeqNum, pPkt->hdr.pktRetryCount) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" lanSwitchNum = %u\n", pPkt->cmd.reportStatisticsReq.lanSwitchNum) ); if (pPkt->hdr.pktType == TYPE_REQ) break; - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifInBroadcastPkts = %"PRIu64, ntoh64(pPkt->cmd.reportStatisticsRsp.ifInBroadcastPkts)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifInMulticastPkts = %"PRIu64"\n", ntoh64(pPkt->cmd.reportStatisticsRsp.ifInMulticastPkts)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifInOctets = %"PRIu64, ntoh64(pPkt->cmd.reportStatisticsRsp.ifInOctets)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifInUcastPkts = %"PRIu64"\n", ntoh64(pPkt->cmd.reportStatisticsRsp.ifInUcastPkts)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifInNUcastPkts = %"PRIu64, ntoh64(pPkt->cmd.reportStatisticsRsp.ifInNUcastPkts)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifInUnderrun = %"PRIu64"\n", ntoh64(pPkt->cmd.reportStatisticsRsp.ifInUnderrun)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifInErrors = %"PRIu64, ntoh64(pPkt->cmd.reportStatisticsRsp.ifInErrors)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifOutErrors = %"PRIu64"\n", ntoh64(pPkt->cmd.reportStatisticsRsp.ifOutErrors)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifOutOctets = %"PRIu64, ntoh64(pPkt->cmd.reportStatisticsRsp.ifOutOctets)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifOutUcastPkts = %"PRIu64"\n", ntoh64(pPkt->cmd.reportStatisticsRsp.ifOutUcastPkts)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifOutMulticastPkts = %"PRIu64, ntoh64(pPkt->cmd.reportStatisticsRsp.ifOutMulticastPkts)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifOutBroadcastPkts = %"PRIu64"\n", ntoh64(pPkt->cmd.reportStatisticsRsp.ifOutBroadcastPkts)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifOutNUcastPkts = %"PRIu64, ntoh64(pPkt->cmd.reportStatisticsRsp.ifOutNUcastPkts)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifOutOk = %"PRIu64"\n", ntoh64(pPkt->cmd.reportStatisticsRsp.ifOutOk)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifInOk = %"PRIu64, ntoh64(pPkt->cmd.reportStatisticsRsp.ifInOk)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifOutUcastBytes = %"PRIu64"\n", ntoh64(pPkt->cmd.reportStatisticsRsp.ifOutUcastBytes)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifOutMulticastBytes = %"PRIu64, ntoh64(pPkt->cmd.reportStatisticsRsp.ifOutMulticastBytes)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifOutBroadcastBytes = %"PRIu64"\n", ntoh64(pPkt->cmd.reportStatisticsRsp.ifOutBroadcastBytes)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifInUcastBytes = %"PRIu64, ntoh64(pPkt->cmd.reportStatisticsRsp.ifInUcastBytes)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifInMulticastBytes = %"PRIu64"\n", ntoh64(pPkt->cmd.reportStatisticsRsp.ifInMulticastBytes)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ifInBroadcastBytes = %"PRIu64, ntoh64(pPkt->cmd.reportStatisticsRsp.ifInBroadcastBytes)) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" ethernetStatus = %"PRIu64"\n", ntoh64(pPkt->cmd.reportStatisticsRsp.ethernetStatus)) ); break; case CMD_CLEAR_STATISTICS: - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, ("ControlPacket: pktType = %s, pktCmd = CMD_CLEAR_STATISTICS\n", type ) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" pktSeqNum = %u, pktRetryCount = %u\n", pPkt->hdr.pktSeqNum, pPkt->hdr.pktRetryCount) ); break; case CMD_REPORT_STATUS: - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, ("ControlPacket: pktType = %s, pktCmd = CMD_REPORT_STATUS\n", type) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" pktSeqNum = %u, pktRetryCount = %u\n", pPkt->hdr.pktSeqNum, pPkt->hdr.pktRetryCount) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" lanSwitchNum = %u, isFatal = %u\n", pPkt->cmd.reportStatus.lanSwitchNum, pPkt->cmd.reportStatus.isFatal) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" statusNumber = %u, statusInfo = %u\n", ntoh32(pPkt->cmd.reportStatus.statusNumber), ntoh32(pPkt->cmd.reportStatus.statusInfo)) ); pPkt->cmd.reportStatus.fileName[31] = '\0'; pPkt->cmd.reportStatus.routine[31] = '\0'; - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" filename = %s, routine = %s\n", pPkt->cmd.reportStatus.fileName, pPkt->cmd.reportStatus.routine) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" lineNum = %u, errorParameter = %u\n", ntoh32(pPkt->cmd.reportStatus.lineNum), ntoh32(pPkt->cmd.reportStatus.errorParameter)) ); pPkt->cmd.reportStatus.descText[127] = '\0'; - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" descText = %s\n", pPkt->cmd.reportStatus.descText) ); break; case CMD_RESET: - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, ("ControlPacket: pktType = %s, pktCmd = CMD_RESET\n", type ) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" pktSeqNum = %u, pktRetryCount = %u\n", pPkt->hdr.pktSeqNum, pPkt->hdr.pktRetryCount) ); break; case CMD_HEARTBEAT: - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, ("ControlPacket: pktType = %s, pktCmd = CMD_HEARTBEAT\n", type ) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" pktSeqNum = %u, pktRetryCount = %u\n", pPkt->hdr.pktSeqNum, pPkt->hdr.pktRetryCount) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" hbInterval = %d\n", ntoh32(pPkt->cmd.heartbeatReq.hbInterval)) ); break; default: - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, ("ControlPacket: pktType = %s, pktCmd = UNKNOWN (%u)\n", type,pPkt->hdr.pktCmd) ); - VNIC_PRINT( VNIC_DBG_CTRL_PKT | VNIC_DBG_INFO, + VNIC_PRINT( VNIC_DBG_CTRL_PKT, (" pktSeqNum = %u, pktRetryCount = %u\n", pPkt->hdr.pktSeqNum, pPkt->hdr.pktRetryCount) ); diff --git a/trunk/ulp/inic/kernel/vnic_data.c b/trunk/ulp/inic/kernel/vnic_data.c index 66f60373..a3706bca 100644 --- a/trunk/ulp/inic/kernel/vnic_data.c +++ b/trunk/ulp/inic/kernel/vnic_data.c @@ -101,7 +101,7 @@ data_construct( IN Data_t *pData, IN viport_t *pViport ) { - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); RtlZeroMemory( pData, sizeof(*pData) ); @@ -114,7 +114,7 @@ data_construct( ibqp_construct( &pData->qp, pViport ); - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); } @@ -126,7 +126,7 @@ data_init( { ib_api_status_t ib_status; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); ASSERT( pData->p_viport != NULL ); pData->p_conf = p_conf; @@ -137,7 +137,7 @@ data_init( if( ib_status != IB_SUCCESS ) VNIC_TRACE( VNIC_DBG_ERROR, ("data ibqp_init failed\n") ); - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); return ib_status; } @@ -158,7 +158,7 @@ data_connect( int sz, regionSz; unsigned int i, j; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); pRecvPool->poolSz = pData->p_conf->hostRecvPoolEntries; pRecvPool->eiocPoolSz = pData->hostPoolParms.numRecvPoolEntries; @@ -299,6 +299,8 @@ data_connect( sz, 'fubr'); if( status != NDIS_STATUS_SUCCESS ) { + VNIC_TRACE_EXIT( VNIC_DBG_ERROR, + ("Allocate recv buffers failed\n")); ib_status = IB_INSUFFICIENT_MEMORY; goto err3; } @@ -351,13 +353,6 @@ data_connect( for ( i = 0; i < pRecvPool->poolSz; i++ ) { - /* Allocate a region for each possible receive - * buffer. Make sure each is large enough for - * the maximum packet size, but initially point - * each to a random piece of memory. As buffers - * are allocated, the region will be modified to - * reflect the memory space of the actual buffers. - */ pRdmaDest = &pRecvPool->pRecvBufs[i]; pRdmaDest->data = pData->p_recv_bufs + (i * pRecvPool->bufferSz ); pRdmaDest->region = pData->rbuf_region; @@ -394,8 +389,10 @@ data_connect( pData->p_viport->p_adapter->ifc.get_err_str( ib_status )) ); err7: NdisFreeBufferPool( pData->h_recv_buf_pool ); + pData->h_recv_buf_pool = NULL; err6: NdisFreePacketPool( pData->h_recv_pkt_pool ); + pData->h_recv_pkt_pool = NULL; err5: ibregion_cleanup( pData->p_viport, &pData->rbuf_region ); err4: @@ -410,7 +407,7 @@ err1: pRecvPool->poolSz = 0; } - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); return ib_status; } @@ -419,7 +416,7 @@ void data_connected( IN Data_t *pData ) { - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); pData->freeBufsIo.io.wrq.remote_ops.rkey = pData->recvPool.eiocRdmaRkey; @@ -428,7 +425,7 @@ data_connected( _data_sendFreeRecvBuffers(pData); pData->connected = TRUE; - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); return; } @@ -439,43 +436,45 @@ data_disconnect( RecvPool_t *pRecvPool = &pData->recvPool; viport_t *p_viport = pData->p_viport; NDIS_PACKET *p_packet; - cl_list_item_t *p_list_item; + LIST_ENTRY *p_list_item; unsigned int i; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); - pData->connected = FALSE; _data_kickTimer_stop ( pData ); + pData->connected = FALSE; + ibqp_detach( &pData->qp ); - ibregion_cleanup( pData->p_viport, &pData->rbuf_region ); - ibregion_cleanup( pData->p_viport, &pData->region ); + ibregion_cleanup( p_viport, &pData->rbuf_region ); + ibregion_cleanup( p_viport, &pData->region ); for ( i = 0; i < pRecvPool->poolSz; i++ ) { p_packet = pRecvPool->pRecvBufs[i].p_packet; - pRecvPool->pRecvBufs[i].p_packet = NULL; - if ( p_packet != NULL ) { + pRecvPool->pRecvBufs[i].p_packet = NULL; _data_return_recv( p_packet ); } } /* clear pending queue if any */ - if( cl_qlist_count( &p_viport->send_pending_list ) ) + while( ( p_list_item = NdisInterlockedRemoveHeadList( + &p_viport->send_pending_list, + &p_viport->pending_list_lock )) != NULL ) { - for( p_list_item = cl_qlist_remove_head( &p_viport->send_pending_list ); - p_list_item != cl_qlist_end( &p_viport->send_pending_list ); - p_list_item = cl_qlist_remove_head( &p_viport->send_pending_list ) ) + p_packet = VNIC_PACKET_FROM_LIST_ITEM( p_list_item ); + if ( p_packet ) { - p_packet = VNIC_PACKET_FROM_LIST_ITEM( p_list_item ); - NdisMSendComplete( pData->p_viport->p_adapter->h_handle, - p_packet, NDIS_STATUS_RESET_IN_PROGRESS ); + NDIS_SET_PACKET_STATUS( p_packet, NDIS_STATUS_FAILURE ); + NdisMSendComplete( p_viport->p_adapter->h_handle, + p_packet, NDIS_STATUS_FAILURE ); + p_viport->stats.ifOutErrors++; } } - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); return; } @@ -497,7 +496,7 @@ data_xmitPacket( uint32_t i; PHYSICAL_ADDRESS phy_addr; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); if( !data_allocXmitBuffer( pData, &pBpe, &pRdmaIo, &last ) ) { @@ -516,7 +515,6 @@ data_xmitPacket( &buf_len, &pRdmaIo->packet_sz, NormalPagePriority ); - if( pRdmaIo->packet_sz > p_xmitPool->bufferSz ) { VNIC_TRACE_EXIT( VNIC_DBG_ERROR, @@ -526,7 +524,7 @@ data_xmitPacket( if ( p_sgl->NumberOfElements > (ULONG)MAX_NUM_SGE - 1 ) { - VNIC_TRACE( VNIC_DBG_DATA | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_DATA, (" Xmit packet exceeded SGE limit - %d\n", p_sgl->NumberOfElements ) ); return FALSE; @@ -656,7 +654,7 @@ _tx_chksum_flags( } } - VNIC_TRACE( VNIC_DBG_DATA | VNIC_DBG_INFO , + VNIC_TRACE( VNIC_DBG_DATA , ("txChksumFlags = %d: V4 %c, V6 %c, IP %c, TCP %c, UDP %c\n", txChksumFlags, ((txChksumFlags & TX_CHKSUM_FLAGS_CHECKSUM_V4 )? '+': '-'), @@ -676,7 +674,7 @@ _get_first_buffer( OUT ULONG *p_packet_sz ) { UINT buf_len; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); NdisGetFirstBufferFromPacketSafe( p_packet, pp_buf_desc, @@ -684,7 +682,7 @@ _get_first_buffer( &buf_len, p_packet_sz, NormalPagePriority ); - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); } static void @@ -695,7 +693,7 @@ data_postRecvs( LIST_ENTRY *p_list_entry; ib_api_status_t ib_status; - VNIC_ENTER ( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER ( VNIC_DBG_DATA ); while( ( p_list_entry = ExInterlockedRemoveHeadList( &pData->recvIos, &pData->recvIosLock )) @@ -713,7 +711,7 @@ data_postRecvs( } } - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); return; } @@ -724,7 +722,7 @@ _data_receivedKick( Data_t *pData = &pIo->pViport->data; uint32_t num_pkts = 0; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); #ifdef VNIC_STATISTIC recvRef = cl_get_tick_count(); @@ -747,10 +745,10 @@ _data_receivedKick( NdisMIndicateReceivePacket( pData->p_viport->p_adapter->h_handle, pData->recvPool.recv_pkt_array, num_pkts ); - pData->p_viport->stats.ifInOk++; + pData->p_viport->stats.ifInOk += num_pkts; } - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); return; } @@ -761,12 +759,11 @@ _data_xmitComplete( RdmaIo_t *pRdmaIo = (RdmaIo_t *)pIo; Data_t *pData = &pIo->pViport->data; XmitPool_t *p_xmitPool = &pData->xmitPool; - vnic_adapter_t *p_adapter = pIo->pViport->p_adapter; NDIS_PACKET *p_packet; NDIS_STATUS ndis_status; - cl_list_item_t *p_list_item; + LIST_ENTRY *p_list_item; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); while ( p_xmitPool->lastCompBuf != pRdmaIo->index ) { @@ -780,36 +777,37 @@ _data_xmitComplete( if( pIo->wc_status != IB_WCS_SUCCESS ) { ndis_status = NDIS_STATUS_FAILURE; - p_adapter->p_viport->stats.ifOutErrors++; + pIo->pViport->stats.ifOutErrors++; + pIo->wc_status = IB_WCS_SUCCESS; } else { ndis_status = NDIS_STATUS_SUCCESS; - p_adapter->p_viport->stats.ifOutOk++; + pIo->pViport->stats.ifOutOk++; } NDIS_SET_PACKET_STATUS( p_packet, ndis_status ); NdisMSendComplete( pIo->pViport->p_adapter->h_handle, p_packet, ndis_status ); } } - pIo->wc_status = IB_WCS_SUCCESS; - if( !p_adapter->packet_filter ) + + if( !pIo->pViport->p_netpath->carrier ) { - if( cl_qlist_count( &pIo->pViport->send_pending_list ) ) + while( ( p_list_item = NdisInterlockedRemoveHeadList( + &pIo->pViport->send_pending_list, + &pIo->pViport->pending_list_lock ) ) != NULL ) { - for( p_list_item = cl_qlist_remove_head( &pIo->pViport->send_pending_list ); - p_list_item != cl_qlist_end( &pIo->pViport->send_pending_list ); - p_list_item = cl_qlist_remove_head( &pIo->pViport->send_pending_list ) ) - { - p_packet = VNIC_PACKET_FROM_LIST_ITEM( p_list_item ); - NdisMSendComplete( p_adapter->h_handle, p_packet, - NDIS_STATUS_RESET_IN_PROGRESS ); - } + p_packet = VNIC_PACKET_FROM_LIST_ITEM( p_list_item ); + NDIS_SET_PACKET_STATUS( p_packet, NDIS_STATUS_FAILURE ); + NdisMSendComplete( &pIo->pViport->p_adapter->h_handle, + p_packet, NDIS_STATUS_FAILURE ); + pIo->pViport->stats.ifOutErrors++; } } - data_checkXmitBuffers(pData); - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + data_checkXmitBuffers( pData ); + + VNIC_EXIT( VNIC_DBG_DATA ); return; } @@ -819,7 +817,7 @@ data_sendKickMessage( { XmitPool_t *pPool = &pData->xmitPool; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); /* stop timer for BundleTimeout */ _data_kickTimer_stop( pData ); @@ -837,7 +835,7 @@ data_sendKickMessage( viport_failure( pData->p_viport ); } - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); } static void @@ -845,12 +843,12 @@ _data_kickTimeoutHandler( void * context ) { Data_t* pData = (Data_t *)context; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); - - pData->kickTimerOn = FALSE; + VNIC_ENTER( VNIC_DBG_DATA ); + + InterlockedExchange( &pData->kickTimerOn, FALSE ); data_sendKickMessage( pData ); - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); return; } @@ -865,7 +863,7 @@ data_allocXmitBuffer( XmitPool_t *p_xmitPool = &pData->xmitPool; KIRQL flags; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); KeAcquireSpinLock( &pData->xmitBufLock, &flags ); @@ -880,7 +878,7 @@ data_allocXmitBuffer( if ( !p_xmitPool->bufPool[p_xmitPool->nextXmitPool].valid ) { - VNIC_TRACE( VNIC_DBG_DATA | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_DATA, ("Just used the last EIOU receive buffer\n") ); *pLast = TRUE; @@ -892,7 +890,7 @@ data_allocXmitBuffer( } else if ( p_xmitPool->nextXmitBuf == p_xmitPool->lastCompBuf ) { - VNIC_TRACE( VNIC_DBG_DATA | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_DATA, ("Just used our last xmit buffer\n") ); p_xmitPool->needBuffers = TRUE; @@ -927,7 +925,7 @@ data_checkXmitBuffers( XmitPool_t *p_xmitPool = &pData->xmitPool; KIRQL flags; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); KeAcquireSpinLock( &pData->xmitBufLock, &flags ); @@ -938,13 +936,13 @@ data_checkXmitBuffers( pData->xmitPool.needBuffers = FALSE; viport_restartXmit( pData->p_viport ); - VNIC_TRACE( VNIC_DBG_DATA | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_DATA, ("There are free xmit buffers\n") ); } KeReleaseSpinLock( &pData->xmitBufLock, flags ); - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); return; } @@ -957,7 +955,7 @@ data_rdmaPacket( ib_send_wr_t *pWrq; uint64_t remote_addr; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); pWrq = &pRdmaIo->io.wrq; @@ -992,7 +990,7 @@ data_rdmaPacket( pData->statistics.xmitNum++; #endif /* VNIC_STATISTIC */ - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); } static NDIS_PACKET * @@ -1008,7 +1006,7 @@ _data_recv_to_ndis_pkt( uint8_t rxChksumFlags; NDIS_TCP_IP_CHECKSUM_PACKET_INFO packet_info; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); pTrailer = pRdmaDest->pTrailer; start = (int)data_offset(pData, pTrailer); @@ -1054,7 +1052,7 @@ _data_recv_to_ndis_pkt( rxChksumFlags = pTrailer->rxChksumFlags; - VNIC_TRACE( VNIC_DBG_DATA | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_DATA, ("rxChksumFlags = %d, LOOP = %c, IP = %c, TCP = %c, UDP = %c\n", rxChksumFlags, (rxChksumFlags & RX_CHKSUM_FLAGS_LOOPBACK)? 'Y': 'N', @@ -1088,7 +1086,7 @@ _data_recv_to_ndis_pkt( VNIC_RECV_FROM_PACKET( p_packet ) = pRdmaDest; NDIS_SET_PACKET_STATUS( p_packet, NDIS_STATUS_SUCCESS ); - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); return p_packet; } @@ -1103,7 +1101,7 @@ _data_allocBuffers( LIST_ENTRY *p_list_entry; int index; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); index = ADD(p_recvPool->nextFreeBuf, p_recvPool->numFreeBufs, p_recvPool->eiocPoolSz); @@ -1126,7 +1124,7 @@ _data_allocBuffers( index = NEXT(index,p_recvPool->eiocPoolSz); } - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); return; } @@ -1162,7 +1160,7 @@ _data_incomingRecv( uint32_t idx = 0; BOOLEAN status = FALSE; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); while( !status ) { @@ -1227,7 +1225,8 @@ vnic_return_packet( InsertTailList( &p_viport->data.recvPool.availRecvBufs, &p_rdma_dest->listPtrs ); - if( p_viport->data.connected == TRUE ) + if( p_viport->data.connected == TRUE && + !p_viport->errored ) { _data_allocBuffers( &p_viport->data, FALSE ); _data_sendFreeRecvBuffers( &p_viport->data ); @@ -1259,7 +1258,7 @@ _data_sendFreeRecvBuffers( unsigned int numToSend, nextIncrement; - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); for ( numToSend = p_recvPool->szFreeBundle; numToSend <= p_recvPool->numFreeBufs; @@ -1277,7 +1276,6 @@ _data_sendFreeRecvBuffers( sz = numToSend * sizeof(BufferPoolEntry_t); rdmaAddr = p_recvPool->eiocRdmaAddr + offset; - //pWrq->MessageLen = sz; pWrq->ds_array->length = sz; pWrq->ds_array->vaddr = PTR64((uint8_t *)p_recvPool->bufPool + offset); pWrq->remote_ops.vaddr = rdmaAddr; @@ -1307,12 +1305,12 @@ _data_sendFreeRecvBuffers( if( p_recvPool->numPostedBufs == 0 ) { VNIC_TRACE( VNIC_DBG_ERROR, - ("%s: Unable to allocate receive buffers\n", - pData->p_viport->p_adapter->name ) ); + ("IOC %d: Unable to allocate receive buffers\n", + pData->p_viport->ioc_num ) ); viport_failure( pData->p_viport ); } - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); } @@ -1320,7 +1318,7 @@ void data_cleanup( IN Data_t *pData ) { - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); if( pData->recvPool.recv_pkt_array ) { @@ -1334,22 +1332,36 @@ data_cleanup( NdisFreeMemory( pData->pLocalStorage, pData->localStorageSz, 0 ); pData->pLocalStorage = NULL; } + + if( NdisPacketPoolUsage(pData->h_recv_pkt_pool) != 0) + { + VNIC_TRACE( VNIC_DBG_WARN, + ("Recv packet pool is not empty!!!\n") ); + NdisMSleep(100); + } + if( pData->h_recv_buf_pool ) { NdisFreeBufferPool( pData->h_recv_buf_pool ); pData->h_recv_buf_pool = NULL; } + if ( pData->h_recv_pkt_pool ) { NdisFreePacketPool( pData->h_recv_pkt_pool ); pData->h_recv_pkt_pool = NULL; } + if( pData->p_recv_bufs ) + { + NdisFreeMemory( pData->p_recv_bufs, pData->recv_bufs_sz, 0 ); + pData->p_recv_bufs = NULL; + } // clear Qp struct for reuse cl_memclr( &pData->qp, sizeof( IbQp_t) ); cl_timer_destroy( &pData->kickTimer ); - VNIC_EXIT( VNIC_DBG_CTRL ); + VNIC_EXIT( VNIC_DBG_DATA ); } @@ -1358,13 +1370,13 @@ _data_kickTimer_start( IN Data_t *pData, IN uint32_t microseconds ) { - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); InterlockedExchange( (LONG *)&pData->kickTimerOn, TRUE ); usec_timer_start(&pData->kickTimer, microseconds ); - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); return; } @@ -1372,12 +1384,12 @@ static void _data_kickTimer_stop( IN Data_t *pData ) { - VNIC_ENTER( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_ENTER( VNIC_DBG_DATA ); if( InterlockedExchange( &pData->kickTimerOn, FALSE ) == TRUE ) { cl_timer_stop( &pData->kickTimer ); } - VNIC_EXIT( VNIC_DBG_DATA | VNIC_DBG_INFO ); + VNIC_EXIT( VNIC_DBG_DATA ); } diff --git a/trunk/ulp/inic/kernel/vnic_data.h b/trunk/ulp/inic/kernel/vnic_data.h index 1aec7efc..4f156e3a 100644 --- a/trunk/ulp/inic/kernel/vnic_data.h +++ b/trunk/ulp/inic/kernel/vnic_data.h @@ -196,7 +196,7 @@ data_cleanup( (((RdmaDest_t **)P->MiniportReservedEx)[1]) #define VNIC_LIST_ITEM_FROM_PACKET( P ) \ - ((cl_list_item_t*)P->MiniportReservedEx) + ((LIST_ENTRY *)P->MiniportReservedEx) #define VNIC_PACKET_FROM_LIST_ITEM( I ) \ (PARENT_STRUCT( I, NDIS_PACKET, MiniportReservedEx )) diff --git a/trunk/ulp/inic/kernel/vnic_debug.h b/trunk/ulp/inic/kernel/vnic_debug.h index ea1dad75..bb8b6b90 100644 --- a/trunk/ulp/inic/kernel/vnic_debug.h +++ b/trunk/ulp/inic/kernel/vnic_debug.h @@ -42,23 +42,23 @@ extern uint32_t g_vnic_dbg_lvl; -#define VNIC_DBG_INIT (0x00000001) -#define VNIC_DBG_PNP (0x00000002) -#define VNIC_DBG_SEND (0x00000004) -#define VNIC_DBG_RECV (0x00000008) -#define VNIC_DBG_STATUS (0x00000010) -#define VNIC_DBG_IB (0x00000020) -#define VNIC_DBG_BUF (0x00000040) -#define VNIC_DBG_MCAST (0x00000080) -#define VNIC_DBG_ALLOC (0x00000100) -#define VNIC_DBG_OID (0x00000200) -#define VNIC_DBG_DATA (0x00000400) -#define VNIC_DBG_CTRL (0x00000800) -#define VNIC_DBG_CTRL_PKT (0x00001000) -#define VNIC_DBG_CONF (0x00002000) -#define VNIC_DBG_VIPORT (0x00004000) -#define VNIC_DBG_ADAPTER (0x00008000) -#define VNIC_DBG_NETPATH (0x00010000) +#define VNIC_DBG_INIT ( ( VNIC_DBG_INFO ) | 0x00000001 ) +#define VNIC_DBG_PNP ( ( VNIC_DBG_INFO ) | 0x00000002 ) +#define VNIC_DBG_SEND ( ( VNIC_DBG_INFO ) | 0x00000004 ) +#define VNIC_DBG_RECV ( ( VNIC_DBG_INFO ) | 0x00000008 ) +#define VNIC_DBG_STATUS ( ( VNIC_DBG_INFO ) | 0x00000010 ) +#define VNIC_DBG_IB ( ( VNIC_DBG_INFO ) | 0x00000020 ) +#define VNIC_DBG_BUF ( ( VNIC_DBG_INFO ) | 0x00000040 ) +#define VNIC_DBG_MCAST ( ( VNIC_DBG_INFO ) | 0x00000080 ) +#define VNIC_DBG_ALLOC ( ( VNIC_DBG_INFO ) | 0x00000100 ) +#define VNIC_DBG_OID ( ( VNIC_DBG_INFO ) | 0x00000200 ) +#define VNIC_DBG_DATA ( ( VNIC_DBG_INFO ) | 0x00000400 ) +#define VNIC_DBG_CTRL ( ( VNIC_DBG_INFO ) | 0x00000800 ) +#define VNIC_DBG_CTRL_PKT ( ( VNIC_DBG_INFO ) | 0x00001000 ) +#define VNIC_DBG_CONF ( ( VNIC_DBG_INFO ) | 0x00002000 ) +#define VNIC_DBG_VIPORT ( ( VNIC_DBG_INFO ) | 0x00004000 ) +#define VNIC_DBG_ADAPTER ( ( VNIC_DBG_INFO ) | 0x00008000 ) +#define VNIC_DBG_NETPATH ( ( VNIC_DBG_INFO ) | 0x00010000 ) #define VNIC_DBG_FUNC (0x10000000) /* For function entry/exit */ #define VNIC_DBG_INFO (0x20000000) /* For verbose information */ @@ -66,7 +66,6 @@ extern uint32_t g_vnic_dbg_lvl; #define VNIC_DBG_ERROR CL_DBG_ERROR #define VNIC_DBG_ALL CL_DBG_ALL -//#define VNIC_DEBUG_FLAGS ( VNIC_DBG_ERROR | VNIC_DBG_WARN | VNIC_DBG_INFO | VNIC_DBG_FUNC | VNIC_DBG_OID | VNIC_DBG_VIPORT | VNIC_DBG_CTRL | VNIC_DBG_DATA | VNIC_DBG_IB) #define VNIC_DEBUG_FLAGS ( VNIC_DBG_ERROR | VNIC_DBG_WARN | VNIC_DBG_INFO ) /* Enter and exit macros automatically add VNIC_DBG_FUNC bit */ #define VNIC_ENTER( lvl ) \ diff --git a/trunk/ulp/inic/kernel/vnic_driver.c b/trunk/ulp/inic/kernel/vnic_driver.c index 7dd33353..e9b0678e 100644 --- a/trunk/ulp/inic/kernel/vnic_driver.c +++ b/trunk/ulp/inic/kernel/vnic_driver.c @@ -39,7 +39,6 @@ vnic_globals_t g_vnic; #define DEFAULT_HOST_NAME "VNIC Host" -//uint32_t g_vnic_dbg_lvl = VNIC_DBG_ERROR | VNIC_DBG_INIT | VNIC_DBG_IB | VNIC_DBG_INFO; uint32_t g_vnic_dbg_lvl = VNIC_DEBUG_FLAGS; static void @@ -246,16 +245,15 @@ vnic_initialize( /* set NDIS features we support */ NdisMSetAttributesEx( h_handle, - p_adapter, - 5, /*check for hung t-out */ + (NDIS_HANDLE)p_adapter, + 2, /*check for hung t-out */ NDIS_ATTRIBUTE_BUS_MASTER | NDIS_ATTRIBUTE_DESERIALIZE | NDIS_ATTRIBUTE_SURPRISE_REMOVE_OK | NDIS_ATTRIBUTE_USES_SAFE_BUFFER_APIS, NdisInterfacePNPBus ); - buffer_size = sizeof(ViportTrailer_t) + - ROUNDUPP2(p_adapter->params.MaxMtu + sizeof(eth_hdr_t),VIPORT_TRAILER_ALIGNMENT ); + buffer_size = ROUNDUPP2(p_adapter->params.MinMtu + sizeof(eth_hdr_t), 8 ); status = NdisMInitializeScatterGatherDma( h_handle, TRUE, buffer_size ); if ( status != NDIS_STATUS_SUCCESS ) @@ -268,7 +266,7 @@ vnic_initialize( /* Register for IOC events */ pnp_req.pfn_pnp_cb = __vnic_pnp_cb; pnp_req.pnp_class = IB_PNP_IOC | IB_PNP_FLAG_REG_SYNC; - pnp_req.pnp_context = p_adapter; + pnp_req.pnp_context = (const void *)p_adapter; ib_status = p_adapter->ifc.reg_pnp( p_adapter->h_al, &pnp_req, &p_adapter->h_pnp ); @@ -322,6 +320,7 @@ vnic_halt( @param adapter_context The adapter context allocated at start @return TRUE if the driver determines that its NIC is not operating */ +#define VNIC_MAX_HUNG_CHK 3 BOOLEAN vnic_check_for_hang( IN NDIS_HANDLE adapter_context ) @@ -333,13 +332,13 @@ vnic_check_for_hang( if( p_adapter->p_viport ) { - p_adapter->hung = - (BOOLEAN)( p_adapter->p_viport->errored != 0 ); + if( p_adapter->p_viport->errored != 0 ) + p_adapter->hung++; } - if( p_adapter->hung ) + if( p_adapter->hung > VNIC_MAX_HUNG_CHK ) { VNIC_TRACE( VNIC_DBG_WARN, ("Adapter Hung\n")); - p_adapter->hung = FALSE; + p_adapter->hung = 0; return TRUE; } return FALSE; @@ -399,25 +398,25 @@ vnic_oid_query_info( { /* Required General */ case OID_GEN_SUPPORTED_LIST: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("received query for OID_GEN_SUPPORTED_LIST\n") ); src_buf = (PVOID)SUPPORTED_OIDS; buf_len = sizeof(SUPPORTED_OIDS); break; case OID_GEN_HARDWARE_STATUS: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("received query for OID_GEN_HARDWARE_STATUS\n") ); if( p_adapter->p_currentPath->carrier ) { - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("returning NdisHardwareStatusReady\n") ); info32 = NdisHardwareStatusReady; } else { - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("returning NdisHardwareStatusInitializing\n") ); info32 = NdisHardwareStatusNotReady; } @@ -425,14 +424,14 @@ vnic_oid_query_info( case OID_GEN_MEDIA_SUPPORTED: case OID_GEN_MEDIA_IN_USE: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("received query for OID_GEN_MEDIA_SUPPORTED " "or OID_GEN_MEDIA_IN_USE\n") ); info32 = NdisMedium802_3; break; case OID_GEN_MAXIMUM_FRAME_SIZE: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("received query for OID_GEN_MAXIMUM_FRAME_SIZE\n") ); if( !p_adapter->p_currentPath->carrier ) { @@ -446,7 +445,7 @@ vnic_oid_query_info( break; case OID_GEN_LINK_SPEED: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("received query for OID_GEN_LINK_SPEED\n") ); if( p_adapter->p_currentPath->carrier ) @@ -460,14 +459,14 @@ vnic_oid_query_info( break; case OID_GEN_TRANSMIT_BUFFER_SPACE: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("received query for OID_GEN_TRANSMIT_BUFFER_SPACE\n") ); if ( !p_adapter->p_currentPath->carrier ) { p_adapter->pending_query = TRUE; p_adapter->query_oid = oid_info; - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("returning NDIS_STATUS_PENDING\n") ); status = NDIS_STATUS_PENDING; } @@ -479,7 +478,7 @@ vnic_oid_query_info( break; case OID_GEN_RECEIVE_BUFFER_SPACE: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("received query for OID_GEN_RECEIVE_BUFFER_SPACE " "or OID_GEN_RECEIVE_BUFFER_SPACE\n") ); if ( !p_adapter->p_currentPath->carrier ) @@ -487,7 +486,7 @@ vnic_oid_query_info( p_adapter->pending_query = TRUE; p_adapter->query_oid = oid_info; - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("returning NDIS_STATUS_PENDING\n") ); status = NDIS_STATUS_PENDING; } @@ -502,7 +501,7 @@ vnic_oid_query_info( case OID_GEN_TRANSMIT_BLOCK_SIZE: case OID_GEN_RECEIVE_BLOCK_SIZE: case OID_GEN_MAXIMUM_TOTAL_SIZE: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("received query for OID_GEN_MAXIMUM_LOOKAHEAD " "or OID_GEN_CURRENT_LOOKAHEAD or " "OID_GEN_TRANSMIT_BLOCK_SIZE or " @@ -521,7 +520,7 @@ vnic_oid_query_info( break; case OID_GEN_VENDOR_ID: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("received query for OID_GEN_VENDOR_ID\n") ); src_buf = (void*)VENDOR_ID; @@ -529,14 +528,14 @@ vnic_oid_query_info( break; case OID_GEN_VENDOR_DESCRIPTION: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("received query for OID_GEN_VENDOR_DESCRIPTION\n") ); src_buf = VENDOR_DESCRIPTION; buf_len = sizeof(VENDOR_DESCRIPTION); break; case OID_GEN_VENDOR_DRIVER_VERSION: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_VENDOR_DRIVER_VERSION\n" ) ); src_buf = &version; buf_len = sizeof(version); @@ -545,19 +544,19 @@ vnic_oid_query_info( break; case OID_GEN_PHYSICAL_MEDIUM: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_PHYSICAL_MEDIUM\n" ) ); info32 = NdisPhysicalMediumUnspecified; break; case OID_GEN_CURRENT_PACKET_FILTER: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_CURRENT_PACKET_FILTER\n" ) ); info32 = p_adapter->packet_filter; break; case OID_GEN_DRIVER_VERSION: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_DRIVER_VERSION\n" ) ); src_buf = &version; buf_len = sizeof(version); @@ -565,7 +564,7 @@ vnic_oid_query_info( break; case OID_GEN_MAC_OPTIONS: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_MAC_OPTIONS\n" ) ); info32 = NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA | NDIS_MAC_OPTION_TRANSFERS_NOT_PEND | @@ -579,7 +578,7 @@ vnic_oid_query_info( break; case OID_GEN_MEDIA_CONNECT_STATUS: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_MEDIA_CONNECT_STATUS\n" ) ); info32 = ( p_adapter->carrier )? @@ -588,14 +587,14 @@ vnic_oid_query_info( break; case OID_GEN_MAXIMUM_SEND_PACKETS: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_MAXIMUM_SEND_PACKETS\n" ) ); info32 = MAXLONG; // NDIS ignored it anyway break; /* Required General Statistics */ case OID_GEN_XMIT_OK: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_XMIT_OK\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -610,7 +609,7 @@ vnic_oid_query_info( break; case OID_GEN_RCV_OK: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_RCV_OK\n" ) ); if ( !p_adapter->p_currentPath->carrier) { @@ -630,7 +629,7 @@ vnic_oid_query_info( break; case OID_GEN_XMIT_ERROR: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_XMIT_ERROR\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -645,7 +644,7 @@ vnic_oid_query_info( break; case OID_GEN_RCV_ERROR: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_RCV_ERROR\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -660,14 +659,14 @@ vnic_oid_query_info( break; case OID_GEN_RCV_NO_BUFFER: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_RCV_NO_BUFFER\n" ) ); info32 = 0; status = NDIS_STATUS_SUCCESS; break; case OID_GEN_DIRECTED_BYTES_XMIT: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_DIRECTED_BYTES_XMIT\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -682,7 +681,7 @@ vnic_oid_query_info( break; case OID_GEN_DIRECTED_FRAMES_XMIT: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_DIRECTED_FRAMES_XMIT\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -697,7 +696,7 @@ vnic_oid_query_info( break; case OID_GEN_MULTICAST_BYTES_XMIT: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_MULTICAST_BYTES_XMIT\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -712,7 +711,7 @@ vnic_oid_query_info( break; case OID_GEN_MULTICAST_FRAMES_XMIT: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_MULTICAST_FRAMES_XMIT\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -727,7 +726,7 @@ vnic_oid_query_info( break; case OID_GEN_BROADCAST_BYTES_XMIT: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_BROADCAST_BYTES_XMIT\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -742,7 +741,7 @@ vnic_oid_query_info( break; case OID_GEN_BROADCAST_FRAMES_XMIT: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_BROADCAST_FRAMES_XMIT\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -756,7 +755,7 @@ vnic_oid_query_info( } break; case OID_GEN_DIRECTED_BYTES_RCV: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_DIRECTED_BYTES_RCV\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -771,7 +770,7 @@ vnic_oid_query_info( break; case OID_GEN_DIRECTED_FRAMES_RCV: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_DIRECTED_FRAMES_RCV\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -786,7 +785,7 @@ vnic_oid_query_info( break; case OID_GEN_MULTICAST_BYTES_RCV: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_MULTICAST_BYTES_RCV\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -801,7 +800,7 @@ vnic_oid_query_info( break; case OID_GEN_MULTICAST_FRAMES_RCV: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_MULTICAST_FRAMES_RCV\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -817,7 +816,7 @@ vnic_oid_query_info( break; case OID_GEN_BROADCAST_BYTES_RCV: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_BROADCAST_BYTES_RCV\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -832,7 +831,7 @@ vnic_oid_query_info( break; case OID_GEN_BROADCAST_FRAMES_RCV: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_GEN_BROADCAST_FRAMES_RCV\n" ) ); if ( !p_adapter->p_currentPath->carrier ) { @@ -852,12 +851,12 @@ vnic_oid_query_info( #if defined( _DEBUG_ ) if( oid == OID_802_3_PERMANENT_ADDRESS ) { - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_802_3_PERMANENT_ADDRESS\n" ) ); } else { - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_802_3_CURRENT_ADDRESS\n" ) ); } #endif /* defined( _DEBUG_ )*/ @@ -866,7 +865,7 @@ vnic_oid_query_info( p_adapter->pending_query = TRUE; p_adapter->query_oid = oid_info; - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("returning NDIS_STATUS_PENDING\n") ); status = NDIS_STATUS_PENDING; } @@ -881,7 +880,7 @@ vnic_oid_query_info( VNIC_TRACE( VNIC_DBG_INFO, (" received query for OID_802_3_MULTICAST_LIST\n" ) ); - if (!p_adapter->p_currentPath->carrier && + if (!p_adapter->p_currentPath->carrier || !(p_adapter->p_viport->flags & INIC_FLAG_ENABLE_NIC) ) { p_adapter->pending_query = TRUE; @@ -915,7 +914,7 @@ vnic_oid_query_info( } break; case OID_802_3_MAC_OPTIONS: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_802_3_MAC_OPTIONS\n" ) ); info32 = 0; break; @@ -924,7 +923,7 @@ vnic_oid_query_info( case OID_802_3_RCV_ERROR_ALIGNMENT: case OID_802_3_XMIT_ONE_COLLISION: case OID_802_3_XMIT_MORE_COLLISIONS: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_802_3_RCV_ERROR_ALIGNMENT or " "OID_802_3_XMIT_ONE_COLLISION or " "OID_802_3_XMIT_MORE_COLLISIONS\n" ) ); @@ -932,7 +931,7 @@ vnic_oid_query_info( break; case OID_TCP_TASK_OFFLOAD: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received query for OID_TCP_TASK_OFFLOAD\n" ) ); src_buf = NULL; @@ -959,7 +958,7 @@ vnic_oid_query_info( case OID_802_3_XMIT_LATE_COLLISIONS: case OID_PNP_CAPABILITIES: status = NDIS_STATUS_NOT_SUPPORTED; - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received an unsupported oid of 0x%.8X!\n" , oid) ); break; @@ -971,7 +970,7 @@ vnic_oid_query_info( #endif default: status = NDIS_STATUS_INVALID_OID; - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received an invalid oid of 0x%.8X!\n" , oid) ); break; } @@ -1011,7 +1010,7 @@ _vnic_complete_query( { if( p_oid_info->buf_len < buf_len ) { - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("Insufficient buffer space. " "Returning NDIS_STATUS_INVALID_LENGTH.\n") ); oid_status = NDIS_STATUS_INVALID_LENGTH; @@ -1029,7 +1028,7 @@ _vnic_complete_query( } else { - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("Returning NDIS_NOT_ACCEPTED") ); oid_status = NDIS_STATUS_NOT_ACCEPTED; } @@ -1219,23 +1218,37 @@ NDIS_STATUS_RESET_IN_PROGRESS, NDIS_STATUS_SOFT_ERRORS, NDIS_STATUS_HARD_ERRORS */ NDIS_STATUS vnic_reset( - OUT PBOOLEAN p_addr_reset, - IN NDIS_HANDLE adapter_context) + OUT PBOOLEAN p_addr_reset, + IN NDIS_HANDLE adapter_context) { -// vnic_adapter_t* p_adapter; + vnic_adapter_t* p_adapter; + ib_api_status_t status; VNIC_ENTER( VNIC_DBG_INIT ); + CL_ASSERT( p_addr_reset ); CL_ASSERT( adapter_context ); - //p_adapter = (vnic_adapter_t*)adapter_context; - *p_addr_reset = TRUE; - UNREFERENCED_PARAMETER( adapter_context ); + p_adapter = (vnic_adapter_t*)adapter_context; + status = vnic_reset_adapter( p_adapter ); VNIC_EXIT( VNIC_DBG_INIT ); - return NDIS_STATUS_SUCCESS; -} + switch( status ) + { + case IB_SUCCESS: + *p_addr_reset = TRUE; + return NDIS_STATUS_SUCCESS; + + case IB_NOT_DONE: + return NDIS_STATUS_PENDING; + case IB_INVALID_STATE: + return NDIS_STATUS_RESET_IN_PROGRESS; + + default: + return NDIS_STATUS_HARD_ERRORS; + } +} //! Request changes in the state information that the miniport driver maintains /* For example, this is used to set multicast addresses and the packet filter. @@ -1272,7 +1285,7 @@ vnic_oid_set_info( CL_ASSERT( p_bytes_read ); CL_ASSERT( p_bytes_needed ); - CL_ASSERT( !p_adapter->pending_set ); + CL_ASSERT( p_adapter->pending_set == 0 ); status = NDIS_STATUS_SUCCESS; *p_bytes_needed = 0; @@ -1296,7 +1309,9 @@ vnic_oid_set_info( /* Required General */ case OID_GEN_CURRENT_PACKET_FILTER: VNIC_TRACE( VNIC_DBG_INFO, - (" received set for OID_GEN_CURRENT_PACKET_FILTER, %#x\n", *(uint32_t*)info_buf )); + (" IOC %d received set for OID_GEN_CURRENT_PACKET_FILTER, %#x\n", + p_adapter->p_currentPath->pViport->ioc_num, + *(uint32_t*)info_buf )); if ( !p_adapter->p_currentPath->carrier ) { status = NDIS_STATUS_NOT_ACCEPTED; @@ -1318,14 +1333,14 @@ vnic_oid_set_info( break; case OID_GEN_CURRENT_LOOKAHEAD: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received set for OID_GEN_CURRENT_LOOKAHEAD\n" )); if( info_buf_len < buf_len ) status = NDIS_STATUS_INVALID_LENGTH; break; case OID_GEN_PROTOCOL_OPTIONS: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received set for OID_GEN_PROTOCOL_OPTIONS\n" )); if( info_buf_len < buf_len ) status = NDIS_STATUS_INVALID_LENGTH; @@ -1333,7 +1348,7 @@ vnic_oid_set_info( #ifdef NDIS51_MINIPORT case OID_GEN_MACHINE_NAME: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received set for OID_GEN_MACHINE_NAME\n" ) ); if( info_buf_len < buf_len ) status = NDIS_STATUS_INVALID_LENGTH; @@ -1351,7 +1366,8 @@ vnic_oid_set_info( break; } VNIC_TRACE( VNIC_DBG_INFO, - (" received set for OID_802_3_MULTICAST_LIST\n" ) ); + (" IOC %d received set for OID_802_3_MULTICAST_LIST\n", + p_adapter->p_currentPath->pViport->ioc_num ) ); if( info_buf_len > MAX_MCAST * sizeof(mac_addr_t) ) { VNIC_TRACE( VNIC_DBG_INFO, @@ -1367,7 +1383,7 @@ vnic_oid_set_info( } else if( info_buf == NULL && info_buf_len != 0 ) { - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" OID_802_3_MULTICAST_LIST - Invalid input buffer.\n" ) ); status = NDIS_STATUS_INVALID_DATA; } @@ -1380,7 +1396,7 @@ vnic_oid_set_info( break; case OID_TCP_TASK_OFFLOAD: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received set for OID_TCP_TASK_OFFLOAD\n" ) ); buf_len = info_buf_len; status = __vnic_set_tcp_task_offload( p_adapter, info_buf, &buf_len ); @@ -1388,7 +1404,7 @@ vnic_oid_set_info( /* Optional General */ case OID_GEN_TRANSPORT_HEADER_OFFSET: - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, ("Set for OID_GEN_TRANSPORT_HEADER_OFFSET\n") ); break; #ifdef NDIS51_MINIPORT @@ -1396,7 +1412,7 @@ vnic_oid_set_info( case OID_GEN_VLAN_ID: #endif status = NDIS_STATUS_NOT_SUPPORTED; - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received an unsupported oid of 0x%.8X!\n" , oid)); break; @@ -1423,7 +1439,7 @@ vnic_oid_set_info( case OID_GEN_PHYSICAL_MEDIUM: default: status = NDIS_STATUS_INVALID_OID; - VNIC_TRACE( VNIC_DBG_OID | VNIC_DBG_INFO, + VNIC_TRACE( VNIC_DBG_OID, (" received an invalid oid of 0x%.8X!\n" , oid)); break; } @@ -1465,37 +1481,21 @@ vnic_send_packets( IN PPNDIS_PACKET packet_array, IN UINT num_packets ) { - vnic_adapter_t *p_adapter; - viport_t *p_viport; + vnic_adapter_t* const p_adapter =(vnic_adapter_t* const )adapter_context; + viport_t *p_viport = p_adapter->p_viport; UINT packet_num; VNIC_ENTER( VNIC_DBG_SEND ); CL_ASSERT( adapter_context ); - - p_adapter = (vnic_adapter_t*)adapter_context; - p_viport = p_adapter->p_viport; - - NdisAcquireSpinLock( &p_adapter->lock ); - - if( !p_adapter->carrier ) - { - NdisReleaseSpinLock( &p_adapter->lock ); - for( packet_num = 0; packet_num < num_packets; ++packet_num ) - { - NdisMSendComplete( p_adapter->h_handle, - packet_array[packet_num], NDIS_STATUS_ADAPTER_NOT_READY ); - } - VNIC_EXIT( VNIC_DBG_SEND ); - return; - } - NdisReleaseSpinLock( &p_adapter->lock ); + CL_ASSERT( p_viport ); for( packet_num = 0; packet_num < num_packets; ++packet_num ) { netpath_xmitPacket( p_adapter->p_currentPath, packet_array[packet_num] ); } + VNIC_EXIT( VNIC_DBG_SEND ); } @@ -1543,7 +1543,7 @@ vnic_resume_set_oids( IN vnic_adapter_t* const p_adapter ) { NDIS_STATUS status = NDIS_STATUS_SUCCESS; - BOOLEAN pending_set; + int pending_set; pending_oid_t set_oid = {0}; VNIC_ENTER( VNIC_DBG_OID ); @@ -1568,7 +1568,7 @@ vnic_resume_set_oids( if( pending_set ) { set_oid = p_adapter->set_oid; - p_adapter->pending_set = FALSE; + --p_adapter->pending_set; } NdisReleaseSpinLock( &p_adapter->lock ); @@ -1579,6 +1579,9 @@ vnic_resume_set_oids( switch( set_oid.oid ) { case OID_GEN_CURRENT_PACKET_FILTER: + VNIC_TRACE( VNIC_DBG_INFO, + (" IOC %d resume PACKET_FILTER set \n", + p_adapter->p_currentPath->pViport->ioc_num ) ); /* Validation already performed in the SetInformation path. */ p_adapter->packet_filter = *(PULONG)set_oid.p_buf; NdisMSetInformationComplete( p_adapter->h_handle, status ); @@ -1590,6 +1593,10 @@ vnic_resume_set_oids( break; case OID_802_3_MULTICAST_LIST: + VNIC_TRACE( VNIC_DBG_INFO, + (" IOC %d resume MULTICAST_LIST\n", + p_adapter->p_currentPath->pViport->ioc_num ) ); + NdisMSetInformationComplete( p_adapter->h_handle, status ); break; @@ -1845,32 +1852,50 @@ _vnic_process_packet_filter( ASSERT( (p_adapter->p_viport->updates & ~MCAST_OVERFLOW) == 0 ); - if( pkt_filter & NDIS_PACKET_TYPE_ALL_MULTICAST ) + if( pkt_filter == 0 ) + { /* gateway will disable forwarding for associated viport */ + p_adapter->p_viport->newFlags &= ~INIC_FLAG_ENABLE_NIC; + InterlockedOr( &p_adapter->p_viport->updates, NEED_LINK_CONFIG ); + } + else { - if( !p_adapter->p_viport->flags & INIC_FLAG_ENABLE_MCAST_ALL ) + if( !( p_adapter->p_viport->flags & INIC_FLAG_ENABLE_NIC ) ) + { + p_adapter->p_viport->newFlags &= ~INIC_FLAG_DISABLE_NIC; + p_adapter->p_viport->newFlags |= INIC_FLAG_ENABLE_NIC; + InterlockedOr( &p_adapter->p_viport->updates, NEED_LINK_CONFIG ); + } + + if( pkt_filter & NDIS_PACKET_TYPE_ALL_MULTICAST ) { - p_adapter->p_viport->newFlags |= INIC_FLAG_ENABLE_MCAST_ALL; - // TODO: Shouldn't MCAST_OVERFLOW be a flag bit, not an update bit? - InterlockedOr( &p_adapter->p_viport->updates, + if( !( p_adapter->p_viport->flags & INIC_FLAG_ENABLE_MCAST_ALL ) ) + { + p_adapter->p_viport->newFlags |= INIC_FLAG_ENABLE_MCAST_ALL; + // TODO: Shouldn't MCAST_OVERFLOW be a flag bit, not an update bit? + InterlockedOr( &p_adapter->p_viport->updates, NEED_LINK_CONFIG | MCAST_OVERFLOW ); + } } - } - if ( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ) - { - if( !p_adapter->p_viport->flags & INIC_FLAG_ENABLE_PROMISC ) + + if ( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ) { - p_adapter->p_viport->newFlags |= INIC_FLAG_ENABLE_PROMISC; - InterlockedOr( &p_adapter->p_viport->updates, NEED_LINK_CONFIG ); + if( !( p_adapter->p_viport->flags & INIC_FLAG_ENABLE_PROMISC ) ) + { + p_adapter->p_viport->newFlags |= INIC_FLAG_ENABLE_PROMISC; + InterlockedOr( &p_adapter->p_viport->updates, NEED_LINK_CONFIG ); + } } } - /* BROADCAST and MULTICAST flags VEx enable by default */ - p_adapter->pending_set = TRUE; + /* ENABLE NIC, BROADCAST and MULTICAST flags set on start */ + + ++p_adapter->pending_set; status = _viport_process_query( p_adapter->p_viport, FALSE ); VNIC_TRACE( VNIC_DBG_INFO, ("LINK CONFIG status %x\n", status )); if( status != NDIS_STATUS_PENDING ) - p_adapter->pending_set = FALSE; - + { + --p_adapter->pending_set; + } VNIC_EXIT( VNIC_DBG_FUNC ); return status; } diff --git a/trunk/ulp/inic/kernel/vnic_ib.c b/trunk/ulp/inic/kernel/vnic_ib.c index 888c0981..940d4655 100644 --- a/trunk/ulp/inic/kernel/vnic_ib.c +++ b/trunk/ulp/inic/kernel/vnic_ib.c @@ -418,6 +418,7 @@ _ibqp_detach_cb( CL_ASSERT( p_drep_rec ); InterlockedExchange( &pQp->qpState, IB_DETACHED ); + viport_failure( pQp->pViport ); VNIC_EXIT( VNIC_DBG_IB ); } @@ -650,7 +651,7 @@ ibqp_postRecv(IbQp_t *pQp, Io_t *pIo) pQp->pViport->p_adapter->ifc.get_err_str(ib_status), ib_status )); NdisReleaseSpinLock( &pQp->qpLock ); - return FALSE; + return ib_status; } else { diff --git a/trunk/ulp/inic/kernel/vnic_netpath.c b/trunk/ulp/inic/kernel/vnic_netpath.c index a20862e6..65926a7e 100644 --- a/trunk/ulp/inic/kernel/vnic_netpath.c +++ b/trunk/ulp/inic/kernel/vnic_netpath.c @@ -29,7 +29,6 @@ netpath_init( return; } - BOOLEAN netpath_addPath ( Netpath_t *pNetpath, @@ -66,28 +65,6 @@ netpath_removePath( } -BOOLEAN netpath_setUnicast(Netpath_t *pNetpath, uint8_t *pAddress) -{ - BOOLEAN ret = FALSE; - - // TODO: Not called anywhere!!! - VNIC_TRACE( VNIC_DBG_NETPATH | VNIC_DBG_INFO, - ("Set %s MAC to %02X:%02X:%02X:%02X:%02X:%02X\n", - netpath_to_string(pNetpath->p_adapter, pNetpath), - pAddress[0], - pAddress[1], - pAddress[2], - pAddress[3], - pAddress[4], - pAddress[5]) ); - - if (pNetpath->pViport) - { - ret = viport_setUnicast( pNetpath->pViport, pAddress ); - } - return ret; -} - int netpath_maxMtu(Netpath_t *pNetpath) { diff --git a/trunk/ulp/inic/kernel/vnic_trailer.h b/trunk/ulp/inic/kernel/vnic_trailer.h index d128780f..05b1df19 100644 --- a/trunk/ulp/inic/kernel/vnic_trailer.h +++ b/trunk/ulp/inic/kernel/vnic_trailer.h @@ -74,6 +74,9 @@ #define ROUNDUPP2(val, align) \ (((uintn_t)(val) + (uintn_t)(align) - 1) & (~((uintn_t)(align)-1))) #endif +/* roundup address to align */ +#define ADDR_ROUNDUPP2(_addr, _align) \ + ((VOID *)(((ULONG_PTR)(_addr) + (_align - 1)) & ( ~(_align - 1) ))) #define VIPORT_TRAILER_ALIGNMENT 32 #define BUFFER_SIZE(len) (sizeof(ViportTrailer_t) + ROUNDUPP2((len), VIPORT_TRAILER_ALIGNMENT)) diff --git a/trunk/ulp/inic/kernel/vnic_viport.c b/trunk/ulp/inic/kernel/vnic_viport.c index 02be3cfb..d6e823dd 100644 --- a/trunk/ulp/inic/kernel/vnic_viport.c +++ b/trunk/ulp/inic/kernel/vnic_viport.c @@ -48,6 +48,8 @@ uint32_t viport_get_adapter_name( IN viport_t *p_viport ) { + /* TODO: consider unique addressable and friendly name + should I use ioc profile string ? seem too long */ cl_memcpy(p_viport->p_adapter->name, DEFAULT_VNIC_NAME, sizeof(DEFAULT_VNIC_NAME) ); return ( sizeof(DEFAULT_VNIC_NAME) ); } @@ -80,16 +82,7 @@ viport_config_defaults( min( sizeof( p_adapter->ioc_info.profile.id_string ), sizeof( pConfig->ioc_string )) ); - pControlConfig->ibConfig.sid = - 0x10ULL << 56 | - 0x00ULL << 48 | - 0x06ULL << 40 | - 0x6aULL << 32 | - 0x00ULL << 24 | - 0x00ULL << 16 | - 0x00ULL << 8 | - ( (uint8_t)( p_adapter->ioc_info.profile.ioc_guid >> 24 ) & 0xFF ); - + pControlConfig->ibConfig.sid = 0; /* will set it later, from svc entries */ pControlConfig->ibConfig.connData.pathId = 0; pControlConfig->ibConfig.connData.inicInstance = 0; pControlConfig->ibConfig.connData.pathNum = 0; @@ -119,16 +112,7 @@ viport_config_defaults( pControlConfig->reqRetryCount = (uint8_t)p_adapter->params.ControlReqRetryCount; pControlConfig->rspTimeout = p_adapter->params.ControlRspTimeout; - pDataConfig->ibConfig.sid = - 0x10LL << 56 | - 0x00LL << 48 | - 0x06LL << 40 | - 0x6aLL << 32 | - 0x00LL << 24 | - 0x00LL << 16 | - 0x01LL << 8 | - ( (uint8_t)( p_adapter->ioc_info.profile.ioc_guid >> 24 ) & 0xFF ); - + pDataConfig->ibConfig.sid = 0; /* will set it later, from svc entries */ pDataConfig->ibConfig.connData.pathId = get_time_stamp_ms(); pDataConfig->ibConfig.connData.inicInstance = pControlConfig->inicInstance; pDataConfig->ibConfig.connData.pathNum = 0; @@ -420,7 +404,7 @@ viport_setUnicast( /* Returns flags for state machine operations. */ NDIS_STATUS viport_setMulticast( - IN viport_t *p_viport ) + IN viport_t* const p_viport ) { vnic_adapter_t *p_adapter = p_viport->p_adapter; uint32_t updates = 0; @@ -446,12 +430,6 @@ viport_setMulticast( } else if( p_adapter->mc_count == 0 ) { - /* NDIS can send us a NULL array to clear all entries */ - if( InterlockedAnd( - &p_viport->updates, ~MCAST_OVERFLOW ) & MCAST_OVERFLOW ) - { - updates |= NEED_LINK_CONFIG; - } /* invalidate all entries for the remote */ for (i = MCAST_ADDR_START; i < min( MAX_ADDR_ARRAY, p_viport->numMacAddresses ); i++ ) @@ -459,7 +437,6 @@ viport_setMulticast( p_viport->macAddresses[i].valid = 0; p_viport->macAddresses[i].operation = INIC_OP_SET_ENTRY; } - updates |= NEED_ADDRESS_CONFIG; } else { @@ -515,7 +492,6 @@ viport_setMulticast( return status; } - NDIS_STATUS viport_getStats( IN viport_t *p_viport ) @@ -532,8 +508,8 @@ viport_getStats( p_viport->lastStatsTime = (uint32_t)stats_update_ms; InterlockedOr( &p_viport->updates, NEED_STATS ); - // TODO: Should the following call be synchronous? - status = _viport_process_query( p_viport, TRUE ); + + status = _viport_process_query( p_viport, FALSE ); if ( status != NDIS_STATUS_SUCCESS ) { VNIC_TRACE( VNIC_DBG_ERROR, @@ -553,30 +529,34 @@ viport_xmitPacket( { BOOLEAN status = FALSE; KIRQL flags; - cl_list_item_t *p_list_item; + LIST_ENTRY *p_list_item; VNIC_ENTER( VNIC_DBG_VIPORT ); - KeAcquireSpinLock( &p_viport->lock, &flags ); - - if( p_viport->p_adapter->xmitStarted ) + if( !p_viport->p_adapter->xmitStarted ) + { + NdisInterlockedInsertTailList( + &p_viport->send_pending_list, + VNIC_LIST_ITEM_FROM_PACKET( p_packet ), + &p_viport->pending_list_lock ); + } + else { - for( p_list_item = cl_qlist_remove_head( &p_viport->send_pending_list ); - p_list_item != cl_qlist_end( &p_viport->send_pending_list ); - p_list_item = cl_qlist_remove_head( &p_viport->send_pending_list ) ) + while( ( p_list_item = NdisInterlockedRemoveHeadList( + &p_viport->send_pending_list, + &p_viport->pending_list_lock ) ) != NULL ) { + KeAcquireSpinLock( &p_viport->lock, &flags ); status = data_xmitPacket( &p_viport->data, - VNIC_PACKET_FROM_LIST_ITEM( p_list_item )); + VNIC_PACKET_FROM_LIST_ITEM( p_list_item )); + KeReleaseSpinLock( &p_viport->lock, flags ); } + + /* just send a packet */ + KeAcquireSpinLock( &p_viport->lock, &flags ); status = data_xmitPacket( &p_viport->data, p_packet ); + KeReleaseSpinLock( &p_viport->lock, flags ); } - else - { - cl_qlist_insert_tail( &p_viport->send_pending_list, - VNIC_LIST_ITEM_FROM_PACKET( p_packet ) ); - } - - KeReleaseSpinLock( &p_viport->lock, flags ); VNIC_EXIT( VNIC_DBG_VIPORT ); return status; @@ -585,10 +565,14 @@ viport_xmitPacket( void viport_linkUp(viport_t *p_viport) { VNIC_ENTER( VNIC_DBG_VIPORT ); - InterlockedExchange( &p_viport->p_adapter->carrier, TRUE ); - NdisMIndicateStatus( p_viport->p_adapter->h_handle, - NDIS_STATUS_MEDIA_CONNECT, NULL, 0 ); - NdisMIndicateStatusComplete( p_viport->p_adapter->h_handle ); + + if( p_viport->p_netpath->carrier == TRUE && + InterlockedExchange( &p_viport->p_adapter->carrier, TRUE ) == FALSE ) + { + NdisMIndicateStatus( p_viport->p_adapter->h_handle, + NDIS_STATUS_MEDIA_CONNECT, NULL, 0 ); + NdisMIndicateStatusComplete( p_viport->p_adapter->h_handle ); + } VNIC_EXIT( VNIC_DBG_VIPORT ); return; } @@ -596,10 +580,12 @@ void viport_linkUp(viport_t *p_viport) void viport_linkDown(viport_t *p_viport) { VNIC_ENTER( VNIC_DBG_VIPORT ); - InterlockedExchange( &p_viport->p_adapter->carrier, FALSE ); - NdisMIndicateStatus( p_viport->p_adapter->h_handle, + if ( InterlockedExchange( &p_viport->p_adapter->carrier, FALSE ) == TRUE ) + { + NdisMIndicateStatus( p_viport->p_adapter->h_handle, NDIS_STATUS_MEDIA_DISCONNECT, NULL, 0 ); - NdisMIndicateStatusComplete( p_viport->p_adapter->h_handle ); + NdisMIndicateStatusComplete( p_viport->p_adapter->h_handle ); + } VNIC_EXIT( VNIC_DBG_VIPORT ); return; } @@ -638,7 +624,14 @@ viport_failure( { VNIC_ENTER( VNIC_DBG_VIPORT ); - InterlockedExchange( (volatile LONG*)&p_viport->errored, 1 ); + CL_ASSERT( p_viport ); + + InterlockedExchange( &p_viport->p_netpath->carrier, FALSE ); + + if( InterlockedExchange( (volatile LONG*)&p_viport->errored, TRUE ) == FALSE ) + { + viport_linkDown( p_viport ); + } VNIC_EXIT( VNIC_DBG_VIPORT ); } @@ -649,15 +642,18 @@ viport_timeout( IN void *context ) { viport_t *p_viport = (viport_t *)context; + CL_ASSERT( p_viport ); InterlockedExchange( &p_viport->timerActive, FALSE ); - if( p_viport && p_viport->data.connected ) + if( p_viport && + p_viport->data.connected && + !p_viport->errored ) { // TODO: What about send failure? if( !p_viport->control.reqOutstanding ) { - control_heartbeatReq( &p_viport->control, - p_viport->port_config.hbTimeout ); + control_heartbeatReq( &p_viport->control, + p_viport->port_config.hbTimeout ); } else { /* send WQE is taken, send heartbeat later */ @@ -672,7 +668,7 @@ viport_timer( IN viport_t *p_viport, IN int timeout ) { - VNIC_ENTER( VNIC_DBG_VIPORT );; + VNIC_ENTER( VNIC_DBG_VIPORT ); InterlockedExchange( &p_viport->timerActive, TRUE ); cl_timer_start( &p_viport->timer, (uint32_t)timeout ); @@ -1024,7 +1020,7 @@ _viport_process_query( if( sync ) { - cl_event_wait_on( &p_viport->conn_event, EVENT_NO_TIMEOUT, FALSE ); + cl_event_wait_on( &p_viport->conn_event, EVENT_NO_TIMEOUT, TRUE ); if( p_viport->linkState != expected_state ) { diff --git a/trunk/ulp/inic/kernel/vnic_viport.h b/trunk/ulp/inic/kernel/vnic_viport.h index 529d1244..6023e3f1 100644 --- a/trunk/ulp/inic/kernel/vnic_viport.h +++ b/trunk/ulp/inic/kernel/vnic_viport.h @@ -153,7 +153,8 @@ typedef struct _viport { LIST_ENTRY listPtrs; KSPIN_LOCK lock; cl_obj_t obj; - cl_qlist_t send_pending_list; + LIST_ENTRY send_pending_list; + NDIS_SPIN_LOCK pending_list_lock; struct _vnic_adapter *p_adapter; struct Netpath *p_netpath; struct ViportConfig port_config; @@ -161,7 +162,7 @@ typedef struct _viport { struct Data data; uint64_t iocGuid; uint64_t portGuid; - + uint32_t ioc_num; // connected/disconnected state of control and data QPs. viport_state_t state; @@ -227,7 +228,7 @@ void viport_restartXmit(viport_t *pViport); void viport_recvPacket(viport_t *pViport, NDIS_PACKET *pkt ); void viport_failure(viport_t *pViport); BOOLEAN viport_setUnicast(viport_t *pViport, uint8_t *pAddress); -NDIS_STATUS viport_setMulticast( viport_t *pViport ); +NDIS_STATUS viport_setMulticast( viport_t* const pViport ); #define viport_portGuid(pViport) ((pViport)->portGuid) #define viport_maxMtu(pViport) data_maxMtu(&(pViport)->data) @@ -244,7 +245,6 @@ void netpath_init( struct Netpath *pNetpath, struct _vnic_adapter *p_adapter BOOLEAN netpath_addPath(struct Netpath *pNetpath, viport_t *pViport); BOOLEAN netpath_removePath(struct Netpath *pNetpath, viport_t *pViport); BOOLEAN netpath_getStats(struct Netpath *pNetpath ); -BOOLEAN netpath_setUnicast(struct Netpath *pNetpath, uint8_t *pAddress); BOOLEAN netpath_setMulticast(struct Netpath *pNetpath, mc_list_t *mc_list, int mc_count); int netpath_maxMtu(struct Netpath *pNetpath);