362 lines
8.0 KiB
C
362 lines
8.0 KiB
C
/*++
|
||
|
||
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;
|