888 lines
17 KiB
C
888 lines
17 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1990-1998 Microsoft Corporation, All Rights Reserved.
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
ne2000sw.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
The main header for an Novell 2000 Miniport driver.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Sean Selitrennikoff
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Architecturally, there is an assumption in this driver that we are
|
||
|
on a little endian machine.
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
optional-notes
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _NE2000SFT_
|
||
|
#define _NE2000SFT_
|
||
|
|
||
|
#define NE2000_NDIS_MAJOR_VERSION 3
|
||
|
#define NE2000_NDIS_MINOR_VERSION 0
|
||
|
|
||
|
//
|
||
|
// This macro is used along with the flags to selectively
|
||
|
// turn on debugging.
|
||
|
//
|
||
|
|
||
|
#if DBG
|
||
|
|
||
|
#define IF_NE2000DEBUG(f) if (Ne2000DebugFlag & (f))
|
||
|
extern ULONG Ne2000DebugFlag;
|
||
|
|
||
|
#define NE2000_DEBUG_LOUD 0x00000001 // debugging info
|
||
|
#define NE2000_DEBUG_VERY_LOUD 0x00000002 // excessive debugging info
|
||
|
#define NE2000_DEBUG_LOG 0x00000004 // enable Ne2000Log
|
||
|
#define NE2000_DEBUG_CHECK_DUP_SENDS 0x00000008 // check for duplicate sends
|
||
|
#define NE2000_DEBUG_TRACK_PACKET_LENS 0x00000010 // track directed packet lens
|
||
|
#define NE2000_DEBUG_WORKAROUND1 0x00000020 // drop DFR/DIS packets
|
||
|
#define NE2000_DEBUG_CARD_BAD 0x00000040 // dump data if CARD_BAD
|
||
|
#define NE2000_DEBUG_CARD_TESTS 0x00000080 // print reason for failing
|
||
|
|
||
|
//
|
||
|
// Macro for deciding whether to print a lot of debugging information.
|
||
|
//
|
||
|
|
||
|
#define IF_LOUD(A) IF_NE2000DEBUG( NE2000_DEBUG_LOUD ) { A }
|
||
|
#define IF_VERY_LOUD(A) IF_NE2000DEBUG( NE2000_DEBUG_VERY_LOUD ) { A }
|
||
|
|
||
|
//
|
||
|
// Whether to use the Ne2000Log buffer to record a trace of the driver.
|
||
|
//
|
||
|
#define IF_LOG(A) IF_NE2000DEBUG( NE2000_DEBUG_LOG ) { A }
|
||
|
extern VOID Ne2000Log(UCHAR);
|
||
|
|
||
|
//
|
||
|
// Whether to do loud init failure
|
||
|
//
|
||
|
#define IF_INIT(A) A
|
||
|
|
||
|
//
|
||
|
// Whether to do loud card test failures
|
||
|
//
|
||
|
#define IF_TEST(A) IF_NE2000DEBUG( NE2000_DEBUG_CARD_TESTS ) { A }
|
||
|
|
||
|
#else
|
||
|
|
||
|
//
|
||
|
// This is not a debug build, so make everything quiet.
|
||
|
//
|
||
|
#define IF_LOUD(A)
|
||
|
#define IF_VERY_LOUD(A)
|
||
|
#define IF_LOG(A)
|
||
|
#define IF_INIT(A)
|
||
|
#define IF_TEST(A)
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Adapter->NumBuffers
|
||
|
//
|
||
|
// controls the number of transmit buffers on the packet.
|
||
|
// Choices are 1 through 12.
|
||
|
//
|
||
|
|
||
|
#define DEFAULT_NUMBUFFERS 12
|
||
|
|
||
|
|
||
|
//
|
||
|
// Create a macro for moving memory from place to place. Makes
|
||
|
// the code more readable and portable in case we ever support
|
||
|
// a shared memory Ne2000 adapter.
|
||
|
//
|
||
|
#define NE2000_MOVE_MEM(dest,src,size) NdisMoveMemory(dest,src,size)
|
||
|
|
||
|
//
|
||
|
// The status of transmit buffers.
|
||
|
//
|
||
|
|
||
|
typedef enum {
|
||
|
EMPTY = 0x00,
|
||
|
FULL = 0x02
|
||
|
} BUFFER_STATUS;
|
||
|
|
||
|
//
|
||
|
// Type of an interrupt.
|
||
|
//
|
||
|
|
||
|
typedef enum {
|
||
|
RECEIVE = 0x01,
|
||
|
TRANSMIT = 0x02,
|
||
|
OVERFLOW = 0x04,
|
||
|
COUNTER = 0x08,
|
||
|
UNKNOWN = 0x10
|
||
|
} INTERRUPT_TYPE;
|
||
|
|
||
|
//
|
||
|
// Result of Ne2000IndicatePacket().
|
||
|
//
|
||
|
typedef enum {
|
||
|
INDICATE_OK,
|
||
|
SKIPPED,
|
||
|
ABORT,
|
||
|
CARD_BAD
|
||
|
} INDICATE_STATUS;
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Size of the ethernet header
|
||
|
//
|
||
|
#define NE2000_HEADER_SIZE 14
|
||
|
|
||
|
//
|
||
|
// Size of the ethernet address
|
||
|
//
|
||
|
#define NE2000_LENGTH_OF_ADDRESS 6
|
||
|
|
||
|
//
|
||
|
// Number of bytes allowed in a lookahead (max)
|
||
|
//
|
||
|
#define NE2000_MAX_LOOKAHEAD (252 - NE2000_HEADER_SIZE)
|
||
|
|
||
|
//
|
||
|
// Maximum number of transmit buffers on the card.
|
||
|
//
|
||
|
#define MAX_XMIT_BUFS 12
|
||
|
|
||
|
//
|
||
|
// Definition of a transmit buffer.
|
||
|
//
|
||
|
typedef UINT XMIT_BUF;
|
||
|
|
||
|
//
|
||
|
// Number of 256-byte buffers in a transmit buffer.
|
||
|
//
|
||
|
#define BUFS_PER_TX 1
|
||
|
|
||
|
//
|
||
|
// Size of a single transmit buffer.
|
||
|
//
|
||
|
#define TX_BUF_SIZE (BUFS_PER_TX*256)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// This structure contains information about the driver
|
||
|
// itself. There is only have one of these structures.
|
||
|
//
|
||
|
typedef struct _DRIVER_BLOCK {
|
||
|
|
||
|
//
|
||
|
// NDIS wrapper information.
|
||
|
//
|
||
|
NDIS_HANDLE NdisMacHandle; // returned from NdisRegisterMac
|
||
|
NDIS_HANDLE NdisWrapperHandle; // returned from NdisInitializeWrapper
|
||
|
|
||
|
//
|
||
|
// Adapters registered for this Miniport driver.
|
||
|
//
|
||
|
struct _NE2000_ADAPTER * AdapterQueue;
|
||
|
|
||
|
} DRIVER_BLOCK, * PDRIVER_BLOCK;
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// This structure contains all the information about a single
|
||
|
// adapter that this driver is controlling.
|
||
|
//
|
||
|
typedef struct _NE2000_ADAPTER {
|
||
|
|
||
|
//
|
||
|
// This is the handle given by the wrapper for calling ndis
|
||
|
// functions.
|
||
|
//
|
||
|
NDIS_HANDLE MiniportAdapterHandle;
|
||
|
|
||
|
//
|
||
|
// Interrupt object.
|
||
|
//
|
||
|
NDIS_MINIPORT_INTERRUPT Interrupt;
|
||
|
|
||
|
//
|
||
|
// used by DriverBlock->AdapterQueue
|
||
|
//
|
||
|
struct _NE2000_ADAPTER * NextAdapter;
|
||
|
|
||
|
//
|
||
|
// This is a count of the number of receives that have been
|
||
|
// indicated in a row. This is used to limit the number
|
||
|
// of sequential receives so that one can periodically check
|
||
|
// for transmit complete interrupts.
|
||
|
//
|
||
|
ULONG ReceivePacketCount;
|
||
|
|
||
|
//
|
||
|
// Configuration information
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// Number of buffer in this adapter.
|
||
|
//
|
||
|
UINT NumBuffers;
|
||
|
|
||
|
//
|
||
|
// Physical address of the IoBaseAddress
|
||
|
//
|
||
|
PVOID IoBaseAddr;
|
||
|
|
||
|
//
|
||
|
// Interrupt number this adapter is using.
|
||
|
//
|
||
|
CHAR InterruptNumber;
|
||
|
|
||
|
//
|
||
|
// Number of multicast addresses that this adapter is to support.
|
||
|
//
|
||
|
UINT MulticastListMax;
|
||
|
|
||
|
//
|
||
|
// The type of bus that this adapter is running on. Either ISA or
|
||
|
// MCA.
|
||
|
//
|
||
|
UCHAR BusType;
|
||
|
|
||
|
//
|
||
|
// InterruptMode is whether the interrupt is latched or level sensitive
|
||
|
//
|
||
|
NDIS_INTERRUPT_MODE InterruptMode;
|
||
|
|
||
|
//
|
||
|
// Current status of the interrupt mask
|
||
|
//
|
||
|
BOOLEAN InterruptsEnabled;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Type of ne2000 card.
|
||
|
//
|
||
|
UINT CardType;
|
||
|
|
||
|
//
|
||
|
// Address of the memory window.
|
||
|
//
|
||
|
ULONG AttributeMemoryAddress;
|
||
|
ULONG AttributeMemorySize;
|
||
|
|
||
|
//
|
||
|
// Transmit information.
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// The next available empty transmit buffer.
|
||
|
//
|
||
|
XMIT_BUF NextBufToFill;
|
||
|
|
||
|
//
|
||
|
// The next full transmit buffer waiting to transmitted. This
|
||
|
// is valid only if CurBufXmitting is -1
|
||
|
//
|
||
|
XMIT_BUF NextBufToXmit;
|
||
|
|
||
|
//
|
||
|
// This transmit buffer that is currently transmitting. If none,
|
||
|
// then the value is -1.
|
||
|
//
|
||
|
XMIT_BUF CurBufXmitting;
|
||
|
|
||
|
//
|
||
|
// TRUE if a transmit has been started, and have not received the
|
||
|
// corresponding transmit complete interrupt.
|
||
|
//
|
||
|
BOOLEAN TransmitInterruptPending;
|
||
|
|
||
|
//
|
||
|
// TRUE if a receive buffer overflow occurs while a
|
||
|
// transmit complete interrupt was pending.
|
||
|
//
|
||
|
BOOLEAN OverflowRestartXmitDpc;
|
||
|
|
||
|
//
|
||
|
// The current status of each transmit buffer.
|
||
|
//
|
||
|
BUFFER_STATUS BufferStatus[MAX_XMIT_BUFS];
|
||
|
|
||
|
//
|
||
|
// Used to map packets to transmit buffers and visa-versa.
|
||
|
//
|
||
|
PNDIS_PACKET Packets[MAX_XMIT_BUFS];
|
||
|
|
||
|
//
|
||
|
// The length of each packet in the Packets list.
|
||
|
//
|
||
|
UINT PacketLens[MAX_XMIT_BUFS];
|
||
|
|
||
|
//
|
||
|
// The first packet we have pending.
|
||
|
//
|
||
|
PNDIS_PACKET FirstPacket;
|
||
|
|
||
|
//
|
||
|
// The tail of the pending queue.
|
||
|
//
|
||
|
PNDIS_PACKET LastPacket;
|
||
|
|
||
|
//
|
||
|
// The address of the start of the transmit buffer space.
|
||
|
//
|
||
|
PUCHAR XmitStart;
|
||
|
|
||
|
//
|
||
|
// The address of the start of the receive buffer space.
|
||
|
PUCHAR PageStart;
|
||
|
|
||
|
//
|
||
|
// The address of the end of the receive buffer space.
|
||
|
//
|
||
|
PUCHAR PageStop;
|
||
|
|
||
|
//
|
||
|
// Status of the last transmit.
|
||
|
//
|
||
|
UCHAR XmitStatus;
|
||
|
|
||
|
//
|
||
|
// The value to write to the adapter for the start of
|
||
|
// the transmit buffer space.
|
||
|
//
|
||
|
UCHAR NicXmitStart;
|
||
|
|
||
|
//
|
||
|
// The value to write to the adapter for the start of
|
||
|
// the receive buffer space.
|
||
|
//
|
||
|
UCHAR NicPageStart;
|
||
|
|
||
|
//
|
||
|
// The value to write to the adapter for the end of
|
||
|
// the receive buffer space.
|
||
|
//
|
||
|
UCHAR NicPageStop;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Receive information
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// The value to write to the adapter for the next receive
|
||
|
// buffer that is free.
|
||
|
//
|
||
|
UCHAR NicNextPacket;
|
||
|
|
||
|
//
|
||
|
// The next receive buffer that will be filled.
|
||
|
//
|
||
|
UCHAR Current;
|
||
|
|
||
|
//
|
||
|
// Total length of a received packet.
|
||
|
//
|
||
|
UINT PacketLen;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Operational information.
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// Mapped address of the base io port.
|
||
|
//
|
||
|
ULONG_PTR IoPAddr;
|
||
|
|
||
|
//
|
||
|
// InterruptStatus tracks interrupt sources that still need to be serviced,
|
||
|
// it is the logical OR of all card interrupts that have been received and not
|
||
|
// processed and cleared. (see also INTERRUPT_TYPE definition in ne2000.h)
|
||
|
//
|
||
|
UCHAR InterruptStatus;
|
||
|
|
||
|
//
|
||
|
// The ethernet address currently in use.
|
||
|
//
|
||
|
UCHAR StationAddress[NE2000_LENGTH_OF_ADDRESS];
|
||
|
|
||
|
//
|
||
|
// The ethernet address that is burned into the adapter.
|
||
|
//
|
||
|
UCHAR PermanentAddress[NE2000_LENGTH_OF_ADDRESS];
|
||
|
|
||
|
//
|
||
|
// The adapter space address of the start of on board memory.
|
||
|
//
|
||
|
PUCHAR RamBase;
|
||
|
|
||
|
//
|
||
|
// The number of K on the adapter.
|
||
|
//
|
||
|
ULONG RamSize;
|
||
|
|
||
|
//
|
||
|
// The current packet filter in use.
|
||
|
//
|
||
|
ULONG PacketFilter;
|
||
|
|
||
|
//
|
||
|
// TRUE if a receive buffer overflow occured.
|
||
|
//
|
||
|
BOOLEAN BufferOverflow;
|
||
|
|
||
|
//
|
||
|
// TRUE if the driver needs to call NdisMEthIndicateReceiveComplete
|
||
|
//
|
||
|
BOOLEAN IndicateReceiveDone;
|
||
|
|
||
|
//
|
||
|
// TRUE if this is an NE2000 in an eight bit slot.
|
||
|
//
|
||
|
BOOLEAN EightBitSlot;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Statistics used by Set/QueryInformation.
|
||
|
//
|
||
|
|
||
|
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
|
||
|
|
||
|
//
|
||
|
// Reset information.
|
||
|
//
|
||
|
|
||
|
UCHAR NicMulticastRegs[8]; // contents of card multicast registers
|
||
|
UCHAR NicReceiveConfig; // contents of NIC RCR
|
||
|
UCHAR NicInterruptMask; // contents of NIC IMR
|
||
|
|
||
|
//
|
||
|
// The lookahead buffer size in use.
|
||
|
//
|
||
|
ULONG MaxLookAhead;
|
||
|
|
||
|
//
|
||
|
// These are for the current packet being indicated.
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// The NIC appended header. Used to find corrupted receive packets.
|
||
|
//
|
||
|
UCHAR PacketHeader[4];
|
||
|
|
||
|
//
|
||
|
// Ne2000 address of the beginning of the packet.
|
||
|
//
|
||
|
PUCHAR PacketHeaderLoc;
|
||
|
|
||
|
//
|
||
|
// Lookahead buffer
|
||
|
//
|
||
|
UCHAR Lookahead[NE2000_MAX_LOOKAHEAD + NE2000_HEADER_SIZE];
|
||
|
|
||
|
//
|
||
|
// List of multicast addresses in use.
|
||
|
//
|
||
|
CHAR Addresses[DEFAULT_MULTICASTLISTMAX][NE2000_LENGTH_OF_ADDRESS];
|
||
|
|
||
|
} NE2000_ADAPTER, * PNE2000_ADAPTER;
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Given a MiniportContextHandle return the PNE2000_ADAPTER
|
||
|
// it represents.
|
||
|
//
|
||
|
#define PNE2000_ADAPTER_FROM_CONTEXT_HANDLE(Handle) \
|
||
|
((PNE2000_ADAPTER)(Handle))
|
||
|
|
||
|
//
|
||
|
// Given a pointer to a NE2000_ADAPTER return the
|
||
|
// proper MiniportContextHandle.
|
||
|
//
|
||
|
#define CONTEXT_HANDLE_FROM_PNE2000_ADAPTER(Ptr) \
|
||
|
((NDIS_HANDLE)(Ptr))
|
||
|
|
||
|
//
|
||
|
// Macros to extract high and low bytes of a word.
|
||
|
//
|
||
|
#define MSB(Value) ((UCHAR)((((ULONG)Value) >> 8) & 0xff))
|
||
|
#define LSB(Value) ((UCHAR)(((ULONG)Value) & 0xff))
|
||
|
|
||
|
//
|
||
|
// What we map into the reserved section of a packet.
|
||
|
// Cannot be more than 8 bytes (see ASSERT in ne2000.c).
|
||
|
//
|
||
|
typedef struct _MINIPORT_RESERVED {
|
||
|
PNDIS_PACKET Next; // used to link in the queues (4 bytes)
|
||
|
} MINIPORT_RESERVED, * PMINIPORT_RESERVED;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Retrieve the MINIPORT_RESERVED structure from a packet.
|
||
|
//
|
||
|
#define RESERVED(Packet) ((PMINIPORT_RESERVED)((Packet)->MiniportReserved))
|
||
|
|
||
|
//
|
||
|
// Procedures which log errors.
|
||
|
//
|
||
|
|
||
|
typedef enum _NE2000_PROC_ID {
|
||
|
cardReset,
|
||
|
cardCopyDownPacket,
|
||
|
cardCopyDownBuffer,
|
||
|
cardCopyUp
|
||
|
} NE2000_PROC_ID;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Special error log codes.
|
||
|
//
|
||
|
#define NE2000_ERRMSG_CARD_SETUP (ULONG)0x01
|
||
|
#define NE2000_ERRMSG_DATA_PORT_READY (ULONG)0x02
|
||
|
#define NE2000_ERRMSG_HANDLE_XMIT_COMPLETE (ULONG)0x04
|
||
|
|
||
|
//
|
||
|
// Declarations for functions in ne2000.c.
|
||
|
//
|
||
|
NDIS_STATUS
|
||
|
Ne2000SetInformation(
|
||
|
IN NDIS_HANDLE MiniportAdapterContext,
|
||
|
IN NDIS_OID Oid,
|
||
|
IN PVOID InformationBuffer,
|
||
|
IN ULONG InformationBufferLength,
|
||
|
OUT PULONG BytesRead,
|
||
|
OUT PULONG BytesNeeded
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
Ne2000Halt(
|
||
|
IN NDIS_HANDLE MiniportAdapterContext
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
Ne2000Shutdown(
|
||
|
IN NDIS_HANDLE MiniportAdapterContext
|
||
|
);
|
||
|
|
||
|
NDIS_STATUS
|
||
|
Ne2000RegisterAdapter(
|
||
|
IN PNE2000_ADAPTER Adapter,
|
||
|
IN NDIS_HANDLE ConfigurationHandle,
|
||
|
IN BOOLEAN ConfigError,
|
||
|
IN ULONG ConfigErrorValue
|
||
|
);
|
||
|
|
||
|
NDIS_STATUS
|
||
|
Ne2000Initialize(
|
||
|
OUT PNDIS_STATUS OpenErrorStatus,
|
||
|
OUT PUINT SelectedMediumIndex,
|
||
|
IN PNDIS_MEDIUM MediumArray,
|
||
|
IN UINT MediumArraySize,
|
||
|
IN NDIS_HANDLE MiniportAdapterHandle,
|
||
|
IN NDIS_HANDLE ConfigurationHandle
|
||
|
);
|
||
|
|
||
|
NDIS_STATUS
|
||
|
Ne2000TransferData(
|
||
|
OUT PNDIS_PACKET Packet,
|
||
|
OUT PUINT BytesTransferred,
|
||
|
IN NDIS_HANDLE MiniportAdapterContext,
|
||
|
IN NDIS_HANDLE MiniportReceiveContext,
|
||
|
IN UINT ByteOffset,
|
||
|
IN UINT BytesToTransfer
|
||
|
);
|
||
|
|
||
|
NDIS_STATUS
|
||
|
Ne2000Send(
|
||
|
IN NDIS_HANDLE MiniportAdapterContext,
|
||
|
IN PNDIS_PACKET Packet,
|
||
|
IN UINT Flags
|
||
|
);
|
||
|
|
||
|
NDIS_STATUS
|
||
|
Ne2000Reset(
|
||
|
OUT PBOOLEAN AddressingReset,
|
||
|
IN NDIS_HANDLE MiniportAdapterContext
|
||
|
);
|
||
|
|
||
|
NDIS_STATUS
|
||
|
Ne2000QueryInformation(
|
||
|
IN NDIS_HANDLE MiniportAdapterContext,
|
||
|
IN NDIS_OID Oid,
|
||
|
IN PVOID InformationBuffer,
|
||
|
IN ULONG InformationBufferLength,
|
||
|
OUT PULONG BytesWritten,
|
||
|
OUT PULONG BytesNeeded
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
Ne2000Halt(
|
||
|
IN NDIS_HANDLE MiniportAdapterContext
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
OctogmetusceratorRevisited(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
NDIS_STATUS
|
||
|
DispatchSetPacketFilter(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
NDIS_STATUS
|
||
|
DispatchSetMulticastAddressList(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Interrup.c
|
||
|
//
|
||
|
|
||
|
VOID
|
||
|
Ne2000EnableInterrupt(
|
||
|
IN NDIS_HANDLE MiniportAdapterContext
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
Ne2000DisableInterrupt(
|
||
|
IN NDIS_HANDLE MiniportAdapterContext
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
Ne2000Isr(
|
||
|
OUT PBOOLEAN InterruptRecognized,
|
||
|
OUT PBOOLEAN QueueDpc,
|
||
|
IN PVOID Context
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
Ne2000HandleInterrupt(
|
||
|
IN NDIS_HANDLE MiniportAdapterContext
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
Ne2000PacketOK(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
Ne2000XmitDpc(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
Ne2000RcvDpc(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Declarations of functions in card.c.
|
||
|
//
|
||
|
|
||
|
BOOLEAN
|
||
|
CardCheckParameters(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
CardInitialize(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
CardReadEthernetAddress(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
CardSetup(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
CardStop(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
CardTest(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
CardReset(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
CardCopyDownPacket(
|
||
|
IN PNE2000_ADAPTER Adapter,
|
||
|
IN PNDIS_PACKET Packet,
|
||
|
OUT UINT * Length
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
CardCopyDown(
|
||
|
IN PNE2000_ADAPTER Adapter,
|
||
|
IN PUCHAR TargetBuffer,
|
||
|
IN PUCHAR SourceBuffer,
|
||
|
IN UINT Length
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
CardCopyUp(
|
||
|
IN PNE2000_ADAPTER Adapter,
|
||
|
IN PUCHAR Target,
|
||
|
IN PUCHAR Source,
|
||
|
IN UINT Length
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
CardComputeCrc(
|
||
|
IN PUCHAR Buffer,
|
||
|
IN UINT Length
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
CardGetPacketCrc(
|
||
|
IN PUCHAR Buffer,
|
||
|
IN UINT Length,
|
||
|
OUT UCHAR Crc[4]
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
CardGetMulticastBit(
|
||
|
IN UCHAR Address[NE2000_LENGTH_OF_ADDRESS],
|
||
|
OUT UCHAR * Byte,
|
||
|
OUT UCHAR * Value
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
CardFillMulticastRegs(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
CardSetBoundary(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
CardStartXmit(
|
||
|
IN PNE2000_ADAPTER Adapter
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
SyncCardStop(
|
||
|
IN PVOID SynchronizeContext
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
SyncCardGetXmitStatus(
|
||
|
IN PVOID SynchronizeContext
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
SyncCardGetCurrent(
|
||
|
IN PVOID SynchronizeContext
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
SyncCardSetReceiveConfig(
|
||
|
IN PVOID SynchronizeContext
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
SyncCardSetAllMulticast(
|
||
|
IN PVOID SynchronizeContext
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
SyncCardCopyMulticastRegs(
|
||
|
IN PVOID SynchronizeContext
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
SyncCardSetInterruptMask(
|
||
|
IN PVOID SynchronizeContext
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
SyncCardAcknowledgeOverflow(
|
||
|
IN PVOID SynchronizeContext
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
SyncCardUpdateCounters(
|
||
|
IN PVOID SynchronizeContext
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
SyncCardHandleOverflow(
|
||
|
IN PVOID SynchronizeContext
|
||
|
);
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Determines the type of the interrupt on the card. The order of
|
||
|
importance is overflow, then transmit complete, then receive.
|
||
|
Counter MSB is handled first since it is simple.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
Adapter - pointer to the adapter block
|
||
|
|
||
|
InterruptStatus - Current Interrupt Status.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
The type of the interrupt
|
||
|
|
||
|
--*/
|
||
|
#define CARD_GET_INTERRUPT_TYPE(_A, _I) \
|
||
|
(_I & ISR_COUNTER) ? \
|
||
|
COUNTER : \
|
||
|
(_I & ISR_OVERFLOW ) ? \
|
||
|
SyncCardUpdateCounters(_A), OVERFLOW : \
|
||
|
(_I & (ISR_XMIT|ISR_XMIT_ERR)) ? \
|
||
|
TRANSMIT : \
|
||
|
(_I & ISR_RCV) ? \
|
||
|
RECEIVE : \
|
||
|
(_I & ISR_RCV_ERR) ? \
|
||
|
SyncCardUpdateCounters(_A), RECEIVE : \
|
||
|
UNKNOWN
|
||
|
|
||
|
#endif // NE2000SFT
|
||
|
|