📄 cs8900a.h
字号:
#define TX_ERR_NO_BUFFER 0x0001
#define TX_ERR_TOO_BIG 0x0002
#define TX_ERR_TOO_MANY_FRAGS 0x0004
#define TX_ERR_SQE_ERROR 0x0008
#define TX_ERR_JABBER 0x0010
#define TX_ERR_LOCK_FAIL 0x0020
#define TX_ERR_EXCESS_COLL 0x0100
#define TX_ERR_UNDERRUN 0x0200
#define TX_ERR_OUT_OF_WIN 0x0400
#define TX_ERR_LOSS_CRS 0x1000
#define TX_ERR_FRAME_ABORT 0x2000
// Receive Errors
#define RX_ERR_CRC_ERROR 0x0001
#define RX_ERR_EXTRA_DATA 0x0002
#define RX_ERR_RUNT 0x0004
#define RX_ERR_FRAMING 0x0008
#define RX_ERR_OVERRUN 0x0010
#define RX_ERR_RX_ERR 0x0020
#define RX_ERR_RX_MISS 0x0100
#define RX_ERR_DRIBBLE 0x0200
#define RX_ERR_TOO_MANY_FRAGS 0x0400
#define RX_ERR_NO_BUFFER 0x0800
#define ETHER_ADDR_SIZE 6 // Size of Ethernet address
#define ETHER_HDR_SIZE 14 // Size of ethernet header
#define ETH_MIN_PACKET 60
#define ETH_MAX_PACKET 1514
#define MCAST_LIST_SIZE 32
#define ETH_MIN_FRAME 16
// No DMA, I/O operation
// Interrupt number on the CS8900
// ZEUS: INTRQ0(pin 32) wired to interrupt 2
#define CS8900_INTERRUPT_NUM 0
#define CS8900_PacketPage_Signature 0x3000
#define CS8900_PacketPage_Signature_Mask 0xF000
#define BUF_RECEIVE_128_BYTES_ENABLE 0x0800
#define BUF_RX_DEST_MATCH_ENABLE 0x8000
#define BUF_DEFAULT_CONFIGURATION BUF_CFG_RDY4TX_IE |\
BUF_EVENT_RX_MISS |\
BUF_CFG_TX_UNDR_IE |\
BUF_CFG_MISOFLO_IE
// Receive Control bits for Register 5 (pg 55)
#define RX_DEFAULT_CONFIGURATION RX_CTL_RX_OK_A |\
RX_CTL_IND_A
// Line Control bits for Register 13 (pg 63)
#define LCR_RX_ON 0x0040
#define LCR_TX_ON 0x0080
#define LCR_AUI_ONLY 0x0100
#define LCR_AUTO_AUI_10BASET 0x0200
#define LCR_NWAY_ENABLE 0x0400
#define LCR_MODIFIED_BACKOFF 0x0800
#define LCR_AUTO_CORRECT_POLARITY 0x1000
#define LCR_LOW_RX_SQUELCH 0x4000
#define LCR_NWAY_PULSES 0x8000
#define LCR_WAKE_ENABLE 0x8000
// Line Status bits for Register 14 (pg 64)
#define LSR_LINKOK 0x0080
#define LSR_10BT 0x0200
#define LSR_AUI 0x0100
#define LSR_POLARITYOK 0x1000
// EEPROM related stuff
#define EEPROM_WRITE_COMMAND 0x0100
//
#define IRQ_IE 0x8000
#define AUTO_INCREMENT_EN 0x8000
#define TX_EVENT_COLL_SHIFT 0x000B
#ifdef DEBUG
// Debug zone bit positions
#define ZONEID_INIT 0
#define ZONEID_DEINIT 1
#define ZONEID_INFO 12
#define ZONEID_FUNCTION 13
#define ZONEID_WARN 14
#define ZONEID_ERROR 15
// Debug zone masks
#define ZONEMASK_INIT (1<<ZONEID_INIT)
#define ZONEMASK_DEINIT (1<<ZONEID_DEINIT)
#define ZONEMASK_INFO (1<<ZONEID_INFO)
#define ZONEMASK_FUNCTION (1<<ZONEID_FUNCTION)
#define ZONEMASK_WARN (1<<ZONEID_WARN)
#define ZONEMASK_ERROR (1<<ZONEID_ERROR)
// Debug zone args to DEBUGMSG
//#define ZONE_INIT DEBUGZONE(ZONEID_INIT)
//#define ZONE_DEINIT DEBUGZONE(ZONEID_DEINIT)
//#define ZONE_INFO DEBUGZONE(ZONEID_INFO)
//#define ZONE_FUNCTION DEBUGZONE(ZONEID_FUNCTION)
//#define ZONE_WARN DEBUGZONE(ZONEID_WARN)
//#define ZONE_ERROR DEBUGZONE(ZONEID_ERROR)
#define ZONE_INIT FALSE
#define ZONE_DEINIT FALSE
#define ZONE_INFO FALSE
#define ZONE_FUNCTION FALSE
#define ZONE_WARN FALSE
#define ZONE_ERROR FALSE
#endif
typedef struct
{
REG16 CS8900_RX_TX_DATA_0;
REG16 CS8900_RX_TX_DATA_1;
REG16 CS8900_TX_CMD;
REG16 CS8900_TX_LENGTH;
REG16 CS8900_ISQ;
REG16 CS8900_PAGE_POINTER;
REG16 CS8900_PAGE_DATA_0;
REG16 CS8900_PAGE_DATA_1;
} BSP_CS8900_REG, *PBSP_CS8900_REG;
//
// What we map into the reserved section of a packet.
// Cannot be more than 8 bytes
//
typedef struct _MINIPORT_RESERVED {
PNDIS_PACKET Next;
} MINIPORT_RESERVED, * PMINIPORT_RESERVED;
//
// Retrieve the MINIPORT_RESERVED structure from a packet.
//
#define RESERVED(Packet) ((PMINIPORT_RESERVED)((Packet)->MiniportReserved))
//------------------------------------------------------------------------------
// ENUMERATIONS AND STRUCTURES
#ifdef __cplusplus
extern "C" {
#endif
// CS8900A Configuration
typedef struct cs8900
{
NDIS_HANDLE ndisAdapterHandle;
// This structure holds information about our ISR.
// It is used to synchronize with the ISR.
NDIS_MINIPORT_INTERRUPT interruptObj;
BOOLEAN intEnabled;
DWORD intLine;
PVOID vIOBaseAddress;
UCHAR CurrentAddress[ETHER_ADDR_SIZE];
UCHAR PermanentAddress[ETHER_ADDR_SIZE];
UCHAR MediaType;
UCHAR DuplexMode;
UCHAR TxMaxCount;
UCHAR RxMaxCount;
WORD LookAheadSize;
WORD ChipType;
WORD ChipRevsion;
NDIS_HARDWARE_STATUS CurrentState;
NDIS_MEDIA_STATE MediaState;
ULONG PacketFilter;
ULONG CurrentLookAhead;
ULONG FramesXmitGood; // Good Frames Transmitted
ULONG FramesRcvGood; // Good Frames Received
ULONG FramesXmitBad; // Bad Frames Transmitted
ULONG FramesXmitOneCollision; // Frames Transmitted with one collision
ULONG FramesXmitManyCollisions; // Frames Transmitted with > 1 collision
ULONG FrameAlignmentErrors; // FAE errors counted
ULONG RcvCRCErrors; // CRC errors counted
ULONG MissedPackets; // missed packet counted
ULONG RcvErrors;
ULONG XmitMaxCollisions;
ULONG RcvOverrun;
ULONG XmitUnderrun;
ULONG RcvExtraDataErrors; // for receive packet longer than 1518bytes
ULONG RcvShortDataErrors; // for receive packet shorter than 64bytes
DWORD SerialNumber; // Adapter Serial number from EEPROM
CHAR McastList[MCAST_LIST_SIZE][ETHER_ADDR_SIZE];
ULONG NumMulticastAddressesInUse;
WORD TransmitInProgress;
//
// The first packet we have pending.
//
PNDIS_PACKET HeadPacket;
//
// The tail of the pending queue.
//
PNDIS_PACKET TailPacket;
WORD StartTX;
WORD TransmitBidPending;
WORD ReceiveCompleteNotifyFlag;
UCHAR ReceiveBuffer[ETH_MAX_PACKET];
ULONG ReceivePacketSize;
}cs8900_t, *pCs8900_t;
//------------------------------------------------------------------------------
// FUNCTION PROTOTYPES
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
static NDIS_STATUS Cs8900aInitialize(
OUT PNDIS_STATUS OpenErrorStatus,
OUT PUINT SelectedMediumIndex,
IN PNDIS_MEDIUM MediumArray,
IN UINT MediumArraySize,
IN NDIS_HANDLE MiniportAdapterHandle,
IN NDIS_HANDLE WrapperConfigurationContext);
VOID Cs8900aDisableInterrupt(IN NDIS_HANDLE MiniportAdapterContext );
VOID Cs8900aEnableInterrupt(IN NDIS_HANDLE MiniportAdapterContext);
VOID Cs8900aHalt(IN NDIS_HANDLE MiniportAdapterContext);
VOID Cs8900aHandleInterrupt(IN NDIS_HANDLE MiniportAdapterContext);
VOID Cs8900aIsr(
OUT PBOOLEAN InterruptRecognized,
OUT PBOOLEAN QueueDpc,
IN PVOID Context
);
NDIS_STATUS
Cs8900aQueryInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesWritten,
OUT PULONG BytesNeeded
);
NDIS_STATUS
Cs8900aReset(
OUT PBOOLEAN AddressingReset,
IN NDIS_HANDLE MiniportAdapterContext
);
NDIS_STATUS
Cs8900aSend(
IN NDIS_HANDLE MiniportAdapterContext,
IN PNDIS_PACKET Packet,
IN UINT SendFlags
);
NDIS_STATUS
Cs8900aTransferData(
OUT PNDIS_PACKET Packet,
OUT PUINT BytesTransferred,
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_HANDLE MiniportReceiveContext,
IN UINT ByteOffset,
IN UINT BytesToTransfer
);
NDIS_STATUS
Cs8900aSetInformation(
IN NDIS_HANDLE MiniportAdapterContext,
IN NDIS_OID Oid,
IN PVOID InformationBuffer,
IN ULONG InformationBufferLength,
OUT PULONG BytesRead,
OUT PULONG BytesNeeded
);
BOOLEAN Cs8900aCheckForHang(IN NDIS_HANDLE MiniportAdapterContext);
void Cs8900aShutdown(IN NDIS_HANDLE MiniportAdapterContext);
WORD CheckForChip(pCs8900_t pEthernet);
WORD CheckReadyForTransmit(pCs8900_t pEthernet);
WORD InitializeChip(pCs8900_t pEthernet);
WORD ReadCs8900Register(WORD RegisterOffset);
void WriteCs8900Register(WORD RegisterOffset, WORD Value);
WORD cs8900aReadFromEEPROM (pCs8900_t pEthernet, WORD EEPROMAddress);
void InterruptChip(pCs8900_t pEthernet, WORD Action);
NDIS_STATUS UpdateMediaConnectStatus(pCs8900_t pEthernet, NDIS_STATUS CurStatus);
void SetFilterType(pCs8900_t pEthernet);
UCHAR CalculateHashValue(UCHAR *pAddr);
void AddMultiCast(pCs8900_t pEthernet, UCHAR *pAddr);
void DeleteMultiCast(pCs8900_t pEthernet, UCHAR *pAddr);
void ReadMultiCastTable(pCs8900_t pEthernet, WORD *pHashTable);
void WriteMultiCastTable(pCs8900_t pEthernet, WORD *pHashTable);
void SetAllMultiCastTable(pCs8900_t pEthernet);
void ClearAllMultiCast(pCs8900_t pEthernet);
void TransferPacketToChip(pCs8900_t pEthernet);
void ProcessBufferInterrupts( pCs8900_t pEthernet, WORD InterruptEvent );
void ProcessReceiveInterrupts( pCs8900_t pEthernet, WORD InterruptEvent );
void ProcessTransmitInterrupts( pCs8900_t pEthernet, WORD InterruptEvent );
//------------------------------------------------------------------------------
// EXTERN DECLARATIONS
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------------
// CLASS DEFINITIONS
#endif // _SRC_DRIVERS_CS8900_CS8900A_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -