From: aestrin Date: Fri, 27 Oct 2006 12:58:59 +0000 (+0000) Subject: [VNIC]Added support for new remote features flags, corrected adapter state change... X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=1a84499e548c9fd0aa06e5f2817180ee712b04ee;p=~shefty%2Frdma-win.git [VNIC]Added support for new remote features flags, corrected adapter state change handling, async pnp deregister, minor cleanup. git-svn-id: svn://openib.tc.cornell.edu/gen1@530 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- diff --git a/trunk/ulp/inic/kernel/inic.rc b/trunk/ulp/inic/kernel/inic.rc index c407fe44..93bede17 100644 --- a/trunk/ulp/inic/kernel/inic.rc +++ b/trunk/ulp/inic/kernel/inic.rc @@ -33,7 +33,7 @@ #include #define VER_FILETYPE VFT_DRV -#define VER_FILESUBTYPE VFT2_UNKNOWN +#define VER_FILESUBTYPE VFT2_DRV_NETWORK #ifdef _DEBUG_ #define VER_FILEDESCRIPTION_STR "Virtual Nic NDIS Miniport (Debug)" diff --git a/trunk/ulp/inic/kernel/vnic_adapter.c b/trunk/ulp/inic/kernel/vnic_adapter.c index 8e6508aa..87d98dc5 100644 --- a/trunk/ulp/inic/kernel/vnic_adapter.c +++ b/trunk/ulp/inic/kernel/vnic_adapter.c @@ -179,7 +179,7 @@ vnic_destroy_adapter( if( p_adapter->h_pnp ) { ib_status = - p_adapter->ifc.dereg_pnp( p_adapter->h_pnp, ib_sync_destroy ); + p_adapter->ifc.dereg_pnp( p_adapter->h_pnp, NULL ); } vnic_viport_cleanup( p_adapter ); @@ -1002,7 +1002,10 @@ vnic_viport_cleanup( VNIC_ENTER( VNIC_DBG_ADAPTER ); if ( p_adapter->p_viport ) + { + InterlockedExchange( (volatile LONG *)&p_adapter->p_viport->disconnect, TRUE ); viport_cleanup(p_adapter->p_viport ); + } p_adapter->p_viport = NULL; VNIC_EXIT( VNIC_DBG_ADAPTER ); diff --git a/trunk/ulp/inic/kernel/vnic_adapter.h b/trunk/ulp/inic/kernel/vnic_adapter.h index ca271ee0..16b13793 100644 --- a/trunk/ulp/inic/kernel/vnic_adapter.h +++ b/trunk/ulp/inic/kernel/vnic_adapter.h @@ -109,7 +109,6 @@ typedef struct _vnic_adapter { LIST_ENTRY list_entry; NDIS_HANDLE h_handle; DEVICE_OBJECT *p_pdo; -// cl_obj_t obj; NDIS_SPIN_LOCK lock; ib_al_ifc_t ifc; ioc_ifc_data_t ifc_data; @@ -135,7 +134,6 @@ typedef struct _vnic_adapter { uint32_t packet_filter; int hung; BOOLEAN reset; - //BOOLEAN pending_set; int pending_set; BOOLEAN pending_query; pending_oid_t query_oid; diff --git a/trunk/ulp/inic/kernel/vnic_controlpkt.h b/trunk/ulp/inic/kernel/vnic_controlpkt.h index 378d792e..2c8b4306 100644 --- a/trunk/ulp/inic/kernel/vnic_controlpkt.h +++ b/trunk/ulp/inic/kernel/vnic_controlpkt.h @@ -33,11 +33,13 @@ #define _VNIC_CONTROLPKT_H_ #include +#define MAX_HOST_NAME_SIZE 64 + typedef struct Inic_ConnectionData { uint64_t pathId; uint8_t inicInstance; uint8_t pathNum; - uint8_t nodename[65]; + uint8_t nodename[MAX_HOST_NAME_SIZE+1]; uint8_t reserved; uint32_t featuresSupported; } Inic_ConnectionData_t; @@ -281,4 +283,4 @@ typedef struct _mac_addr */ #include -#endif /* _VNIC_CONTROLPKT_H_ */ \ No newline at end of file +#endif /* _VNIC_CONTROLPKT_H_ */ diff --git a/trunk/ulp/inic/kernel/vnic_data.c b/trunk/ulp/inic/kernel/vnic_data.c index fed40da2..3c9196cc 100644 --- a/trunk/ulp/inic/kernel/vnic_data.c +++ b/trunk/ulp/inic/kernel/vnic_data.c @@ -980,6 +980,12 @@ data_rdmaPacket( } pWrq->send_opt = IB_SEND_OPT_SIGNALED; + if( pData->p_viport->featuresSupported & INIC_FEAT_RDMA_IMMED ) + { + pWrq->send_opt |= IB_SEND_OPT_IMMEDIATE; + pWrq->immediate_data = 0; + } + if( ibqp_postSend( &pData->qp, &pRdmaIo->io ) != IB_SUCCESS ) { VNIC_TRACE(VNIC_DBG_ERROR, @@ -1040,7 +1046,8 @@ _data_recv_to_ndis_pkt( NdisChainBufferAtFront( p_packet, pRdmaDest->p_buf ); pRdmaDest->p_packet = p_packet; - if ( pTrailer->pktFlags & PF_VLAN_INSERT ) + if ( pTrailer->pktFlags & PF_VLAN_INSERT && + !( pData->p_viport->featuresSupported & INIC_FEAT_IGNORE_VLAN ) ) { /* TODO: * add OID_GEN_VLAN_ID diff --git a/trunk/ulp/inic/kernel/vnic_debug.h b/trunk/ulp/inic/kernel/vnic_debug.h index bb8b6b90..37b22526 100644 --- a/trunk/ulp/inic/kernel/vnic_debug.h +++ b/trunk/ulp/inic/kernel/vnic_debug.h @@ -66,7 +66,7 @@ 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 ) +#define VNIC_DEBUG_FLAGS ( VNIC_DBG_ERROR | VNIC_DBG_WARN ) /* Enter and exit macros automatically add VNIC_DBG_FUNC bit */ #define VNIC_ENTER( lvl ) \ CL_ENTER( (lvl | VNIC_DBG_FUNC), g_vnic_dbg_lvl ) diff --git a/trunk/ulp/inic/kernel/vnic_driver.c b/trunk/ulp/inic/kernel/vnic_driver.c index e9b0678e..8ea0aad8 100644 --- a/trunk/ulp/inic/kernel/vnic_driver.c +++ b/trunk/ulp/inic/kernel/vnic_driver.c @@ -394,6 +394,13 @@ vnic_oid_query_info( src_buf = &info32; buf_len = sizeof(info32); + if( !p_adapter->p_viport || + !p_adapter->p_currentPath->carrier ) + { + status = NDIS_STATUS_NOT_ACCEPTED; + goto complete; + } + switch( oid ) { /* Required General */ @@ -463,12 +470,7 @@ vnic_oid_query_info( ("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, - ("returning NDIS_STATUS_PENDING\n") ); - status = NDIS_STATUS_PENDING; + status= NDIS_STATUS_NOT_ACCEPTED; } else { @@ -483,12 +485,7 @@ vnic_oid_query_info( "or OID_GEN_RECEIVE_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, - ("returning NDIS_STATUS_PENDING\n") ); - status = NDIS_STATUS_PENDING; + status = NDIS_STATUS_NOT_ACCEPTED; } else { @@ -662,7 +659,6 @@ vnic_oid_query_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: @@ -806,7 +802,6 @@ vnic_oid_query_info( { info32 = 0; } - else { info64 = p_adapter->p_viport->stats.ifInMulticastPkts; @@ -860,6 +855,13 @@ vnic_oid_query_info( (" received query for OID_802_3_CURRENT_ADDRESS\n" ) ); } #endif /* defined( _DEBUG_ )*/ + if( !p_adapter->p_viport || + p_adapter->p_viport->errored || + p_adapter->p_viport->disconnect ) + { + status = NDIS_STATUS_NOT_ACCEPTED; + break; + } if ( !p_adapter->macSet ) { p_adapter->pending_query = TRUE; @@ -981,6 +983,7 @@ vnic_oid_query_info( * Note that this requires the QueryInformation entry point to always * return NDIS_STATUS_PENDING */ +complete: if( status != NDIS_STATUS_PENDING ) { _vnic_complete_query( @@ -1482,13 +1485,11 @@ vnic_send_packets( IN UINT num_packets ) { 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 ); - CL_ASSERT( p_viport ); for( packet_num = 0; packet_num < num_packets; ++packet_num ) { @@ -1629,6 +1630,13 @@ vnic_resume_oids( * Set the status depending on our state. Fail OID requests that * are pending while we reset the adapter. */ + if( !p_adapter->p_viport || + p_adapter->p_viport->disconnect == TRUE || + p_adapter->p_viport->errored == TRUE ) + { + status = NDIS_STATUS_NOT_ACCEPTED; + } + switch( p_adapter->pnp_state ) { case IB_PNP_IOC_ADD: @@ -1662,7 +1670,10 @@ vnic_resume_oids( { case OID_802_3_CURRENT_ADDRESS: case OID_802_3_PERMANENT_ADDRESS: - cl_memcpy( mac, p_adapter->p_viport->hwMacAddress, HW_ADDR_LEN ); + if ( status == NDIS_STATUS_SUCCESS ) + { + cl_memcpy( mac, p_adapter->p_viport->hwMacAddress, HW_ADDR_LEN ); + } _vnic_complete_query( p_adapter, &query_oid, status, @@ -1852,40 +1863,33 @@ _vnic_process_packet_filter( ASSERT( (p_adapter->p_viport->updates & ~MCAST_OVERFLOW) == 0 ); - if( pkt_filter == 0 ) - { /* gateway will disable forwarding for associated viport */ - p_adapter->p_viport->newFlags &= ~INIC_FLAG_ENABLE_NIC; + 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 ); } - else - { - 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 ) + if( pkt_filter & NDIS_PACKET_TYPE_ALL_MULTICAST ) + { + if( !( p_adapter->p_viport->flags & INIC_FLAG_ENABLE_MCAST_ALL ) ) { - 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, + 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 ( pkt_filter & NDIS_PACKET_TYPE_PROMISCUOUS ) + { + if( !( p_adapter->p_viport->flags & INIC_FLAG_ENABLE_PROMISC ) ) { - 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 ); - } + p_adapter->p_viport->newFlags |= INIC_FLAG_ENABLE_PROMISC; + InterlockedOr( &p_adapter->p_viport->updates, NEED_LINK_CONFIG ); } } + /* ENABLE NIC, BROADCAST and MULTICAST flags set on start */ ++p_adapter->pending_set;