mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
254 lines
7.9 KiB
254 lines
7.9 KiB
#ifndef _IEPROSW_
|
|
#define _IEPROSW_
|
|
|
|
#define EPRO_NDIS_MAJOR_VERSION 3
|
|
#define EPRO_NDIS_MINOR_VERSION 0
|
|
#define EPRO_USE_32_BIT_IO
|
|
|
|
////////////////////////////////////////////////////////////
|
|
// Internal data structures used by the driver...
|
|
////////////////////////////////////////////////////////////
|
|
// do i really need this?
|
|
typedef struct EPRO_DRIVER {
|
|
NDIS_HANDLE EProWrapperHandle;
|
|
} EPRO_DRIVER, *PEPRO_DRIVER;
|
|
|
|
|
|
////////////////////////////////////////////////////////////
|
|
typedef struct _EPRO_TRANSMIT_BUFFER {
|
|
// This is basically to make computing the next and last buffer
|
|
// faster... Maybe saves us a few instructions, but makes a
|
|
// lot of code a lot easier to read...
|
|
struct _EPRO_TRANSMIT_BUFFER *LastBuf;
|
|
struct _EPRO_TRANSMIT_BUFFER *NextBuf;
|
|
|
|
BOOLEAN fEmpty; // TRUE if this is an empty buffer,
|
|
|
|
// This is valid iff !fEmpty
|
|
PNDIS_PACKET TXPacket;
|
|
|
|
// These are addresses ON THE NIC
|
|
USHORT TXBaseAddr;
|
|
USHORT TXSendAddr;
|
|
// USHORT TXBottomAddr;
|
|
USHORT TXSize;
|
|
} EPRO_TRANSMIT_BUFFER, *PEPRO_TRANSMIT_BUFFER;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
// The header is supposed to be "compatible with the 8595tx'
|
|
// transmit buffer structure. Whatever.
|
|
typedef struct _EPRO_MC_HEADER {
|
|
UCHAR CommandField;
|
|
UCHAR NullBytes[5];
|
|
|
|
// do it this way for endian-safety
|
|
UCHAR ByteCountLo;
|
|
UCHAR ByteCountHi;
|
|
} EPRO_MC_HEADER, *PEPRO_MC_HEADER;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
typedef struct _EPRO_MC_ADDRESS {
|
|
UCHAR AddrByte[EPRO_LENGTH_OF_ADDRESS];
|
|
} EPRO_MC_ADDRESS, *PEPRO_MC_ADDRESS;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
// These are the structures to be copied onto the NIC -- they
|
|
// are documented in the 82595 documentation
|
|
typedef struct _EPRO_TX_FRAME_HEADER {
|
|
// High dword
|
|
UCHAR XmitOp;
|
|
UCHAR NULLByte;
|
|
UCHAR Status0;
|
|
UCHAR Status1;
|
|
// Low dword
|
|
UCHAR XMTChainLo;
|
|
UCHAR XMTChainHi;
|
|
} EPRO_TX_FRAME_HEADER, *PEPRO_TX_FRAME_HEADER;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
// Same as above...
|
|
typedef struct _EPRO_RCV_HEADER {
|
|
UCHAR Event;
|
|
UCHAR NullByte;
|
|
UCHAR Status0;
|
|
UCHAR Status1;
|
|
UCHAR NextFrmLo;
|
|
UCHAR NextFrmHi;
|
|
UCHAR ByteCountLo;
|
|
UCHAR ByteCountHi;
|
|
} EPRO_RCV_HEADER, *PEPRO_RCV_HEADER;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
// This is an ETHERNET 802.3 frame header.
|
|
typedef struct _EPRO_ETH_HEADER {
|
|
UCHAR DestAddress[EPRO_LENGTH_OF_ADDRESS];
|
|
UCHAR SourceAddress[EPRO_LENGTH_OF_ADDRESS];
|
|
USHORT Length;
|
|
} EPRO_ETH_HEADER, *PEPRO_ETH_HEADER;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
// This is the context that gets passed to EProTransferData
|
|
// through NdisMIndicateReceive
|
|
typedef struct _EPRO_RCV_CONTEXT {
|
|
USHORT RXCurrentAddress;
|
|
USHORT RXFrameSize;
|
|
USHORT LookAheadSize;
|
|
} EPRO_RCV_CONTEXT, *PEPRO_RCV_CONTEXT;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
// The EPro adapter structure...
|
|
typedef struct EPRO_ADAPTER {
|
|
NDIS_HANDLE MiniportAdapterHandle;
|
|
NDIS_MINIPORT_INTERRUPT Interrupt;
|
|
// NDIS_MINIPORT_TIMER MiniportTimer;
|
|
PVOID IoBaseAddr;
|
|
ULONG TransceiverType;
|
|
ULONG IoPAddr; // Returned by NdisMRegisterIoPortRange - handle to mapped ports
|
|
ULONG IoChannelReady;
|
|
// What version of 82595 is this?
|
|
ULONG EProStepping;
|
|
// Can we use 32-bit IO? (ie is this a new enough version of the 82595
|
|
// chip?)
|
|
BOOLEAN EProUse32BitIO;
|
|
|
|
ULONG CurrentHardwareStatus;
|
|
// what is our current packet filter?
|
|
ULONG CurrentPacketFilter;
|
|
// are promiscuous receptions currently enabled?
|
|
BOOLEAN fPromiscuousEnable;
|
|
// are broadcast receptions currently enabled?
|
|
BOOLEAN fBroadcastEnable;
|
|
// are multicast receptions currently enabled?
|
|
BOOLEAN fMulticastEnable;
|
|
// are we hung? NOTUSED
|
|
BOOLEAN fHung;
|
|
// are receives currently enabled?
|
|
BOOLEAN fReceiveEnabled;
|
|
// do we really need this?
|
|
// BOOLEAN fTransmitInProgress;
|
|
|
|
// statistics
|
|
ULONG FramesXmitOK;
|
|
ULONG FramesRcvOK;
|
|
ULONG FramesXmitErr;
|
|
ULONG FramesRcvErr;
|
|
ULONG FramesMissed;
|
|
ULONG FrameAlignmentErrors;
|
|
ULONG FramesXmitOneCollision;
|
|
ULONG FramesXmitManyCollisions;
|
|
|
|
// transmit info
|
|
// these are our transmit buffers - structures which basically
|
|
// keep track of what frames are where in the NIC's memory.
|
|
EPRO_TRANSMIT_BUFFER TXBuf[EPRO_NUM_TX_BUFFERS];
|
|
// this is the first free transmit buffer pointer.
|
|
PEPRO_TRANSMIT_BUFFER CurrentTXBuf;
|
|
// This is the frame that is currently in the process of
|
|
// being transmitted onto the wire.
|
|
PEPRO_TRANSMIT_BUFFER TXChainStart;
|
|
|
|
// Multicast info
|
|
UCHAR MCAddress[EPRO_MAX_MULTICAST][EPRO_LENGTH_OF_ADDRESS];
|
|
// how many mc addresses are currently set?
|
|
USHORT NumMCAddresses;
|
|
|
|
// receive info
|
|
// how big is our lookahead buffer currently?
|
|
USHORT RXLookAheadSize;
|
|
// our lookahead buffer data
|
|
UCHAR RXLookAhead[EPRO_GEN_MAXIMUM_LOKAHEAD];
|
|
// what address ON THE NIC are we currently receiveing at?
|
|
// ie where do we check when we get a receive interrupt.
|
|
USHORT RXCurrentAddress;
|
|
|
|
// Is there an exec int pending? If so, why?
|
|
// right now only used to resolve pended set-mc calls...
|
|
ULONG IntPending;
|
|
// This is our context for a pended set-mc call
|
|
PVOID IntContext;
|
|
// set based on result of IOCHRDY test
|
|
BOOLEAN Use8Bit;
|
|
// set in ReadConfigInfo
|
|
BOOLEAN UseDefaultAddress;
|
|
// the MAC address burned into the eeprom
|
|
UCHAR PermanentIndividualAddress[EPRO_LENGTH_OF_ADDRESS];
|
|
// the address we are currently receiving at
|
|
UCHAR CurrentIndividualAddress[EPRO_LENGTH_OF_ADDRESS];
|
|
// always 00 aa 00 for intel
|
|
UCHAR vendorID[3];
|
|
|
|
UCHAR InterruptNumber;
|
|
UCHAR BusType;
|
|
|
|
// This is only used at initialization time
|
|
BOOLEAN fUpdateIOAddress;
|
|
PVOID OldIOAddress;
|
|
|
|
UCHAR CurrentInterruptMask;
|
|
} EPRO_ADAPTER, *PEPRO_ADAPTER;
|
|
|
|
|
|
////////////////////////////////////////////////////////////
|
|
// Sync contexts
|
|
////////////////////////////////////////////////////////////
|
|
typedef struct _EPRO_COPYBUF_CONTEXT {
|
|
PEPRO_ADAPTER Adapter;
|
|
PVOID Buffer;
|
|
UINT Len;
|
|
} EPRO_COPYBUF_CONTEXT, *PEPRO_COPYBUF_CONTEXT;
|
|
|
|
typedef struct _EPRO_SETINTERRUPT_CONTEXT {
|
|
PEPRO_ADAPTER Adapter;
|
|
UCHAR NewMask;
|
|
} EPRO_SETINTERRUPT_CONTEXT, *PEPRO_SETINTERRUPT_CONTEXT;
|
|
|
|
typedef struct _EPRO_BRDPROM_CONTEXT {
|
|
PEPRO_ADAPTER Adapter;
|
|
UCHAR Reg2Flags;
|
|
} EPRO_BRDPROM_CONTEXT, *PEPRO_BRDPROM_CONTEXT;
|
|
|
|
|
|
////////////////////////////////////////////////////////////
|
|
// Some macros for commonly used stuff....
|
|
|
|
#define EPRO_WR_PORT_UCHAR(adapter, port, ch) \
|
|
NdisRawWritePortUchar(adapter->IoPAddr + port, ch)
|
|
|
|
#define EPRO_RD_PORT_UCHAR(adapter, port, ch) \
|
|
NdisRawReadPortUchar(adapter->IoPAddr + port, ch)
|
|
|
|
#define EPRO_WR_PORT_USHORT(adapter, port, us) \
|
|
NdisRawWritePortUshort(adapter->IoPAddr + port, us)
|
|
|
|
#define EPRO_RD_PORT_USHORT(adapter, port, us) \
|
|
NdisRawReadPortUshort(adapter->IoPAddr + port, us)
|
|
|
|
|
|
////////////////////////////////////////////////////////////
|
|
// The EPro is a bank-switching card. These macros switch between the banks...
|
|
#define EPRO_SWITCH_BANK_0(adapter) \
|
|
EPRO_WR_PORT_UCHAR(adapter, I82595_CMD_REG, I82595_CMD_BANK0)
|
|
|
|
#define EPRO_SWITCH_BANK_1(adapter) \
|
|
EPRO_WR_PORT_UCHAR(adapter, I82595_CMD_REG, I82595_CMD_BANK1)
|
|
|
|
#define EPRO_SWITCH_BANK_2(adapter) \
|
|
EPRO_WR_PORT_UCHAR(adapter, I82595_CMD_REG, I82595_CMD_BANK2)
|
|
|
|
// Set the Host Address Register (0,c) -- use this to set up the NIC address
|
|
// for PIO through the register via COPY_BUFFER macros.
|
|
#define EPRO_SET_HOST_ADDR(adapter, addr) \
|
|
EPRO_WR_PORT_USHORT(adapter, I82595_HOST_ADDR_REG, addr);
|
|
|
|
#define EPRO_COPY_BUFFER_TO_NIC_USHORT(adapter, buffer, len) \
|
|
NdisRawWritePortBufferUshort((adapter->IoPAddr + I82595_MEM_IO_REG), \
|
|
(buffer), \
|
|
(len))
|
|
|
|
#define EPRO_READ_BUFFER_FROM_NIC_USHORT(adapter, buffer, len) \
|
|
NdisRawReadPortBufferUshort((adapter->IoPAddr + I82595_MEM_IO_REG), \
|
|
(buffer), \
|
|
len)
|
|
|
|
|
|
#endif _IEPROSW_
|