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.
361 lines
8.0 KiB
361 lines
8.0 KiB
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
elnk3sft.h
|
|
|
|
Abstract:
|
|
|
|
Ndis 3.0 MAC driver for the 3Com Etherlink III
|
|
|
|
Author:
|
|
|
|
Brian Lieuallen BrianLie 07/21/92
|
|
|
|
Environment:
|
|
|
|
Kernel Mode Operating Systems : NT
|
|
|
|
Revision History:
|
|
|
|
Portions borrowed from ELNK3 driver by
|
|
Earle R. Horton (EarleH)
|
|
|
|
|
|
--*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define DEFAULT_MULTICAST_SIZE 16
|
|
#define DEFAULT_RECEIVE_BUFFER_SIZE 238
|
|
|
|
|
|
#define ELNK3_NDIS_MAJOR_VERSION 3
|
|
#define ELNK3_NDIS_MINOR_VERSION 0
|
|
|
|
#define TIMER_ARRAY_SIZE 4
|
|
|
|
#define ELNK3_LENGTH_OF_ADDRESS 6
|
|
|
|
|
|
//
|
|
// Macros
|
|
//
|
|
#define MACRO_ASSERTALL() { \
|
|
ASSERT ( sizeof(CHAR) = 1 ); \
|
|
ASSERT ( sizeof(UCHAR) = 1 ); \
|
|
ASSERT ( sizeof(USHORT) = 2 ); \
|
|
ASSERT ( sizeof(UINT) = 4 ); \
|
|
ASSERT ( sizeof(ULONG) = 4 ); \
|
|
}
|
|
|
|
//
|
|
// The main MAC block structure allocated and initialized once
|
|
//
|
|
|
|
typedef struct _ELNK3_ISA_DESCRIPTION {
|
|
USHORT AddressConfigRegister;
|
|
USHORT ResourceConfigRegister;
|
|
USHORT IOPort;
|
|
USHORT Irq;
|
|
BOOLEAN Tagged;
|
|
BOOLEAN Active;
|
|
} ELNK3_ISA_DESCRIPTION, *PELNK3_ISA_DESCRIPTION;
|
|
|
|
|
|
|
|
typedef struct _MAC_BLOCK {
|
|
|
|
//
|
|
// Translated ID port Address
|
|
//
|
|
|
|
PUCHAR TranslatedIdPort;
|
|
|
|
ELNK3_ISA_DESCRIPTION IsaCards[7];
|
|
|
|
UCHAR IsaAdaptersFound;
|
|
|
|
} MAC_BLOCK, * PMAC_BLOCK;
|
|
|
|
|
|
typedef struct _PACKET_QUEUE {
|
|
PNDIS_PACKET QIn;
|
|
PNDIS_PACKET QOut;
|
|
} PACKET_QUEUE, *PPACKET_QUEUE;
|
|
|
|
|
|
|
|
typedef struct _TRANSFERDATA_CONTEXT {
|
|
struct _ELNK3_ADAPTER *pAdapter;
|
|
ULONG PacketLength;
|
|
ULONG BytesAlreadyRead;
|
|
|
|
PNIC_RCV_HEADER LookAhead;
|
|
|
|
PNDIS_PACKET LoopBackPacket;
|
|
|
|
PNDIS_PACKET Stack;
|
|
|
|
ULONG pad[2];
|
|
|
|
} TRANSFERDATA_CONTEXT, *PTRANSFERDATA_CONTEXT;
|
|
|
|
|
|
|
|
|
|
|
|
typedef
|
|
BOOLEAN
|
|
(*ELNK3_RECEIVE_HANDLER)(
|
|
struct _ELNK3_ADAPTER *pAdapter
|
|
);
|
|
|
|
|
|
|
|
|
|
//
|
|
// One of these structures per adapter registered.
|
|
//
|
|
|
|
typedef struct _ELNK3_ADAPTER {
|
|
|
|
PVOID PortOffsets[16];
|
|
|
|
//
|
|
// Xmit queues stuff
|
|
//
|
|
|
|
ELNK3_RECEIVE_HANDLER EarlyReceiveHandler;
|
|
ELNK3_RECEIVE_HANDLER ReceiveCompleteHandler;
|
|
|
|
ULONG XmtCompleted;
|
|
|
|
|
|
//
|
|
// Recieve stuff
|
|
//
|
|
UINT CurrentPacket;
|
|
|
|
UCHAR CurrentInterruptMask;
|
|
|
|
TRANSFERDATA_CONTEXT TransContext[2];
|
|
|
|
|
|
//
|
|
// Elnk3 stuff
|
|
//
|
|
|
|
UCHAR AdapterStatus;
|
|
|
|
UINT WakeUpErrorCount;
|
|
|
|
BOOLEAN RejectBroadcast;
|
|
|
|
BOOLEAN InitInterrupt;
|
|
|
|
//
|
|
// NDIS Interrupt information
|
|
//
|
|
|
|
NDIS_MINIPORT_INTERRUPT NdisInterrupt;
|
|
NDIS_INTERRUPT_MODE InterruptMode;
|
|
BOOLEAN AdapterInitializing;
|
|
|
|
//
|
|
// NDIS wrapper information.
|
|
//
|
|
|
|
NDIS_HANDLE NdisAdapterHandle; // returned from NdisRegisterAdapter
|
|
|
|
//
|
|
// Registry information
|
|
//
|
|
ULONG Transceiver;
|
|
|
|
UINT IoPortBaseAddr;
|
|
PVOID TranslatedIoBase;
|
|
|
|
|
|
ELNK3_ADAPTER_TYPE CardType;
|
|
ULONG IrqLevel;
|
|
ULONG ReceiveMethod;
|
|
|
|
UCHAR StationAddress[ELNK3_LENGTH_OF_ADDRESS]; // filled in at init time
|
|
|
|
UCHAR PermanentAddress[ELNK3_LENGTH_OF_ADDRESS]; // filled in at init time
|
|
|
|
USHORT EEpromSoftwareInfo;
|
|
|
|
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 CrcErrors; // CRC errors counted
|
|
ULONG MissedPackets; // missed packet counted
|
|
|
|
|
|
//
|
|
// Look Ahead information.
|
|
//
|
|
|
|
ULONG MaxLookAhead;
|
|
ULONG EarlyReceiveThreshold;
|
|
ULONG LatencyAdjustment;
|
|
ULONG LookAheadLatencyAdjustment;
|
|
LONG FirstEarlyThreshold;
|
|
ULONG LowWaterMark;
|
|
ULONG ThresholdTarget;
|
|
|
|
ULONG AverageLatency;
|
|
ULONG IdPortBaseAddr;
|
|
|
|
USHORT TxStartThreshold;
|
|
USHORT TxStartThresholdInc;
|
|
|
|
ULONG RxMinimumThreshold;
|
|
ULONG RxFifoSize;
|
|
UINT NdisRxFilter;
|
|
UCHAR RxFilter;
|
|
UCHAR RevisionLevel;
|
|
ULONG RxHiddenBytes;
|
|
|
|
BOOLEAN IdPortOwner;
|
|
|
|
//
|
|
// Adapter specific Infomation
|
|
//
|
|
|
|
|
|
UCHAR WakeUpState;
|
|
BOOLEAN AdapterFailed;
|
|
|
|
|
|
|
|
ULONG TimerValues[TIMER_ARRAY_SIZE];
|
|
ULONG CurrentTimerValue;
|
|
|
|
|
|
#if DBG
|
|
|
|
DEBUG_STATS Stats;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
} ELNK3_ADAPTER, * PELNK3_ADAPTER;
|
|
|
|
#define STATUS_REINIT_REQUESTED 0x0001
|
|
#define STATUS_RESET_INITIATED 0x0002
|
|
#define STATUS_RESET_IN_PROGRESS 0x0004
|
|
#define STATUS_MOVING_TO_CARD 0x0008
|
|
#define STATUS_SEND_BLOCK_USED 0x0010
|
|
#define STATUS_INITIALIZING 0x0020
|
|
#define STATUS_SHUTDOWN 0x0040
|
|
|
|
//
|
|
// What we map into the reserved section of a packet.
|
|
// Cannot be more than 16 bytes (see ASSERT in send.c).
|
|
//
|
|
|
|
|
|
#define NdisRequestClose 1
|
|
#define NdisRequestRequest 2
|
|
#define NdisRequestReset1 3
|
|
#define NdisRequestReset2 4
|
|
|
|
|
|
#define SEND_STATUS_LOOPBACK 0x01
|
|
#define SEND_STATUS_FAILED 0x02
|
|
#define SEND_STATUS_BUFFER_USED 0x04
|
|
#define SEND_STATUS_ABORTED 0x08
|
|
#define SEND_STATUS_ONE_COLLISION 0x10
|
|
#define SEND_STATUS_MANY_COLLISIONS 0x20
|
|
|
|
#define SEND_STATUS_SMALL_PACKET 0x40
|
|
|
|
|
|
typedef struct _PACKET_RESERVED {
|
|
PNDIS_PACKET Next; // used to link in the queues (4 bytes)
|
|
union {
|
|
struct {
|
|
|
|
USHORT PacketLength;
|
|
UCHAR Status;
|
|
|
|
} Send;
|
|
|
|
struct {
|
|
|
|
USHORT ByteOffset;
|
|
USHORT BytesToTransfer;
|
|
|
|
} TransData;
|
|
} u;
|
|
|
|
} PACKET_RESERVED, * PPACKET_RESERVED;
|
|
|
|
|
|
|
|
//
|
|
// These appear in the status field of MAC_RESERVED; they are
|
|
// used because there is not enough room for a full NDIS_HANDLE.
|
|
//
|
|
|
|
#define RESERVED_SUCCESS ((USHORT)0)
|
|
#define RESERVED_FAILURE ((USHORT)1)
|
|
|
|
//
|
|
// Retrieve the MAC_RESERVED structure from a packet.
|
|
//
|
|
|
|
#define PACKET_RESERVED(Packet) ((PPACKET_RESERVED)((Packet)->MacReserved))
|
|
|
|
#define ADD_PACKET_TO_QUEUE(pQueue,pPacket) { \
|
|
\
|
|
PACKET_RESERVED(pPacket)->Next = NULL; \
|
|
if ((pQueue)->QOut==NULL) { \
|
|
\
|
|
(pQueue)->QOut=pPacket; \
|
|
\
|
|
} else { \
|
|
\
|
|
PACKET_RESERVED((pQueue)->QIn)->Next=pPacket; \
|
|
} \
|
|
\
|
|
(pQueue)->QIn=pPacket; \
|
|
\
|
|
}
|
|
|
|
#define INIT_PACKET_QUEUE(pQueue) { \
|
|
(pQueue)->QIn=NULL; \
|
|
(pQueue)->QOut=NULL; \
|
|
}
|
|
|
|
#define QUEUE_EMPTY(pQueue) ((pQueue)->QOut==NULL)
|
|
|
|
#define PEEK_QUEUE(pQueue) (pQueue)->QOut
|
|
|
|
#define NEXT_PACKET(pQueue) (pQueue)->QOut=PACKET_RESERVED((pQueue)->QOut)->Next;
|
|
|
|
|
|
|
|
#define DEFAULT_MULTICASTLISTMAX 16
|
|
|
|
|
|
|
|
|
|
typedef struct _SYNC_CONTEXT {
|
|
ULONG Value;
|
|
PELNK3_ADAPTER pAdapter;
|
|
} SYNC_CONTEXT, *PSYNC_CONTEXT;
|