Example #1
0
// Check the cable connection state
void NeoCheckConnectState()
{
	NDIS_STATUS_INDICATION t;
	NDIS_LINK_STATE state;
	if (ctx == NULL || ctx->NdisMiniport == NULL)
	{
		return;
	}

	NeoZero(&t, sizeof(t));
	t.Header.Type = NDIS_OBJECT_TYPE_STATUS_INDICATION;
	t.Header.Revision = NDIS_STATUS_INDICATION_REVISION_1;
	t.Header.Size = NDIS_SIZEOF_STATUS_INDICATION_REVISION_1;

	t.SourceHandle = ctx->NdisMiniport;

	NeoZero(&state, sizeof(state));
	state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
	state.Header.Revision = NDIS_LINK_STATE_REVISION_1;
	state.Header.Size = NDIS_SIZEOF_LINK_STATE_REVISION_1;

	state.MediaDuplexState = NdisPauseFunctionsSendAndReceive;
	state.XmitLinkSpeed = state.RcvLinkSpeed = max_speed;
	state.PauseFunctions = NdisPauseFunctionsUnsupported;

	t.StatusCode = NDIS_STATUS_LINK_STATE;
	t.StatusBuffer = &state;
	t.StatusBufferSize = sizeof(NDIS_LINK_STATE);

	if (keep_link == false)
	{
		if (ctx->ConnectedOld != ctx->Connected || ctx->ConnectedForce)
		{
			ctx->ConnectedForce = FALSE;
			ctx->ConnectedOld = ctx->Connected;
			if (ctx->Halting == FALSE)
			{
				state.MediaConnectState = ctx->Connected ? MediaConnectStateConnected : MediaConnectStateDisconnected;
				NdisMIndicateStatusEx(ctx->NdisMiniport, &t);
			}
		}
	}
	else
	{
		if (ctx->ConnectedForce)
		{
			ctx->ConnectedForce = false;

			if (ctx->Halting == FALSE)
			{
				state.MediaConnectState = MediaConnectStateConnected;
				NdisMIndicateStatusEx(ctx->NdisMiniport, &t);
			}
		}
	}
}
static VOID PostLinkState(PARANDIS_ADAPTER *pContext, NDIS_MEDIA_CONNECT_STATE connectState)
{
    NDIS_STATUS_INDICATION  indication;
    NDIS_LINK_STATE         state;
    NdisZeroMemory(&state, sizeof(state));
    state.Header.Revision = NDIS_LINK_STATE_REVISION_1;
    state.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
    state.Header.Size = NDIS_SIZEOF_LINK_STATE_REVISION_1;
    state.MediaConnectState = connectState;
    state.MediaDuplexState = MediaDuplexStateFull;
    state.RcvLinkSpeed = state.XmitLinkSpeed =
        connectState == MediaConnectStateConnected ?
            PARANDIS_MAXIMUM_RECEIVE_SPEED :
            NDIS_LINK_SPEED_UNKNOWN;
    state.PauseFunctions = NdisPauseFunctionsUnsupported;

    NdisZeroMemory(&indication, sizeof(indication));

    indication.Header.Type = NDIS_OBJECT_TYPE_STATUS_INDICATION;
    indication.Header.Revision = NDIS_STATUS_INDICATION_REVISION_1;
    indication.Header.Size = NDIS_SIZEOF_STATUS_INDICATION_REVISION_1;
    indication.SourceHandle = pContext->MiniportHandle;
    indication.StatusCode = NDIS_STATUS_LINK_STATE;
    indication.StatusBuffer = &state;
    indication.StatusBufferSize = sizeof(state);
    DPrintf(0, ("Indicating %s\n", ConnectStateName(connectState)));
    ParaNdis_DebugHistory(pContext, hopConnectIndication, NULL, connectState, 0, 0);
    NdisMIndicateStatusEx(pContext->MiniportHandle , &indication);
}
Example #3
0
//===================================================
// Tell Windows whether the TAP device should be
// considered "connected" or "disconnected".
//
// Allows application control of media connect state.
//===================================================
VOID tapSetMediaConnectStatus(__in PTAP_ADAPTER_CONTEXT Adapter, __in BOOLEAN LogicalMediaState) {
  NDIS_STATUS_INDICATION statusIndication;
  NDIS_LINK_STATE linkState;

  NdisZeroMemory(&statusIndication, sizeof(NDIS_STATUS_INDICATION));
  NdisZeroMemory(&linkState, sizeof(NDIS_LINK_STATE));

  //
  // Fill in object headers
  //
  statusIndication.Header.Type = NDIS_OBJECT_TYPE_STATUS_INDICATION;
  statusIndication.Header.Revision = NDIS_STATUS_INDICATION_REVISION_1;
  statusIndication.Header.Size = sizeof(NDIS_STATUS_INDICATION);

  linkState.Header.Revision = NDIS_LINK_STATE_REVISION_1;
  linkState.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
  linkState.Header.Size = sizeof(NDIS_LINK_STATE);

  //
  // Link state buffer
  //
  if (Adapter->LogicalMediaState == TRUE) {
    linkState.MediaConnectState = MediaConnectStateConnected;
  }

  linkState.MediaDuplexState = MediaDuplexStateFull;
  linkState.RcvLinkSpeed = TAP_RECV_SPEED;
  linkState.XmitLinkSpeed = TAP_XMIT_SPEED;

  //
  // Fill in the status buffer
  //
  statusIndication.StatusCode = NDIS_STATUS_LINK_STATE;
  statusIndication.SourceHandle = Adapter->MiniportAdapterHandle;
  statusIndication.DestinationHandle = NULL;
  statusIndication.RequestId = 0;

  statusIndication.StatusBuffer = &linkState;
  statusIndication.StatusBufferSize = sizeof(NDIS_LINK_STATE);

  // Fill in new media connect state.
  if ((Adapter->LogicalMediaState != LogicalMediaState) && !Adapter->MediaStateAlwaysConnected) {
    Adapter->LogicalMediaState = LogicalMediaState;

    if (LogicalMediaState == TRUE) {
      linkState.MediaConnectState = MediaConnectStateConnected;

      DEBUGP(("[TAP] Set MediaConnectState: Connected.\n"));
    } else {
      linkState.MediaConnectState = MediaConnectStateDisconnected;

      DEBUGP(("[TAP] Set MediaConnectState: Disconnected.\n"));
    }
  }

  // Make the status indication.
  if (Adapter->Locked.AdapterState != MiniportHaltedState) {
    NdisMIndicateStatusEx(Adapter->MiniportAdapterHandle, &statusIndication);
  }
}
Example #4
0
void
shared_indicate_status(NDIS_HANDLE adapterhandle, NDIS_STATUS StatusCode,
	void *StatusBuffer,	ULONG StatusBufferSize)
{
#ifndef NDIS60
/*	NdisMIndicateStatus(wl->sh.adapterhandle, 
		NDIS_STATUS_MEDIA_SPECIFIC_INDICATION,
	  StatusBuffer, StatusBufferSize);
	NdisMIndicateStatusComplete(wl->sh.adapterhandle);
 */
	NdisMIndicateStatus(adapterhandle,
		NDIS_STATUS_MEDIA_SPECIFIC_INDICATION,
	  StatusBuffer, StatusBufferSize);
	NdisMIndicateStatusComplete(adapterhandle);
#else
	NDIS_STATUS_INDICATION ind;

	bzero(&ind, sizeof(NDIS_STATUS_INDICATION));

	ind.Header.Type = NDIS_OBJECT_TYPE_STATUS_INDICATION;
	ind.Header.Revision = NDIS_STATUS_INDICATION_REVISION_1;
	ind.Header.Size = sizeof(NDIS_STATUS_INDICATION);

	ind.SourceHandle = adapterhandle;
	ind.DestinationHandle = NULL;
	/* [N.B.: Jiandong says the RequestID field is not needed...] */

	ind.StatusCode = StatusCode;
	ind.StatusBuffer = StatusBuffer;
	ind.StatusBufferSize = StatusBufferSize;

	NdisMIndicateStatusEx(adapterhandle, &ind);
#endif /* NDIS60 */
}
VOID
VenetSetLinkState(PADAPTER a, BOOLEAN state)
{

    NDIS_LINK_STATE                link;
    NDIS_STATUS_INDICATION         status;

    NdisZeroMemory(&link, sizeof(NDIS_LINK_STATE));
    NdisZeroMemory(&status, sizeof(NDIS_STATUS_INDICATION));

    link.Header.Revision = NDIS_LINK_STATE_REVISION_1;
    link.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
    link.Header.Size = sizeof(NDIS_LINK_STATE);

    status.Header.Type = NDIS_OBJECT_TYPE_STATUS_INDICATION;
    status.Header.Revision = NDIS_STATUS_INDICATION_REVISION_1;
    status.Header.Size = sizeof(NDIS_STATUS_INDICATION);
    status.SourceHandle = a->adapterHandle;
    status.StatusCode = NDIS_STATUS_LINK_STATE;
    status.StatusBuffer = &link;
    status.StatusBufferSize = sizeof(link);

    if (state) {
        link.MediaConnectState = MediaConnectStateConnected;
        link.MediaDuplexState = MediaDuplexStateFull;
        link.XmitLinkSpeed = 1000000000;
    }
    else {
        link.MediaConnectState = MediaConnectStateDisconnected;
        link.MediaDuplexState = MediaDuplexStateUnknown;
        link.XmitLinkSpeed = NDIS_LINK_SPEED_UNKNOWN;
    }


    NdisMIndicateStatusEx(a->adapterHandle, &status);
}
Example #6
0
NDIS_STATUS
xmpSetInformation(
  IN xmpNicCtx_t             *pNicCtx,
  IN PNDIS_OID_REQUEST       NdisRequest
  )
{
  NDIS_STATUS                 Status = NDIS_STATUS_SUCCESS;
  NDIS_OID                    Oid;
  PVOID                       InformationBuffer;
  ULONG                       InformationBufferLength;
  ULONG                       BytesRead;
  ULONG                       BytesNeeded;
  ULONG                       PacketFilter;
  ULONG                       MCastCnt;
  ULONG                       HashType;
  ULONG                       validBits;
  USHORT                      i;
  xge_hal_device_t           *pHalDev;
  NDIS_RECEIVE_SCALE_PARAMETERS *pRssParam;
  xmpSetRssContext			      SetRssCtx = {0};
  static ULONG setRssCount = 10;

  pHalDev = XMP_NIC_GET_DEV(pNicCtx);
  Oid = NdisRequest->DATA.SET_INFORMATION.Oid;
  InformationBuffer = NdisRequest->DATA.SET_INFORMATION.InformationBuffer;
  InformationBufferLength = 
    NdisRequest->DATA.SET_INFORMATION.InformationBufferLength;

  XMPTRACE(XMP_DBG_REQ, ("==> xmpSetInformation %x\n", Oid));
  BytesRead = 0;
  BytesNeeded = 0;

  switch(Oid)
  {
  case OID_802_3_MULTICAST_LIST:
    XMPTRACE(XMP_DBG_REQ, ("xmpSetInformation Multicast list\n"));
    if ( InformationBufferLength % ETH_LENGTH_OF_ADDRESS != 0 )
      return(NDIS_STATUS_INVALID_LENGTH);

    MCastCnt = InformationBufferLength / ETH_LENGTH_OF_ADDRESS;
    xmpHalMcastFilterClr(pNicCtx);
    Status = xmpHalSetMcastList(pNicCtx,
                                (UCHAR *) InformationBuffer,
                                &MCastCnt);
    BytesRead = MCastCnt * ETH_LENGTH_OF_ADDRESS;
    break;

  case OID_GEN_CURRENT_PACKET_FILTER:
    XMPTRACE(XMP_DBG_REQ, ("xmpSetInformation: packet filter\n"));
    if ( InformationBufferLength != sizeof (ULONG) )
      return ( NDIS_STATUS_INVALID_LENGTH );

    BytesRead = InformationBufferLength;
    PacketFilter = *((PULONG) InformationBuffer);
    Status = xmpSetFilter(pNicCtx, PacketFilter);
    break;

  case OID_GEN_CURRENT_LOOKAHEAD:
    XMPTRACE(XMP_DBG_REQ, ("xmpSetInformation: current lookahead\n"));
    if( InformationBufferLength < sizeof(ULONG) )
    {
      BytesNeeded = sizeof(ULONG);
      Status = NDIS_STATUS_INVALID_LENGTH;
      break;
    }
    pNicCtx->LookAheadSz = *((PULONG) InformationBuffer);
    BytesRead = sizeof(ULONG);
    Status = NDIS_STATUS_SUCCESS;
    break;

  case OID_GEN_RECEIVE_SCALE_PARAMETERS:

    XMPTRACE(XMP_DBG_INFO, ("xmpSetInformation: OID_GEN_RECEIVE_SCALE_PARAMETERS\n"));
    if ( !(XMP_NIC_RSS_IN_CONFIG(pNicCtx)) )
    {
      Status = NDIS_STATUS_NOT_SUPPORTED;
      break;
    }

    if ( InformationBufferLength < sizeof(NDIS_RECEIVE_SCALE_PARAMETERS) )
    {
      BytesNeeded = sizeof(NDIS_RECEIVE_SCALE_PARAMETERS);
      Status = NDIS_STATUS_INVALID_LENGTH;
      break;
    }
    pRssParam = (PNDIS_RECEIVE_SCALE_PARAMETERS)InformationBuffer;

#ifdef NDISTEST_BUG
    if ( !XENAMP_NDIS_OBJECT_VALID(&pRssParam->Header,
                                   NDIS_RECEIVE_SCALE_PARAMETERS_REVISION_1,
                                   NDIS_OBJECT_TYPE_RSS_PARAMETERS,
                                   sizeof(NDIS_RECEIVE_SCALE_PARAMETERS)) )
    {
      XMPTRACE(XMP_DBG_WRN, ("xmpSetInformation:RSS_PARAMETERS invalid!!"       
                             " Revision=%d Type=%d Size=%d\n",
                             pRssParam->Header.Revision,
                             pRssParam->Header.Type,
                             pRssParam->Header.Size));
      BytesRead = sizeof(NDIS_OBJECT_HEADER);
      Status = NDIS_STATUS_INVALID_PARAMETER;
      break;
    }
#endif

    BytesRead = sizeof(NDIS_RECEIVE_SCALE_PARAMETERS);

    if ( (InformationBufferLength < (pRssParam->IndirectionTableSize
                                     + pRssParam->IndirectionTableOffset)) ||
         (InformationBufferLength < (pRssParam->HashSecretKeySize
                                     + pRssParam->HashSecretKeyOffset)) )
    {
      BytesNeeded = sizeof(NDIS_RECEIVE_SCALE_PARAMETERS);
      Status = NDIS_STATUS_INVALID_LENGTH;
      break;
    }

    HashType = NDIS_RSS_HASH_TYPE_FROM_HASH_INFO(pRssParam->HashInformation);   
    /*if ( HashType != 0 || NDIS_RSS_HASH_FUNC_FROM_HASH_INFO(pRssParam->HashInformation) != 0) */
    validBits = (NDIS_HASH_IPV4 | NDIS_HASH_TCP_IPV4
#ifndef XMP_RSS_IPV4_ONLY
                 | NDIS_HASH_IPV6 | NDIS_HASH_TCP_IPV6
                 | NDIS_HASH_IPV6_EX | NDIS_HASH_TCP_IPV6_EX
#endif
                 );
    if ( ((NDIS_RSS_HASH_FUNC_FROM_HASH_INFO(pRssParam->HashInformation) !=
           NdisHashFunctionToeplitz) ||  /* the only hash function supported */
          !bit(HashType, validBits) ||    /* at least one type should be set */
          (HashType & ~validBits)) &&         /* no other type should be set */
         (!(bit(pRssParam->Flags, NDIS_RSS_PARAM_FLAG_DISABLE_RSS)) &&
          NDIS_RSS_HASH_FUNC_FROM_HASH_INFO(pRssParam->HashInformation) != 0) )
    {
      Status = NDIS_STATUS_INVALID_PARAMETER;
      break;
    }

    if ( /*(pRssParam->IndirectionTableSize < (1 << pRssParam->NumberOfLsbs)) || */
         (pRssParam->HashSecretKeySize & 0x7) ||    /* must be 8-bytes align */
         (pRssParam->HashSecretKeySize > 40)  ||      /* max secret key size */
         (pRssParam->BaseCpuNumber & (pRssParam->BaseCpuNumber - 1)) )/*pow2 */
    {
      XMPTRACE(XMP_DBG_WRN, ("xmpReqSetRss:Invalid settings: Key Size=%d"
                             " IDT size=%d BaseCpu=%d\n",
                             pRssParam->HashSecretKeySize,
                             pRssParam->IndirectionTableSize,
                             pRssParam->BaseCpuNumber));
      Status = NDIS_STATUS_INVALID_PARAMETER;
      break;
    }


    if ((pRssParam->IndirectionTableSize + pRssParam->IndirectionTableOffset) >
        (pRssParam->HashSecretKeySize + pRssParam->HashSecretKeyOffset))
      BytesRead = (pRssParam->IndirectionTableSize + 
                    pRssParam->IndirectionTableOffset);
    else
      BytesRead = (pRssParam->HashSecretKeySize +
                    pRssParam->HashSecretKeyOffset);

    SetRssCtx.pNicCtx = pNicCtx;
    SetRssCtx.pParams = pRssParam;

#if 0
    if(NdisMSynchronizeWithInterruptEx(pNicCtx->hInterrupt, 0, xmpReqSetRss, &SetRssCtx))
#endif
    if ( NDIS_RSS_HASH_FUNC_FROM_HASH_INFO(pRssParam->HashInformation) == 0 )
      bis(pRssParam->Flags, NDIS_RSS_PARAM_FLAG_DISABLE_RSS);

    if ( bit(pRssParam->Flags, NDIS_RSS_PARAM_FLAG_DISABLE_RSS) )
    {
      pNicCtx->ndisRssSet.size = sizeof(NDIS_RECEIVE_SCALE_PARAMETERS);
      pNicCtx->ndisRssSet.params.BaseCpuNumber          = 0;
      pNicCtx->ndisRssSet.params.Flags                  = 0;
      pNicCtx->ndisRssSet.params.HashInformation        = 0;
      pNicCtx->ndisRssSet.params.IndirectionTableSize   = 0;
      pNicCtx->ndisRssSet.params.IndirectionTableOffset = 0;
      pNicCtx->ndisRssSet.params.HashSecretKeySize      = 0;
      pNicCtx->ndisRssSet.params.HashSecretKeyOffset    = 0;
    }
    else
    {
      NdisMoveMemory(&pNicCtx->ndisRssSet.params, pRssParam, BytesRead);
      pNicCtx->ndisRssSet.size = BytesRead;
    }

      xmpReqSetRss(pNicCtx);
#if 0
    if ( !(setRssCount % 10) )
    {
      xmpReqSetRss(pNicCtx);
    }
    setRssCount++;
#endif
    Status = NDIS_STATUS_SUCCESS;
    break;

  case OID_OFFLOAD_ENCAPSULATION:
    XMPTRACE(XMP_DBG_OFLD, ("xmpSetInformation: offload encapsulation\n"));
    if ( InformationBufferLength < sizeof(NDIS_OFFLOAD_ENCAPSULATION) )
    {
      BytesNeeded = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
      Status = NDIS_STATUS_INVALID_LENGTH;
      break;
    }

    NdisMoveMemory(&pNicCtx->OffloadEncapsulation,
                   InformationBuffer,
                   sizeof(NDIS_OFFLOAD_ENCAPSULATION));
    BytesRead = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
    Status    = NDIS_STATUS_SUCCESS;
    break;

  case OID_GEN_INTERRUPT_MODERATION:
    {
      NDIS_INTERRUPT_MODERATION_PARAMETERS *pIntrModr;
      if ( InformationBufferLength < sizeof(NDIS_INTERRUPT_MODERATION_PARAMETERS) )
      {
        BytesNeeded = sizeof(NDIS_INTERRUPT_MODERATION_PARAMETERS);
        Status = NDIS_STATUS_INVALID_LENGTH;
        break;
      }
      pIntrModr  = (NDIS_INTERRUPT_MODERATION_PARAMETERS *) InformationBuffer;
      if ( !XENAMP_NDIS_OBJECT_VALID(&pIntrModr->Header,
                                 NDIS_INTERRUPT_MODERATION_PARAMETERS_REVISION_1,
                                 NDIS_OBJECT_TYPE_DEFAULT,
                                 sizeof(NDIS_INTERRUPT_MODERATION_PARAMETERS)) )
      {
        BytesRead = sizeof(NDIS_OBJECT_HEADER);
        Status = NDIS_STATUS_INVALID_DATA;
        break;
      }
     break;
    }

  case OID_TCP_OFFLOAD_PARAMETERS:
    {
      NDIS_OFFLOAD_PARAMETERS *pAdmin;
      NDIS_STATUS_INDICATION  StatusIndication;
      ULONG size;

      pAdmin  = (NDIS_OFFLOAD_PARAMETERS *) InformationBuffer;
  
      if ( InformationBufferLength < NDIS_SIZEOF_OFFLOAD_PARAMETERS_REVISION_1 )
      {
        BytesNeeded = NDIS_SIZEOF_OFFLOAD_PARAMETERS_REVISION_1;
        Status = NDIS_STATUS_INVALID_LENGTH;
        break;
      }

      if ( !XENAMP_NDIS_OBJECT_VALID(&pAdmin->Header,
                                     NDIS_OFFLOAD_PARAMETERS_REVISION_1,
                                     NDIS_OBJECT_TYPE_DEFAULT,
                                     NDIS_SIZEOF_OFFLOAD_PARAMETERS_REVISION_1 ))
      {
        BytesRead = sizeof(NDIS_OBJECT_HEADER);
        Status = NDIS_STATUS_INVALID_DATA;
        break;
      }

      XMP_NIC_SET_ADMIN_OFFLOADS(pNicCtx, pAdmin);
      xmpNicSetCkoFlags(pNicCtx);
      xmpNicInitOffloadCapabilities(pNicCtx, &pNicCtx->OffloadCapabilities);    
       /* TODO: Generate event */
      BytesRead = NDIS_SIZEOF_OFFLOAD_PARAMETERS_REVISION_1;
      Status    = NDIS_STATUS_SUCCESS;

      XENAMP_NDIS_OBJECT_INIT(&StatusIndication.Header,
         NDIS_OBJECT_TYPE_STATUS_INDICATION,
         NDIS_STATUS_INDICATION_REVISION_1,
         sizeof(NDIS_STATUS_INDICATION));

      StatusIndication.SourceHandle = pNicCtx->hMPAdapter;
      StatusIndication.PortNumber = 0;
      StatusIndication.StatusCode = NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG;
      StatusIndication.Flags = 0;
      StatusIndication.DestinationHandle = NULL;
      StatusIndication.RequestId = NdisRequest->RequestId;
      StatusIndication.StatusBuffer = &pNicCtx->OffloadCapabilities;
      StatusIndication.StatusBufferSize = sizeof(NDIS_OFFLOAD);
      NdisMIndicateStatusEx(pNicCtx->hMPAdapter, &StatusIndication);
    }
    break;
    
  case OID_GEN_HD_SPLIT_PARAMETERS:
     {
       NDIS_HD_SPLIT_PARAMETERS *pHdSplit;
    
       pHdSplit  = (NDIS_HD_SPLIT_PARAMETERS *) InformationBuffer;
       if ( InformationBufferLength < NDIS_SIZEOF_HD_SPLIT_PARAMETERS_REVISION_1 )
       {
         BytesNeeded = NDIS_SIZEOF_HD_SPLIT_PARAMETERS_REVISION_1;
         Status = NDIS_STATUS_INVALID_LENGTH;
         break;
       }

       if ( !XENAMP_NDIS_OBJECT_VALID(&pHdSplit->Header,
                                    NDIS_HD_SPLIT_PARAMETERS_REVISION_1,
                                    NDIS_OBJECT_TYPE_DEFAULT,                                     
                                    NDIS_SIZEOF_HD_SPLIT_PARAMETERS_REVISION_1 ))
       {
         BytesRead = sizeof(NDIS_OBJECT_HEADER);
         Status = NDIS_STATUS_INVALID_DATA;
         break;
       }
      
       if( bit(pHdSplit->HDSplitCombineFlags, NDIS_HD_SPLIT_COMBINE_ALL_HEADERS) ) 
         bis( pNicCtx->Flags, XMP_NIC_FLAGS_RX_SPLIT_COMBINE ); 
       else
         bic( pNicCtx->Flags, XMP_NIC_FLAGS_RX_SPLIT_COMBINE ); 
    }
    break;

  default:
    XMPTRACE(XMP_DBG_INFO, ("xmpSetInformation: unsupported OID=%lx\n", Oid));
    Status = xmpDiagSetInformation(
                                   pNicCtx, 
                                   Oid, 
                                   InformationBuffer, 
                                   InformationBufferLength,
                                   &BytesRead,
                                   &BytesNeeded);
    break;
  }

  NdisRequest->DATA.SET_INFORMATION.BytesRead = BytesRead;
  NdisRequest->DATA.SET_INFORMATION.BytesNeeded = BytesNeeded;

  XMPTRACE(XMP_DBG_REQ, ("<== xmpSetInformation: Status=%x\n", Status));
  return Status;
}