📄 ndis4cs8950.c
字号:
break;
case OID_GEN_RECEIVE_BUFFER_SPACE:
GenericUlong = pChip->Config.MaxRxCount * 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, 3);
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_CURRENT_LOOKAHEAD:
GenericUlong = pvMini_Context->ProtocolLookahead;
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 | //QQQQQ ????? why comment out?
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;
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;
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;
case OID_802_3_MAC_OPTIONS: // NEW
GenericUlong = 0;
break;
case OID_802_3_RCV_ERROR_ALIGNMENT:
GenericUlong = pvMini_Context->RcvErrorAlignments;
break;
case OID_802_3_XMIT_ONE_COLLISION:
GenericUlong = pvMini_Context->XmitOneCollisions;
break;
case OID_802_3_XMIT_MORE_COLLISIONS:
GenericUlong = pvMini_Context->XmitMoreCollisions;
break;
case OID_802_3_XMIT_MAX_COLLISIONS:
GenericUlong = pvMini_Context->XmitMaxCollisions;
break;
case OID_802_3_XMIT_LATE_COLLISIONS:
GenericUlong = pvMini_Context->XmitLateCollisions;
break;
case OID_802_3_XMIT_UNDERRUN:
GenericUlong = pvMini_Context->XmitUnderrun;
break;
case OID_802_3_XMIT_TIMES_CRS_LOST:
GenericUlong = pvMini_Context->XmitLostCRS;
break;
case OID_802_3_RCV_OVERRUN:
GenericUlong = pvMini_Context->RcvOverrun;
break;
// case OID_802_3_XMIT_DEFERRED:
// case OID_802_3_XMIT_HEARTBEAT_FAILURE:
// *BytesWritten = 0;
// return NDIS_STATUS_RESOURCES;
// break;
default:
*BytesWritten = 0;
return NDIS_STATUS_INVALID_OID;
} /* endswitch */
if (SourceBufferLength > InformationBufferLength) {
NdisMoveMemory(InformationBuffer, SourceBuffer, InformationBufferLength);
*BytesWritten = InformationBufferLength;
*BytesNeeded = SourceBufferLength;
return NDIS_STATUS_INVALID_LENGTH;
}
NdisMoveMemory(InformationBuffer, SourceBuffer, SourceBufferLength);
*BytesWritten = SourceBufferLength;
return NDIS_STATUS_SUCCESS;
}
//****************************************************************************
// CrystalSetInformation
//****************************************************************************
// Routine Description:
//
// CrystalSetInformation handles a set operation for a
// single OID.
//
// Arguments:
//
// MiniportAdapterContext - Context registered with the wrapper, really
// a pointer to the VP context.
//
// Oid - The OID of the set.
//
// InformationBuffer - Holds the data to be set.
//
// InformationBufferLength - The length of InformationBuffer.
//
// BytesRead - If the call is successful, returns the number
// of bytes read from InformationBuffer.
//
// BytesNeeded - If there is not enough data 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
CrystalSetInformation
(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded
)
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
ULONG PacketFilter;
ULONG OldPacketFilter;
WORD LookAhead;
WORD LookAheadIndex;
VPM_SetupMiniContext;
//
// Now check for the most common OIDs
//
switch (Oid)
{
case OID_802_3_MULTICAST_LIST:
RETAILMSG
(
USEETHMSG,
(
TEXT("CS8950: OID_802_3_MULTICAST_LIST\r\n")
)
);
/* Make Sure Length of Data looks okay */
if (InformationBufferLength % ETH_LENGTH_OF_ADDRESS != 0)
{
Status = NDIS_STATUS_INVALID_DATA;
}
else
{
/* Make sure Multicast buffer has not been exceeded */
if (InformationBufferLength <= sizeof(pvMini_Context->McastList))
{
/* Copy Multicast addresses and inform VCHIP */
NdisMoveMemory(pvMini_Context->McastList, InformationBuffer, InformationBufferLength);
*BytesRead = InformationBufferLength;
pvMini_Context->McastListSize = InformationBufferLength / ETH_LENGTH_OF_ADDRESS;
//
// Do Flush
//
VchipMulticastDeleteAll( pChip );
//
// Add each one
//
for (LookAheadIndex=0;
LookAheadIndex < pvMini_Context->McastListSize;
LookAheadIndex++ )
{
VchipMulticastAdd( pChip, (PEA)&pvMini_Context->McastList[LookAheadIndex] );
}
}
else
{
*BytesRead = 0;
Status = NDIS_STATUS_MULTICAST_FULL;
} /* endif */
} /* endif */
return Status;
break;
case OID_GEN_CURRENT_PACKET_FILTER:
if (InformationBufferLength != 4)
{
*BytesNeeded = 4;
return NDIS_STATUS_INVALID_LENGTH;
}
RETAILMSG
(
USEETHMSG,
(
TEXT("CS8950: OID_GEN_CURRENT_PACKET_FILTER PacketFilter = 0x%08x\r\n"),
*(PULONG)InformationBuffer
)
);
//
// Now call the filter package to set the packet filter.
//
NdisMoveMemory((PVOID)&PacketFilter, InformationBuffer, sizeof(ULONG));
//
// Verify bits
//
if (PacketFilter & (NDIS_PACKET_TYPE_SOURCE_ROUTING |
NDIS_PACKET_TYPE_SMT |
NDIS_PACKET_TYPE_MAC_FRAME |
NDIS_PACKET_TYPE_FUNCTIONAL |
NDIS_PACKET_TYPE_ALL_FUNCTIONAL |
NDIS_PACKET_TYPE_GROUP |
// NDIS_PACKET_TYPE_ALL_MULTICAST | // Fails Cert test
NDIS_PACKET_TYPE_ALL_LOCAL // No Loopback!
))
{
*BytesRead = 4;
*BytesNeeded = 0;
RETAILMSG
(
USEETHMSG,
(
TEXT("CS8950: OID_GEN_CURRENT_PACKET_FILTER PacketFilter Not Supported\r\n")
)
);
return NDIS_STATUS_NOT_SUPPORTED;
}
OldPacketFilter = pvMini_Context->PacketFilter;
pvMini_Context->PacketFilter = PacketFilter;
pChip->Config.Filtering = 0;
if (PacketFilter & NDIS_PACKET_TYPE_DIRECTED)
{
pChip->Config.Filtering |= FILTER_INDIVIDUAL_ACCEPT;
}
if (PacketFilter & NDIS_PACKET_TYPE_BROADCAST)
{
pChip->Config.Filtering |= FILTER_BROADCAST_ACCEPT;
}
if (PacketFilter & (NDIS_PACKET_TYPE_MULTICAST |
NDIS_PACKET_TYPE_ALL_MULTICAST))
{
pChip->Config.Filtering |= FILTER_MULTICAST_ACCEPT;
//
// Do Flush
//
VchipMulticastDeleteAll( pChip );
if (PacketFilter & NDIS_PACKET_TYPE_ALL_MULTICAST)
{
VchipMulticastAddAll( pChip );
}
else
{
//
// Add each one
//
for (LookAheadIndex=0;
LookAheadIndex < pvMini_Context->McastListSize;
LookAheadIndex++ )
{
VchipMulticastAdd( pChip, (PEA)&pvMini_Context->McastList[LookAheadIndex] );
}
}
}
if (PacketFilter & NDIS_PACKET_TYPE_PROMISCUOUS)
{
pChip->Config.Filtering |= FILTER_PROMISCUOUS_ACCEPT;
}
VchipChangeFiltering( pChip );
break;
case OID_GEN_CURRENT_LOOKAHEAD:
RETAILMSG
(
USEETHMSG,
(
TEXT("CS8950: OID_GEN_CURRENT_LOOKAHEAD\r\n")
)
);
LookAhead = *((WORD *)InformationBuffer);
if (LookAhead > (VP_MAX_FRAMESIZE - VP_HEADERSIZE))
{
return NDIS_STATUS_INVALID_LENGTH;
}
pvMini_Context->ProtocolLookahead = LookAhead;
*BytesRead = InformationBufferLength;
// pChip->Config.LookaheadSize = LookAhead;
// VchipChangeLookAhead( pChip ); This needs to be added back if we allow lookahead
break;
case OID_GEN_PROTOCOL_OPTIONS:
RETAILMSG
(
USEETHMSG,
(
TEXT("CS8950: OID_GEN_CURRENT_LOOKAHEAD\r\n")
)
);
*BytesRead = InformationBufferLength;
break;
default:
RETAILMSG
(
USEETHMSG,
(
TEXT("CS8950: NOT_USED\r\n")
)
);
*BytesRead = 0; //@251
*BytesNeeded = 0; //@251
return NDIS_STATUS_INVALID_OID;
break;
}
return NDIS_STATUS_SUCCESS;
}
//****************************************************************************
// CrystalEnableInterrupt
//****************************************************************************
// Routine Description:
//
// This routine is used to turn on all interrupts from the adapter.
//
// Arguments:
//
// MiniportAdapterContext - A pointer to the VP context
//
// Return Value:
//
// None.
//
VOID CrystalEnableInterrupt
(
IN NDIS_HANDLE MiniportAdapterContext
)
{
VPM_SetupMiniContext;
VchipEnableInterrupts( ((PVPMINIPDATA)MiniportAdapterContext)->pChip );
return;
}
VOID
CrystalDisableInterrupt
(
IN NDIS_HANDLE MiniportAdapterContext
)
{
VchipDisableInterrupts( ((PVPMINIPDATA)MiniportAdapterContext)->pChip );
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -