📄 oid.c
字号:
//---------------------------------------------------------------------------
//
// Copyright (C) 1996-1997. Unpublished Work of Crystal Semiconductor Corp.
// All Rights Reserved.
//
// THIS WORK IS AN UNPUBLISHED WORK AND CONTAINS CONFIDENTIAL,
// PROPRIETARY AND TRADE SECRET INFORMATION OF CRYSTAL SEMICONDUCTOR.
// ACCESS TO THIS WORK IS RESTRICTED TO (I) CRYSTAL SEMICONDUCTOR EMPLOYEES
// WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF THEIR
// ASSIGNMENTS AND (II) ENTITIES OTHER THAN CRYSTAL SEMICONDUCTOR WHO
// HAVE ENTERED INTO APPROPRIATE LICENSE AGREEMENTS. NO PART OF THIS
// WORK MAY BE USED, PRACTICED, PERFORMED, COPIED, DISTRIBUTED, REVISED,
// MODIFIED, TRANSLATED, ABRIDGED, CONDENSED, EXPANDED, COLLECTED,
// COMPILED,LINKED,RECAST, TRANSFORMED, ADAPTED IN ANY FORM OR BY ANY
// MEANS,MANUAL, MECHANICAL, CHEMICAL, ELECTRICAL, ELECTRONIC, OPTICAL,
// BIOLOGICAL, OR OTHERWISE WITHOUT THE PRIOR WRITTEN PERMISSION AND
// CONSENT OF CRYSTAL SEMICONDUCTOR . ANY USE OR EXPLOITATION OF THIS WORK
// WITHOUT THE PRIOR WRITTEN CONSENT OF CRYSTAL SEMICONDUCTOR COULD
// SUBJECT THE PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY.
//
//---------------------------------------------------------------------------
#include "cs8900a.h"
#include "cshrd.h"
extern BYTE NDISVerMajor;
extern BYTE NDISVerMinor;
/*++
Routine Description:
CrystalQueryInformation handles a query operation for a
single OID.
Arguments:
MiniportAdapterContext - Context registered with the wrapper, really
a pointer to the VP context.
Oid - The OID of the query.
InformationBuffer - Holds the result of the query.
InformationBufferLength - The length of InformationBuffer.
BytesWritten - If the call is successful, returns the number
of bytes written to InformationBuffer.
BytesNeeded - If there is not enough room in InformationBuffer
to satisfy the OID, returns the amount of storage needed.
Return Value:
NDIS_STATUS_SUCCESS
NDIS_STATUS_PENDING
NDIS_STATUS_INVALID_LENGTH
NDIS_STATUS_INVALID_OID
--*/
extern NDIS_STATUS CrystalQueryInformation(IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded)
{
PVOID SourceBuffer;
ULONG SourceBufferLength;
ULONG GenericUlong;
USHORT GenericUshort;
UCHAR VendorId[4];
UCHAR IsaDescriptor[] = VENDOR_PRODUCT_NAME_STR;
NDIS_OID CrystalGlobalSupportedOids[] = {
OID_GEN_SUPPORTED_LIST,
OID_GEN_HARDWARE_STATUS,
OID_GEN_MEDIA_SUPPORTED,
OID_GEN_MEDIA_IN_USE,
OID_GEN_MAXIMUM_LOOKAHEAD,
OID_GEN_CURRENT_LOOKAHEAD,
OID_GEN_MAXIMUM_FRAME_SIZE,
OID_GEN_LINK_SPEED,
OID_GEN_TRANSMIT_BUFFER_SPACE,
OID_GEN_RECEIVE_BUFFER_SPACE,
OID_GEN_TRANSMIT_BLOCK_SIZE,
OID_GEN_RECEIVE_BLOCK_SIZE,
OID_GEN_VENDOR_ID,
OID_GEN_VENDOR_DESCRIPTION,
OID_GEN_VENDOR_DRIVER_VERSION,
OID_GEN_CURRENT_PACKET_FILTER,
OID_GEN_DRIVER_VERSION,
OID_GEN_MAXIMUM_TOTAL_SIZE,
OID_GEN_PROTOCOL_OPTIONS,
OID_GEN_MAC_OPTIONS,
OID_GEN_MEDIA_CONNECT_STATUS, // NEW
OID_GEN_MAXIMUM_SEND_PACKETS, // NEW
OID_GEN_XMIT_OK,
OID_GEN_RCV_OK,
OID_GEN_XMIT_ERROR,
OID_GEN_RCV_ERROR,
OID_GEN_RCV_NO_BUFFER,
//OID_GEN_DIRECTED_BYTES_XMIT,
//OID_GEN_DIRECTED_FRAMES_XMIT,
//OID_GEN_MULTICAST_BYTES_XMIT,
//OID_GEN_MULTICAST_FRAMES_XMIT,
//OID_GEN_BROADCAST_BYTES_XMIT,
//OID_GEN_BROADCAST_FRAMES_XMIT,
//OID_GEN_DIRECTED_BYTES_RCV,
//OID_GEN_DIRECTED_FRAMES_RCV,
//OID_GEN_MULTICAST_BYTES_RCV,
//OID_GEN_MULTICAST_FRAMES_RCV,
//OID_GEN_BROADCAST_BYTES_RCV,
//OID_GEN_BROADCAST_FRAMES_RCV,
OID_GEN_RCV_CRC_ERROR,
OID_GEN_TRANSMIT_QUEUE_LENGTH,
OID_802_3_PERMANENT_ADDRESS,
OID_802_3_CURRENT_ADDRESS,
OID_802_3_MULTICAST_LIST,
OID_802_3_MAXIMUM_LIST_SIZE,
OID_802_3_MAC_OPTIONS, // NEW
OID_802_3_RCV_ERROR_ALIGNMENT,
OID_802_3_XMIT_ONE_COLLISION,
OID_802_3_XMIT_MORE_COLLISIONS,
//OID_802_3_XMIT_DEFERRED,
OID_802_3_XMIT_MAX_COLLISIONS,
OID_802_3_RCV_OVERRUN,
OID_802_3_XMIT_UNDERRUN,
//OID_802_3_XMIT_HEARTBEAT_FAILURE,
OID_802_3_XMIT_TIMES_CRS_LOST,
//OID_802_3_XMIT_LATE_COLLISIONS,
// OID_GEN_RESET_COUNTS, //QQQQQQQQQQQQ new for CE 4.0
// OID_GEN_MEDIA_SENSE_COUNTS, //QQQQQQQQQQQQ new for CE 4.0
};
VPM_SetupMiniContext;
//
// Initialize these once, since this is the majority
// of cases.
//
SourceBuffer = &GenericUlong;
SourceBufferLength = sizeof(ULONG);
PRINTDEBUGMSG(1, (TEXT("==>CS8900:CrystalQueryInformation OID=0x%x\r\n"), Oid));
//RETAILMSG(1, (TEXT("==>CS8900:CrystalQueryInformation OID=0x%x\r\n"), Oid));
switch (Oid) {
case OID_GEN_SUPPORTED_LIST:
SourceBuffer = CrystalGlobalSupportedOids;
SourceBufferLength = sizeof(CrystalGlobalSupportedOids);
break;
case OID_GEN_HARDWARE_STATUS:
GenericUlong = pvMini_Context->CurrentState;
break;
case OID_GEN_MEDIA_SUPPORTED:
case OID_GEN_MEDIA_IN_USE:
GenericUlong = NdisMedium802_3;
break;
case OID_GEN_MAXIMUM_LOOKAHEAD:
GenericUlong = VP_MAX_FRAMESIZE - VP_HEADERSIZE;
break;
case OID_GEN_CURRENT_LOOKAHEAD:
GenericUlong = pvMini_Context->ProtocolLookahead;
break;
case OID_GEN_MAXIMUM_FRAME_SIZE:
GenericUlong = VP_MAX_FRAMESIZE - VP_HEADERSIZE; // leave off Header
break;
case OID_GEN_LINK_SPEED:
GenericUlong = 10000 * pChip->Config.MediaSpeed; // 10 Mbps in 100 bps units
//RETAILMSG(1, (TEXT("Link speed = %d\r\n"), GenericUlong));
break;
case OID_GEN_TRANSMIT_BUFFER_SPACE:
GenericUlong = pChip->Config.MaxTxCount * VP_MAX_FRAMESIZE;
break;
case OID_GEN_RECEIVE_BUFFER_SPACE:
GenericUlong = VP_MAX_FRAMESIZE;
break;
case OID_GEN_TRANSMIT_BLOCK_SIZE:
GenericUlong = VP_MAX_FRAMESIZE;
break;
case OID_GEN_RECEIVE_BLOCK_SIZE:
GenericUlong = VP_MAX_FRAMESIZE;
break;
case OID_GEN_VENDOR_ID: // Should be moved to chip config
NdisMoveMemory(VendorId, pvMini_Context->PermanentNetworkAddress, 3L);
VendorId[3] = 0x0;
SourceBuffer = VendorId;
SourceBufferLength = sizeof(VendorId);
break;
case OID_GEN_VENDOR_DESCRIPTION:
SourceBuffer = (PVOID)IsaDescriptor; // Should be moved to chip config
SourceBufferLength = sizeof(IsaDescriptor); // Should be moved to chip config
break;
case OID_GEN_VENDOR_DRIVER_VERSION:
GenericUlong = (CRYSTAL_MAJOR_VERSION << 16) + CRYSTAL_MINOR_VERSION;
break;
case OID_GEN_CURRENT_PACKET_FILTER:
GenericUlong = pvMini_Context->PacketFilter;
break;
case OID_GEN_DRIVER_VERSION:
GenericUshort = (NDISVerMajor << 8) + NDISVerMinor;
SourceBuffer = &GenericUshort;
SourceBufferLength = sizeof(USHORT);
break;
case OID_GEN_MAXIMUM_TOTAL_SIZE:
GenericUlong = VP_MAX_FRAMESIZE;
break;
// case OID_GEN_PROTOCOL_OPTIONS: // Set Only
case OID_GEN_MAC_OPTIONS:
GenericUlong = (ULONG)(
// NDIS_MAC_OPTION_FULL_DUPLEX |
NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |
NDIS_MAC_OPTION_RECEIVE_SERIALIZED |
NDIS_MAC_OPTION_NO_LOOPBACK
);
break;
case OID_GEN_MEDIA_CONNECT_STATUS: // NEW
GenericUlong = pvMini_Context->CableConnected;
//RETAILMSG(1, (TEXT("Cable status = %d\r\n"), GenericUlong));
break;
case OID_GEN_MAXIMUM_SEND_PACKETS: // NEW
GenericUlong = pChip->Config.MaxTxCount;
break;
case OID_GEN_XMIT_OK:
GenericUlong = pvMini_Context->XmitOKs;
break;
case OID_GEN_RCV_OK:
GenericUlong = pvMini_Context->RcvOKs;
break;
case OID_GEN_XMIT_ERROR:
GenericUlong = pvMini_Context->XmitErrors;
break;
case OID_GEN_RCV_ERROR:
GenericUlong = pvMini_Context->RcvErrors;
break;
case OID_GEN_RCV_NO_BUFFER:
GenericUlong = pvMini_Context->RcvNoBuffers;
break;
// case OID_GEN_DIRECTED_BYTES_XMIT:
// case OID_GEN_DIRECTED_FRAMES_XMIT:
// case OID_GEN_MULTICAST_BYTES_XMIT:
// case OID_GEN_MULTICAST_FRAMES_XMIT:
// case OID_GEN_BROADCAST_BYTES_XMIT:
// case OID_GEN_BROADCAST_FRAMES_XMIT:
// case OID_GEN_DIRECTED_BYTES_RCV:
// case OID_GEN_DIRECTED_FRAMES_RCV:
// case OID_GEN_MULTICAST_BYTES_RCV:
// case OID_GEN_MULTICAST_FRAMES_RCV:
// case OID_GEN_BROADCAST_BYTES_RCV:
// case OID_GEN_BROADCAST_FRAMES_RCV:
// *BytesWritten = 0; // TBD!!!!
// return NDIS_STATUS_RESOURCES;
// break;
case OID_GEN_RCV_CRC_ERROR:
GenericUlong = pvMini_Context->RcvCRCErrors;
break;
case OID_GEN_TRANSMIT_QUEUE_LENGTH:
// GenericUlong = pvMini_Context->XmitQueueDepth;
GenericUlong = 0L;
break;
case OID_802_3_PERMANENT_ADDRESS:
SourceBuffer = pvMini_Context->PermanentNetworkAddress;
SourceBufferLength = ETH_LENGTH_OF_ADDRESS;
break;
case OID_802_3_CURRENT_ADDRESS:
SourceBuffer = (PVOID)&pChip->Config.EthernetAddr;
SourceBufferLength = ETH_LENGTH_OF_ADDRESS;
break;
case OID_802_3_MULTICAST_LIST:
SourceBuffer = pvMini_Context->McastList;
SourceBufferLength = pvMini_Context->McastListSize * ETH_LENGTH_OF_ADDRESS;
break;
case OID_802_3_MAXIMUM_LIST_SIZE:
GenericUlong = CRYSTAL_MCAST_LIST_SIZE;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -