📄 lan91c111_miniport.c
字号:
/*
*
* Copyright (c) Standard MicroSystems Corporation. All Rights Reserved.
*
* LAN91C111 Driver for Windows CE .NET
*
* Revision History
*_______________________________________________________________________________
* Author Date Version Description
*_______________________________________________________________________________
* Pramod Bhardwaj 6/18/2002 0.1 Beta Release
* Pramod Bhardwaj 7/15/2002 1.0 Release
* Pramod Bhardwaj 1/22/2003 1.1 Removed some platform dependencies
* Pramod Bhardwaj 4/15/2003 2.0 Added support for alloc interrupt
*_______________________________________________________________________________
*
*
*Description:
* Functions exposed to the NDIS wrapper, ie., MiniportXXX functions.
*
*
*/
#include <Ndis.h>
#include <PKFuncs.h>
#include "LAN91C111_Adapter.h"
#include "LAN91C111_Proto.h"
extern NDIS_STATUS CopyInfo (UCHAR *, UCHAR *, UINT, UINT, UINT *, UINT *);
extern void BackOut (MINIPORT_ADAPTER *Adapter);
#define SMSC_32BIT_RW 1
/*
Function Name : LAN91C111-MiniportHalt
Description :
MiniportHalt is a required function that de-allocates resources
when the network adapter is removed and halts the network adapter
Parameters :
NDIS_HANDLE AdapterContext - Specifies the handle to a
miniport-allocated context area
Return Value :
VOID
*/
VOID LAN91C111_MiniportHalt (NDIS_HANDLE AdapterContext)
{
PMINIPORT_ADAPTER Adapter = (MINIPORT_ADAPTER *) AdapterContext;
BackOut(Adapter);
return;
}
/*
Function Name : LAN91C111_MiniportQueryInformation
Description : This function is a required function
that returns information about the capabilities
and status of the driver and/or its network adapter.
Parameters :
NDIS_HANDLE AdapterContext - Handle to the adapter structure
NDIS_OID Oid - OID code designation the query operation that the driver should carr out
PVOID InformationBuffer - pointer to the buffer in which the driver return the value
ULONG InformationBufferLength - lenght of the buffer
PULONG BytesWritten - number of bytes the driver is returning
PULONG BytesNeeded - additional bytes, if needed, to satisfy the query.
Return Value :
NDIS_STATUS Status
*/
NDIS_STATUS LAN91C111_MiniportQueryInformation(
NDIS_HANDLE AdapterContext,
NDIS_OID Oid,
PVOID InformationBuffer,
ULONG InformationBufferLength,
PULONG BytesWritten,
PULONG BytesNeeded
)
{
MINIPORT_ADAPTER *Adapter = (MINIPORT_ADAPTER *) AdapterContext;
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
NDIS_OID ReturnData;
void *Source = &ReturnData;
UINT BytesToMove = sizeof(NDIS_OID);
PrintDebugMsg(ZONE_INIT, (TEXT("LAN91C111 ==> MiniportQuery Information OID=%x, "), Oid));
switch(Oid)
{
case OID_GEN_SUPPORTED_LIST:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_SUPPORTED_LIST\r\n")));
Source = (void *) &GlobalObjects;
BytesToMove = sizeof(GlobalObjects);
break;
case OID_GEN_MEDIA_SUPPORTED:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_MEDIA_SUPPORTED\r\n")));
ReturnData = NdisMedium802_3;
break;
case OID_GEN_MEDIA_IN_USE:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_MEDIA_IN_USE\r\n")));
ReturnData = NdisMedium802_3;
break;
case OID_GEN_MAXIMUM_LOOKAHEAD:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_MAXIMUM_LOOKAHEAD\r\n")));
ReturnData = MAX_LOOKAHEAD_SIZE;
break;
case OID_GEN_MAXIMUM_FRAME_SIZE:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_MAXIMUM_FRAME_SIZE\r\n")));
ReturnData = MAX_FRAME_DATA_SIZE;
break;
case OID_GEN_LINK_SPEED:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_LINK_SPEED\r\n")));
ReturnData = Adapter->Speed;
break;
case OID_GEN_TRANSMIT_BUFFER_SPACE:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_TRANSMIT_BUFFER_SPACE\r\n")));
ReturnData = MAX_FRAME_SIZE;
break;
case OID_GEN_RECEIVE_BUFFER_SPACE:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_RECEIVE_BUFFER_SPACE\r\n")));
ReturnData = TOTAL_BUFFER_SIZE;
break;
case OID_GEN_TRANSMIT_BLOCK_SIZE:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_TRANSMIT_BLOCK_SIZE\r\n")));
ReturnData = MAX_FRAME_SIZE;
break;
case OID_GEN_RECEIVE_BLOCK_SIZE:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_RECEIVE_BLOCK_SIZE\r\n")));
ReturnData = MAX_FRAME_SIZE;
break;
case OID_GEN_VENDOR_ID:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_VENDOR_ID\r\n")));
ReturnData = 0;
NdisMoveMemory((void *) &ReturnData,(void *) &Adapter->MACAddress, 3);
break;
case OID_GEN_VENDOR_DESCRIPTION:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_VENDOR_DESCRIPTION\r\n")));
Source = (void *) DRV_VENDOR_NAME;
BytesToMove = SIZE_DRV_VENDOR_NAME;
break;
case OID_GEN_CURRENT_LOOKAHEAD:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_CURRENT_LOOKAHEAD\r\n")));
ReturnData = Adapter->LookAhead;
break;
case OID_GEN_DRIVER_VERSION:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_DRIVER_VERSION\r\n")));
BytesToMove = 2;
ReturnData = DRIVER_NDIS_VERSION;
break;
case OID_GEN_MAXIMUM_TOTAL_SIZE:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_MAXIMUM_TOTAL_SIZE\r\n")));
ReturnData = MAX_FRAME_SIZE;
break;
case OID_GEN_MAC_OPTIONS:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_MAC_OPTIONS\r\n")));
ReturnData = NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA |
NDIS_MAC_OPTION_RECEIVE_SERIALIZED |
NDIS_MAC_OPTION_TRANSFERS_NOT_PEND |
NDIS_MAC_OPTION_NO_LOOPBACK;
break;
case OID_802_3_PERMANENT_ADDRESS:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_802_3_PERMANENT_ADDRESS\r\n")));
Source = (void *) &Adapter->MACAddress;
BytesToMove = MAC_ADDRESS_SIZE;
break;
case OID_802_3_CURRENT_ADDRESS:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_802_3_CURRENT_ADDRESS\r\n")));
Source = (void *) &Adapter->MACAddress;
BytesToMove = MAC_ADDRESS_SIZE;
break;
case OID_802_3_MULTICAST_LIST:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_802_3_MULTICAST_LIST\r\n")));
BytesToMove = Adapter->MulticastTable.MulticastTableEntryCount
* ETH_LENGTH_OF_ADDRESS;
Source = (void *) Adapter->MulticastTable.MulticastTableEntry;
break;
case OID_802_3_MAXIMUM_LIST_SIZE:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_802_3_MAXIMUM_LIST_SIZE\r\n")));
ReturnData = MAX_MULTICAST_ADDRESS;
break;
case OID_802_3_RCV_ERROR_ALIGNMENT:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_802_3_RCV_ERROR_ALIGNMENT\r\n")));
ReturnData = Adapter->Stat_AlignError;
break;
case OID_802_3_XMIT_ONE_COLLISION:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_802_3_XMIT_ONE_COLLISION\r\n")));
ReturnData = Adapter->Stat_SingleColl;
break;
case OID_802_3_XMIT_MORE_COLLISIONS:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_802_3_XMIT_MORE_COLLISIONS\r\n")));
ReturnData = Adapter->Stat_MultiColl;
break;
case OID_GEN_MEDIA_CONNECT_STATUS:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_MEDIA_CONNECT_STATUS\r\n")));
if(Adapter->LinkStatus == MEDIA_DISCONNECTED)
{
ReturnData = NdisMediaStateDisconnected;
}
else
{
ReturnData = NdisMediaStateConnected;
}
break;
case OID_GEN_VENDOR_DRIVER_VERSION:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_VENDOR_DRIVER_VERSION\r\n")));
ReturnData = ((DRIVER_NDIS_MINOR_VERSION >> 16 ) |
DRIVER_NDIS_MAJOR_VERSION);
break;
case OID_GEN_MAXIMUM_SEND_PACKETS:
PrintDebugMsg(ZONE_INIT, (TEXT("OID_GEN_MAXIMUM_SEND_PACKETS\r\n")));
ReturnData = 1;
break;
case OID_GEN_XMIT_OK:
ReturnData = Adapter->Stat_TxOK;
break;
case OID_GEN_RCV_OK:
ReturnData = Adapter->Stat_RxOK;
break;
case OID_GEN_XMIT_ERROR:
ReturnData = Adapter->Stat_TxError;
break;
case OID_GEN_RCV_ERROR:
ReturnData = Adapter->Stat_RxError;
break;
case OID_GEN_RCV_NO_BUFFER:
ReturnData = Adapter->Stat_RxOvrn;
break;
case OID_GEN_HARDWARE_STATUS:
if (Adapter->State == NORMAL_STATE)
ReturnData = NdisHardwareStatusReady;
else
{
if(Adapter->State == INITIALIZING_STATE)
ReturnData = NdisHardwareStatusNotReady;
if(Adapter->State == RESET_STATE)
ReturnData = NdisHardwareStatusReset;
}
break;
default:
PrintDebugMsg(ZONE_INIT, (TEXT("Unknown or Unsupported OID Statistics Query\r\n")));
BytesToMove = 0;
Status = NDIS_STATUS_NOT_SUPPORTED;
break;
}
if(BytesToMove)
{
Status = CopyInfo(InformationBuffer,
Source,
InformationBufferLength,
BytesToMove,
BytesWritten,
BytesNeeded);
}
PrintDebugMsg(ZONE_INIT, (TEXT("LAN91C111 <== MiniportQuery Information OID\r\n")));
return Status;
}
NDIS_STATUS LAN91C111_MiniportSend (
NDIS_HANDLE AdapterContext,
PNDIS_PACKET pNDISPacket,
UINT Flags
)
{
MINIPORT_ADAPTER *Adapter = (MINIPORT_ADAPTER *) AdapterContext;
MINIPORT_PACKET *Packet;
ULONG IOBase;
UINT PacketLength;
USHORT PacketNumber;
NDIS_STATUS RetVal;
PrintDebugMsg(ZONE_TX, (TEXT("LAN91C111 ==> Miniport Send\r\n")));
IOBase = Adapter->IOBase;
//Make sure that the packet size is in legal limits.
NdisQueryPacket(pNDISPacket,NULL,NULL,NULL,(PUINT) &PacketLength);
if ((PacketLength > MAX_FRAME_SIZE) || (PacketLength < MIN_FRAME_SIZE))
{
PrintDebugMsg(ZONE_TX, (TEXT("LAN91C111: Invalid Packet Size\r\n")));
PrintDebugMsg(ZONE_TX, (TEXT("LAN91C111 <== Miniport Send\r\n")));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -