|
|
#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_
|