summaryrefslogtreecommitdiffstats
path: root/private/ntos/ndis/ne2000/ne2000sw.h
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/ndis/ne2000/ne2000sw.h')
-rw-r--r--private/ntos/ndis/ne2000/ne2000sw.h877
1 files changed, 877 insertions, 0 deletions
diff --git a/private/ntos/ndis/ne2000/ne2000sw.h b/private/ntos/ndis/ne2000/ne2000sw.h
new file mode 100644
index 000000000..02e982136
--- /dev/null
+++ b/private/ntos/ndis/ne2000/ne2000sw.h
@@ -0,0 +1,877 @@
+/*++
+
+Copyright (c) 1990 Microsoft Corporation
+
+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;
+
+ //
+ // InterruptType is the next interrupt that should be serviced.
+ //
+ UCHAR InterruptType;
+
+
+ //
+ // 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 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
+ );
+
+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
+