📄 mp_req.c
字号:
ulInfo = NIC_MAX_MCAST_LIST;
break;
case OID_GEN_MAXIMUM_SEND_PACKETS:
ulInfo = NIC_MAX_SEND_PACKETS;
break;
case OID_PNP_CAPABILITIES:
MPFillPoMgmtCaps (Adapter,
&Power_Management_Capabilities,
&Status,
&ulInfoLen);
if (Status == NDIS_STATUS_SUCCESS)
{
pInfo = (PVOID) &Power_Management_Capabilities;
}
else
{
pInfo = NULL;
}
break;
case OID_PNP_QUERY_POWER:
// Status is pre-set in this routine to Success
Status = NDIS_STATUS_SUCCESS;
break;
// WMI support
case OID_CUSTOM_DRIVER_QUERY:
// this is the uint case
DBGPRINT(MP_INFO,("CUSTOM_DRIVER_QUERY got a QUERY\n"));
ulInfo = ++Adapter->CustomDriverSet;
break;
case OID_CUSTOM_DRIVER_SET:
DBGPRINT(MP_INFO,("CUSTOM_DRIVER_SET got a QUERY\n"));
ulInfo = Adapter->CustomDriverSet;
break;
// this is the array case
case OID_CUSTOM_ARRAY:
DBGPRINT(MP_INFO,("CUSTOM_ARRAY got a QUERY\n"));
NdisMoveMemory(&ulInfo, Adapter->PermanentAddress, 4);
break;
// this is the string case
case OID_CUSTOM_STRING:
DBGPRINT(MP_INFO, ("CUSTOM_STRING got a QUERY\n"));
pInfo = (PVOID) VendorDesc;
ulBytesAvailable = ulInfoLen = sizeof(VendorDesc);
break;
case OID_GEN_XMIT_OK:
case OID_GEN_RCV_OK:
case OID_GEN_XMIT_ERROR:
case OID_GEN_RCV_ERROR:
case OID_GEN_RCV_NO_BUFFER:
case OID_GEN_RCV_CRC_ERROR:
case OID_GEN_TRANSMIT_QUEUE_LENGTH:
case OID_802_3_RCV_ERROR_ALIGNMENT:
case OID_802_3_XMIT_ONE_COLLISION:
case OID_802_3_XMIT_MORE_COLLISIONS:
case OID_802_3_XMIT_DEFERRED:
case OID_802_3_XMIT_MAX_COLLISIONS:
case OID_802_3_RCV_OVERRUN:
case OID_802_3_XMIT_UNDERRUN:
case OID_802_3_XMIT_HEARTBEAT_FAILURE:
case OID_802_3_XMIT_TIMES_CRS_LOST:
case OID_802_3_XMIT_LATE_COLLISIONS:
Status = NICGetStatsCounters(Adapter, Oid, &ul64Info);
ulBytesAvailable = ulInfoLen = sizeof(ul64Info);
if (Status == NDIS_STATUS_SUCCESS)
{
if (InformationBufferLength < sizeof(ULONG))
{
Status = NDIS_STATUS_BUFFER_TOO_SHORT;
*BytesNeeded = ulBytesAvailable;
break;
}
ulInfoLen = MIN(InformationBufferLength, ulBytesAvailable);
pInfo = &ul64Info;
}
break;
default:
Status = NDIS_STATUS_NOT_SUPPORTED;
break;
}
if (Status == NDIS_STATUS_SUCCESS)
{
*BytesNeeded = ulBytesAvailable;
if (ulInfoLen <= InformationBufferLength)
{
//
// Copy result into InformationBuffer
//
*BytesWritten = ulInfoLen;
if (ulInfoLen)
{
NdisMoveMemory(InformationBuffer, pInfo, ulInfoLen);
}
}
else
{
//
// too short
//
*BytesNeeded = ulInfoLen;
Status = NDIS_STATUS_BUFFER_TOO_SHORT;
}
}
DBGPRINT(MP_TRACE, ("<==== MPQueryInformation, OID=0x%08x, Status=%x\n", Oid, Status));
return(Status);
}
NDIS_STATUS NICGetStatsCounters(
IN PMP_ADAPTER Adapter,
IN NDIS_OID Oid,
OUT PULONG64 pCounter
)
/*++
Routine Description:
Get the value for a statistics OID
Arguments:
Adapter Pointer to our adapter
Oid Self-explanatory
pCounter Pointer to receive the value
Return Value:
NDIS_STATUS_SUCCESS
NDIS_STATUS_NOT_SUPPORTED
--*/
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
DBGPRINT(MP_TRACE, ("--> NICGetStatsCounters\n"));
*pCounter = 0;
DumpStatsCounters(Adapter);
switch(Oid)
{
case OID_GEN_XMIT_OK:
*pCounter = Adapter->GoodTransmits;
break;
case OID_GEN_RCV_OK:
*pCounter = Adapter->GoodReceives;
break;
case OID_GEN_XMIT_ERROR:
*pCounter = Adapter->TxAbortExcessCollisions +
Adapter->TxDmaUnderrun +
Adapter->TxLostCRS +
Adapter->TxLateCollisions;
break;
case OID_GEN_RCV_ERROR:
*pCounter = Adapter->RcvCrcErrors +
Adapter->RcvAlignmentErrors +
Adapter->RcvResourceErrors +
Adapter->RcvDmaOverrunErrors +
Adapter->RcvRuntErrors;
break;
case OID_GEN_RCV_NO_BUFFER:
*pCounter = Adapter->RcvResourceErrors;
break;
case OID_GEN_RCV_CRC_ERROR:
*pCounter = Adapter->RcvCrcErrors;
break;
case OID_GEN_TRANSMIT_QUEUE_LENGTH:
*pCounter = Adapter->nWaitSend;
break;
case OID_802_3_RCV_ERROR_ALIGNMENT:
*pCounter = Adapter->RcvAlignmentErrors;
break;
case OID_802_3_XMIT_ONE_COLLISION:
*pCounter = Adapter->OneRetry;
break;
case OID_802_3_XMIT_MORE_COLLISIONS:
*pCounter = Adapter->MoreThanOneRetry;
break;
case OID_802_3_XMIT_DEFERRED:
*pCounter = Adapter->TxOKButDeferred;
break;
case OID_802_3_XMIT_MAX_COLLISIONS:
*pCounter = Adapter->TxAbortExcessCollisions;
break;
case OID_802_3_RCV_OVERRUN:
*pCounter = Adapter->RcvDmaOverrunErrors;
break;
case OID_802_3_XMIT_UNDERRUN:
*pCounter = Adapter->TxDmaUnderrun;
break;
case OID_802_3_XMIT_HEARTBEAT_FAILURE:
*pCounter = Adapter->TxLostCRS;
break;
case OID_802_3_XMIT_TIMES_CRS_LOST:
*pCounter = Adapter->TxLostCRS;
break;
case OID_802_3_XMIT_LATE_COLLISIONS:
*pCounter = Adapter->TxLateCollisions;
break;
default:
Status = NDIS_STATUS_NOT_SUPPORTED;
break;
}
DBGPRINT(MP_TRACE, ("<-- NICGetStatsCounters\n"));
return(Status);
}
NDIS_STATUS NICSetPacketFilter(
IN PMP_ADAPTER Adapter,
IN ULONG PacketFilter
)
/*++
Routine Description:
This routine will set up the adapter so that it accepts packets
that match the specified packet filter. The only filter bits
that can truly be toggled are for broadcast and promiscuous
Arguments:
Adapter Pointer to our adapter
PacketFilter The new packet filter
Return Value:
NDIS_STATUS_SUCCESS
NDIS_STATUS_NOT_SUPPORTED
--*/
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
UCHAR NewParameterField;
UINT i;
BOOLEAN bResult;
DBGPRINT(MP_TRACE, ("--> NICSetPacketFilter, PacketFilter=%08x\n", PacketFilter));
//
// Need to enable or disable broadcast and promiscuous support depending
// on the new filter
//
NewParameterField = CB_557_CFIG_DEFAULT_PARM15;
if (PacketFilter & NDIS_PACKET_TYPE_BROADCAST)
{
NewParameterField &= ~CB_CFIG_BROADCAST_DIS;
}
else
{
NewParameterField |= CB_CFIG_BROADCAST_DIS;
}
if (PacketFilter & NDIS_PACKET_TYPE_PROMISCUOUS)
{
NewParameterField |= CB_CFIG_PROMISCUOUS;
}
else
{
NewParameterField &= ~CB_CFIG_PROMISCUOUS;
}
do
{
if ((Adapter->OldParameterField == NewParameterField ) &&
!(PacketFilter & NDIS_PACKET_TYPE_ALL_MULTICAST))
{
break;
}
//
// Only need to do something to the HW if the filter bits have changed.
//
Adapter->OldParameterField = NewParameterField;
((PCB_HEADER_STRUC)Adapter->NonTxCmdBlock)->CbCommand = CB_CONFIGURE;
((PCB_HEADER_STRUC)Adapter->NonTxCmdBlock)->CbStatus = 0;
((PCB_HEADER_STRUC)Adapter->NonTxCmdBlock)->CbLinkPointer = DRIVER_NULL;
//
// First fill in the static (end user can't change) config bytes
//
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[0] = CB_557_CFIG_DEFAULT_PARM0;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[2] = CB_557_CFIG_DEFAULT_PARM2;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[3] = CB_557_CFIG_DEFAULT_PARM3;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[6] = CB_557_CFIG_DEFAULT_PARM6;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[9] = CB_557_CFIG_DEFAULT_PARM9;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[10] = CB_557_CFIG_DEFAULT_PARM10;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[11] = CB_557_CFIG_DEFAULT_PARM11;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[12] = CB_557_CFIG_DEFAULT_PARM12;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[13] = CB_557_CFIG_DEFAULT_PARM13;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[14] = CB_557_CFIG_DEFAULT_PARM14;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[16] = CB_557_CFIG_DEFAULT_PARM16;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[17] = CB_557_CFIG_DEFAULT_PARM17;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[18] = CB_557_CFIG_DEFAULT_PARM18;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[20] = CB_557_CFIG_DEFAULT_PARM20;
//
// Set the Tx underrun retries
//
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[7] =
(UCHAR) (CB_557_CFIG_DEFAULT_PARM7 | (Adapter->AiUnderrunRetry << 1));
//
// Set the Tx and Rx Fifo limits
//
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[1] =
(UCHAR) ((Adapter->AiTxFifo << 4) | Adapter->AiRxFifo);
//
// set the MWI enable bit if needed
//
if (Adapter->MWIEnable)
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[3] |= CB_CFIG_B3_MWI_ENABLE;
//
// Set the Tx and Rx DMA maximum byte count fields.
//
if ((Adapter->AiRxDmaCount) || (Adapter->AiTxDmaCount))
{
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[4] =
Adapter->AiRxDmaCount;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[5] =
(UCHAR) (Adapter->AiTxDmaCount | CB_CFIG_DMBC_EN);
}
else
{
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[4] =
CB_557_CFIG_DEFAULT_PARM4;
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[5] =
CB_557_CFIG_DEFAULT_PARM5;
}
//
// Setup for MII or 503 operation. The CRS+CDT bit should only be
// set when operating in 503 mode.
//
if (Adapter->PhyAddress == 32)
{
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[8] =
(CB_557_CFIG_DEFAULT_PARM8 & (~CB_CFIG_503_MII));
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[15] =
(UCHAR) (NewParameterField | CB_CFIG_CRS_OR_CDT);
}
else
{
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[8] =
(CB_557_CFIG_DEFAULT_PARM8 | CB_CFIG_503_MII);
Adapter->NonTxCmdBlock->NonTxCb.Config.ConfigBytes[15] =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -