/***************************************************************************
*
* NDISMOD.H
*
* NDIS3 miniport driver main header file.
*
* Copyright (c) Madge Networks Ltd 1994
*
* COMPANY CONFIDENTIAL
*
* Created: PBA 21/06/1994
*
****************************************************************************/
#ifndef _NDIS_
#include <ndis.h>
#endif
/*---------------------------------------------------------------------------
|
| General Constants
|
|--------------------------------------------------------------------------*/
#define MADGE_NDIS_MAJOR_VERSION 3
#define MADGE_NDIS_MINOR_VERSION 0
#define EVERY_2_SECONDS 2000
#define MADGE_MINIMUM_LOOKAHEAD (64)
//
// Keep this OID if we are gathering performance statistics
//
// #define OID_MADGE_MONITOR 0x0303028e
#define OID_TYPE_MASK 0xffff0000
#define OID_TYPE_GENERAL_OPERATIONAL 0x00010000
#define OID_TYPE_GENERAL_STATISTICS 0x00020000
#define OID_TYPE_802_5_OPERATIONAL 0x02010000
#define OID_TYPE_802_5_STATISTICS 0x02020000
#define MADGE_ERRMSG_INIT_INTERRUPT (ULONG)0x01
#define MADGE_ERRMSG_CREATE_FILTER (ULONG)0x02
#define MADGE_ERRMSG_ALLOC_MEMORY (ULONG)0x03
#define MADGE_ERRMSG_REGISTER_ADAPTER (ULONG)0x04
#define MADGE_ERRMSG_ALLOC_DEVICE_NAME (ULONG)0x05
#define MADGE_ERRMSG_ALLOC_ADAPTER (ULONG)0x06
#define MADGE_ERRMSG_INITIAL_INIT (ULONG)0x07
#define MADGE_ERRMSG_OPEN_DB (ULONG)0x08
#define MADGE_ERRMSG_ALLOC_OPEN (ULONG)0x09
#define MADGE_ERRMSG_HARDWARE_ADDRESS (ULONG)0x0A
#define MADGE_ERRMSG_WRONG_RBA (ULONG)0x0B
#define MADGE_ERRMSG_REDUCE_MAX_FSIZE (ULONG)0x0C
#define MADGE_ERRMSG_OPEN_IMAGE_FILE (ULONG)0x0D
#define MADGE_ERRMSG_MAP_IMAGE_FILE (ULONG)0x0E
#define MADGE_ERRMSG_BAD_IMAGE_FILE (ULONG)0x0F
#define MADGE_ERRMSG_NO_BUS_TYPE (ULONG)0x10
#define MADGE_ERRMSG_NO_MCA_POS (ULONG)0x11
#define MADGE_ERRMSG_NO_EISA_CONFIG (ULONG)0x12
#define MADGE_ERRMSG_NO_ISA_IO (ULONG)0x13
#define MADGE_ERRMSG_NO_ISA_IRQ (ULONG)0x14
#define MADGE_ERRMSG_NO_ISA_DMA (ULONG)0x15
#define MADGE_ERRMSG_BAD_PARAMETER (ULONG)0x16
#define MADGE_ERRMSG_NO_PCI_SLOTNUMBER (ULONG)0x17
#define MADGE_ERRMSG_BAD_PCI_SLOTNUMBER (ULONG)0x18
#define MADGE_ERRMSG_BAD_PCI_MMIO (ULONG)0x19
#define MADGE_ERRMSG_MAPPING_PCI_MMIO (ULONG)0x1a
#define MADGE_ERRMSG_NO_PCI_IO (ULONG)0x1b
#define MADGE_ERRMSG_NO_PCI_IRQ (ULONG)0x1c
//
// Number of bytes in a minimum length token ring frame (MAC not
// LLC so just FC, AC and addresses).
//
#define FRAME_HEADER_SIZE 14
/*---------------------------------------------------------------------------
|
| Optional Parameter Definition Structure.
|
|--------------------------------------------------------------------------*/
typedef struct
{
NDIS_STRING Keyword;
DWORD Minimum;
DWORD Maximum;
NDIS_CONFIGURATION_PARAMETER DefaultValue;
NDIS_CONFIGURATION_PARAMETER ActualValue;
}
MADGE_PARM_DEFINITION;
/*---------------------------------------------------------------------------
|
| ISR Information Structure.
|
|--------------------------------------------------------------------------*/
typedef struct
{
NDIS_HANDLE MiniportHandle;
ULONG InterruptNumber;
BOOLEAN InterruptShared;
NDIS_INTERRUPT_MODE InterruptMode;
BOOLEAN SrbRequestCompleted;
BOOLEAN SrbRequestStatus;
}
USED_IN_ISR, *PUSED_IN_ISR;
#ifdef OID_MADGE_MONITOR
/*---------------------------------------------------------------------------
|
| Monitor Structure
|
|--------------------------------------------------------------------------*/
typedef struct
{
UINT TransmitFrames;
UINT ReceiveFrames;
UINT TransferFrames;
UINT TransmitFrameSize[65];
UINT ReceiveFrameSize[65];
UINT TransferFrameSize[65];
UINT ReceiveFlag;
UINT CurrentFrameSize;
UINT NumberOfPFrags[65];
UINT NumberOfVFrags[65];
UINT FailedToTransmit;
}
MADGE_MONITOR, *PMADGE_MONITOR;
#endif
/*---------------------------------------------------------------------------
|
| Adapter Structure.
|
| We actually have two adapter structures for each adapter. One of the type
| described below for NDIS3 level information and one maintained by the
| FTK for lower level adapter specific information.
|
|--------------------------------------------------------------------------*/
typedef struct
{
//
// Card configuration options.
//
UINT BusType;
UINT IoLocation1;
UINT IoLocation2;
UINT InterruptLevel;
UINT DmaChannel;
UINT TransferMode;
UINT SlotNumber;
UINT FastmacTxSlots;
UINT FastmacRxSlots;
UINT MaxFrameSize;
UINT CardBufferSize;
BOOLEAN PromiscuousMode;
BOOLEAN AlternateIo;
BOOLEAN TestAndXIDEnabled;
BOOLEAN ForceOpen;
BOOLEAN Force4;
BOOLEAN Force16;
BOOLEAN Multiprocessor;
UINT MapRegistersAllocated;
//
// Card dependent parameters.
//
WORD FTKCardBusType;
NDIS_INTERFACE_TYPE NTCardBusType;
//
// Handle for communicating with the FTK.
//
ADAPTER_HANDLE FtkAdapterHandle;
//
// Kernel resources allocated for the adapter.
//
NDIS_MINIPORT_INTERRUPT Interrupt;
NDIS_MINIPORT_TIMER WakeUpTimer;
NDIS_MINIPORT_TIMER CompletionTimer;
//
// Flags to indicate the current state of the driver/card.
//
BOOLEAN TimerInitialized;
BOOLEAN FtkInitialized;
BOOLEAN IORange1Initialized;
BOOLEAN IORange2Initialized;
BOOLEAN DprInProgress;
UINT RxTxBufferState;
BOOLEAN UseMPSafePIO;
BOOLEAN AdapterRemoved;
BOOLEAN ShutdownHandlerRegistered;
//
// Details of I/O ports used.
//
UINT IoLocationBase;
WORD IORange1;
WORD IORange2;
UINT IORange1End;
PVOID MappedIOLocation1;
PVOID MappedIOLocation2;
//
// Memory usage for PCI.
//
DWORD MmioRawAddress;
VOID * MmioVirtualAddress;
BOOLEAN MmioMapped;
//
// Interrupt related details.
//
USED_IN_ISR UsedInISR;
BOOLEAN SrbRequestStatus;
BOOLEAN DprRequired;
//
// Flag set if we are waiting for a private SRB to complete.
//
BOOLEAN PrivateSrbInProgress;
//
// General Mandatory Operational Characteristics.
//
NDIS_HARDWARE_STATUS HardwareStatus;
UINT CurrentPacketFilter;
ULONG CurrentLookahead;
//
// Counters for the General Mandatory Statistics.
//
UINT FramesTransmitted;
UINT FramesReceived;
UINT FrameTransmitErrors;
UINT FrameReceiveErrors;
UINT ReceiveCongestionCount;
//
// Token Ring Mandatory Operational Characteristics.
//
NODE_ADDRESS OpeningNodeAddress;
NODE_ADDRESS PermanentNodeAddress;
ULONG GroupAddress;
ULONG FunctionalAddress;
WORD OpenOptions;
WORD LastOpenStatus;
WORD CurrentRingStatus;
NDIS_802_5_RING_STATE CurrentRingState;
//
// Counters for the Token Ring Mandatory Statistics.
//
UINT LineErrors;
UINT LostFrames;
//
// Counters for the Token Ring Optional Statistics.
//
UINT BurstErrors;
UINT AcErrors;
UINT FrameCopiedErrors;
UINT TokenErrors;
NDIS_OID JustReadErrorLog;
//
// Status of a pended request.
//
NDIS_REQUEST_TYPE RequestType;
NDIS_OID RequestOid;
PVOID InformationBuffer;
#ifdef OID_MADGE_MONITOR
MADGE_MONITOR MonitorInfo;
#endif
}
MADGE_ADAPTER, *PMADGE_ADAPTER;
/*---------------------------------------------------------------------------
|
| Adapter types.
|
---------------------------------------------------------------------------*/
#define MADGE_ADAPTER_ATULA 100
#define MADGE_ADAPTER_PCMCIA 200
#define MADGE_ADAPTER_PNP 300
#define MADGE_ADAPTER_SMART16 400
#define MADGE_ADAPTER_EISA 500
#define MADGE_ADAPTER_MC 600
#define MADGE_ADAPTER_PCI 700
#define MADGE_ADAPTER_UNKNOWN 9999
/*---------------------------------------------------------------------------
|
| Transfer modes.
|
---------------------------------------------------------------------------*/
#define MADGE_PIO_MODE 0
#define MADGE_DMA_MODE 1
#define MADGE_MMIO_MODE 2
/*---------------------------------------------------------------------------
|
| OS types.
|
---------------------------------------------------------------------------*/
#define MADGE_OS_NT 100
#define MADGE_OS_WIN95 200
/*---------------------------------------------------------------------------
|
| Rx and Tx Buffer Initialization Flags.
|
---------------------------------------------------------------------------*/
#define MADGE_RX_INITIALIZED 0x0001
#define MADGE_TX_INITIALIZED 0x0002
#define MADGE_RXTX_INITIALIZED (MADGE_RX_INITIALIZED | MADGE_TX_INITIALIZED)
/*---------------------------------------------------------------------------
|
| Definition of a token ring frame MAC header.
|
|--------------------------------------------------------------------------*/
typedef struct
{
BYTE AC;
BYTE FC;
UCHAR DestAddress[6];
UCHAR SrcAddress[6];
}
TOKENRING, *PTOKENRING;
/*---------------------------------------------------------------------------
|
| Procedure Identifiers for Logging.
|
|--------------------------------------------------------------------------*/
typedef enum
{
readRegistry,
registerAdapter,
initAdapter,
madgeInitialize,
inFtk
}
MADGE_PROC_ID;
/*---------------------------------------------------------------------------
|
| Structure of the FastMAC Plus download file header.
|
|--------------------------------------------------------------------------*/
#define DOWNLOAD_CHECKSUM_SKIP (sizeof(DWORD) * 2)
#define DOWNLOAD_CHECKSUM_BYTE(chk, byte) \
(chk) = \
(((DWORD) (chk) >> 30) ^ ((DWORD) (chk) << 1)) + (UCHAR) (byte)
#define BUILD_DWORD(a, b, c, d) \
((((DWORD) (a)) << 24) + \
(((DWORD) (b)) << 16) + \
(((DWORD) (c)) << 8 ) + \
(((DWORD) (d)) ))
#define DOWNLOAD_SIGNATURE BUILD_DWORD(26, 'G', 'D', 'M')
typedef
struct
{
DWORD signature;
DWORD chkSum;
DWORD version;
char mVer[32];
}
DOWNLOAD_FILE_HEADER;
/*---------------------------------------------------------------------------
|
| Macro to check that a download file is cosha.
|
|--------------------------------------------------------------------------*/
#define IS_DOWNLOAD_OK(downHdr, checkSum) \
((downHdr)->signature == DOWNLOAD_SIGNATURE && \
(((downHdr)->version & 0xffff0000L) == \
(MADGE_NT_VERSION_DWORD & 0xffff0000L) || \
(downHdr)->version == 0) && \
(downHdr)->chkSum == (checkSum))
/*---------------------------------------------------------------------------
|
| Details of PCI configuration memory.
|
| We don't define a structure for this to avoid byte alignment problems on
| none x86 machines.
|
---------------------------------------------------------------------------*/
#define PCI_CONFIG_SIZE 64
#define PCI_MMIO_SIZE 4096
#define PCI_VENDOR_ID(buff) (((DWORD *) (buff))[0] & 0x0000ffffL)
#define PCI_REVISION(buff) ((((DWORD *) (buff))[0] & 0xffff0000L) >> 16)
#define PCI_IO_BASE(buff) (((DWORD *) (buff))[4] & 0xfffffffeL)
#define PCI_MMIO_BASE(buff) (((DWORD *) (buff))[5] & 0xfffffff0L)
#define PCI_IRQ_NUMBER(buff) (((DWORD *) (buff))[15] & 0x000000ffL)
#define MAX_PCI_SLOTS 32 // There are 5 bits of device ID which
// is what NT uses as the slot number.
#define PCI_FIND_ADAPTER 0xffff
#define MADGE_PCI_VENDOR_ID 0x10b6
#define MADGE_PCI_RAP1B_REVISION 0x0001
#define MADGE_PCI_PCI2_REVISION 0x0002
#define MADGE_PCI_PCIT_REVISION 0x0004
/*---------------------------------------------------------------------------
|
| Table to Map FTK Adapter Handles to NDIS3 Level Adapter Structures.
|
|--------------------------------------------------------------------------*/
// extern PMADGE_ADAPTER MadgeAdapterRecord[MAX_NUMBER_OF_ADAPTERS];
/*---------------------------------------------------------------------------
|
| Macros to Map Between Objects.
|
|--------------------------------------------------------------------------*/
//
// Get an NDIS3 level adapter structure pointer from an FTK adapter handle.
//
#define PMADGE_ADAPTER_FROM_ADAPTER_HANDLE(handle) \
((PMADGE_ADAPTER) FTK_ADAPTER_USER_INFORMATION(handle))
//
// Get an NDIS3 level adapter structure pointer from an NDIS adapter
// adapter context handle.
//
#define PMADGE_ADAPTER_FROM_CONTEXT(handle) \
((PMADGE_ADAPTER) ((PVOID) (handle)))
/*---------------------------------------------------------------------------
|
| Memory Manipulation Macros.
|
|--------------------------------------------------------------------------*/
//
// Allocate ordinary memory.
//
#define MADGE_ALLOC_MEMORY(status, address, length) \
{ \
NDIS_PHYSICAL_ADDRESS temp = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1); \
*(status) = NdisAllocateMemory( \
(PVOID) (address), \
(length), \
0, \
temp \
); \
}
//
// Free ordinary memory.
//
#define MADGE_FREE_MEMORY(address, length) \
NdisFreeMemory( \
(PVOID)(address), \
(length), \
0 \
)
//
// Copy memory.
//
#define MADGE_MOVE_MEMORY(destination, source, length) \
NdisMoveMemory((PVOID) (destination), (PVOID) (source), (ULONG) (length))
//
// Zero memory.
//
#define MADGE_ZERO_MEMORY(destination, length) \
NdisZeroMemory((PVOID) (destination), (ULONG) (length))
/*---------------------------------------------------------------------------
|
| Tokening Ring Address Testing Macros.
|
|--------------------------------------------------------------------------*/
//
// Compare two token ring MAC addresses pointed to by addPtr0 and
// addrPtr1. Return TRUE if they are the same.
//
#define MADGE_ADDRESS_SAME(addrPtr0, addrPtr1) \
(((WORD *) (addrPtr0))[2] == ((WORD *) (addrPtr1))[2] && \
((WORD *) (addrPtr0))[1] == ((WORD *) (addrPtr1))[1] && \
((WORD *) (addrPtr0))[0] == ((WORD *) (addrPtr1))[0])
//
// Return TRUE if the frame pointer to by framePtr is source routed.
//
#define FRAME_IS_SOURCE_ROUTED(framePtr) \
((((UCHAR *) (framePtr))[8] & 0x80) != 0)
//
// Return the number of bytes of source routing information in
// a frame.
//
#define FRAME_SOURCE_ROUTING_BYTES(framePtr) \
(((UCHAR *) (framePtr))[14] & 0x1f)
/*---------------------------------------------------------------------------
|
| Utility Macros.
|
|--------------------------------------------------------------------------*/
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
/*---------------------------------------------------------------------------
|
| Functions Exported by MADGE.C
|
|--------------------------------------------------------------------------*/
NDIS_STATUS
DriverEntry(PDRIVER_OBJECT driverObject, PUNICODE_STRING registryPath);
NDIS_STATUS
MadgeInitialize(
PNDIS_STATUS openErrorStatus,
PUINT selectedMediumIndex,
PNDIS_MEDIUM mediumArray,
UINT mediumArraySize,
NDIS_HANDLE miniportHandle,
NDIS_HANDLE wrapperConfigContext
);
VOID
MadgeHalt(NDIS_HANDLE adapterContext);
/*---------------------------------------------------------------------------
|
| Functions Exported by DISPATCH.C
|
|--------------------------------------------------------------------------*/
VOID
MadgeGetAdapterStatus(
PVOID systemSpecific1,
PVOID context,
PVOID systemSpecific2,
PVOID systemSpecific3
);
BOOLEAN
MadgeCheckForHang(NDIS_HANDLE adapterContext);
NDIS_STATUS
MadgeReset(PBOOLEAN addressReset, NDIS_HANDLE adapterContext);
VOID
MadgeDisableInterrupts(NDIS_HANDLE adapterContext);
VOID
MadgeEnableInterrupts(NDIS_HANDLE adapterContext);
NDIS_STATUS
MadgeSend(NDIS_HANDLE adapterContext, PNDIS_PACKET packet, UINT flags);
VOID
MadgeCopyFromPacketToBuffer(
PNDIS_PACKET packet,
UINT offset,
UINT bytesToCopy,
PCHAR destPtr,
PUINT bytesCopied
);
NDIS_STATUS
MadgeTransferData(
PNDIS_PACKET packet,
PUINT bytesTransferred,
NDIS_HANDLE adapterContext,
NDIS_HANDLE receiveContext,
UINT byteOffset,
UINT bytesToTransfer
);
VOID
MadgeCopyFromBufferToPacket(
PCHAR srcPtr,
UINT bytesToCopy,
PNDIS_PACKET packet,
UINT offset,
PUINT bytesCopied
);
VOID
MadgeISR(
PBOOLEAN interruptRecognised,
PBOOLEAN queueDPR,
NDIS_HANDLE adapterContext
);
VOID
MadgeHandleInterrupt(NDIS_HANDLE adapterContext);
/*---------------------------------------------------------------------------
|
| Functions Exported by REQUEST.C
|
|--------------------------------------------------------------------------*/
VOID
MadgeCompletePendingRequest(PMADGE_ADAPTER ndisAdap);
NDIS_STATUS
MadgeQueryInformation(
NDIS_HANDLE adapterContext,
NDIS_OID oid,
PVOID infoBuffer,
ULONG infoLength,
PULONG bytesRead,
PULONG bytesNeeded
);
NDIS_STATUS
MadgeSetInformation(
NDIS_HANDLE adapterContext,
NDIS_OID oid,
PVOID infoBuffer,
ULONG infoLength,
PULONG bytesRead,
PULONG bytesNeeded
);
/*---------------------------------------------------------------------------
|
| Functions Exported by FTK_USER.C
|
|--------------------------------------------------------------------------*/
void
rxtx_await_empty_tx_slots(
ADAPTER_HANDLE adapter_handle
);
void
rxtx_adapter_removed(
ADAPTER_HANDLE adapter_handle
);
/*---------------------------------------------------------------------------
|
| Debugging Macros.
|
|--------------------------------------------------------------------------*/
#if DBG
#define MadgePrint1(fmt) \
DbgPrint("MdgMPort: "##fmt)
#define MadgePrint2(fmt, v1) \
DbgPrint("MdgMPort: "##fmt, v1)
#define MadgePrint3(fmt, v1, v2) \
DbgPrint("MdgMPort: "##fmt, v1, v2)
#define MadgePrint4(fmt, v1, v2, v3) \
DbgPrint("MdgMPort: "##fmt, v1, v2, v3)
#define MadgePrint5(fmt, v1, v2, v3, v4) \
DbgPrint("MdgMPort: "##fmt, v1, v2, v3, v4)
#define STATIC
#else
#define MadgePrint1(fmt)
#define MadgePrint2(fmt, v1)
#define MadgePrint3(fmt, v1, v2)
#define MadgePrint4(fmt, v1, v2, v3)
#define MadgePrint5(fmt, v1, v2, v3, v4)
#define STATIC
#endif
/*---------------------------------------------------------------------------
|
| These event codes aren't mapped to NDIS error codes in the release DDK.
|
---------------------------------------------------------------------------*/
#ifndef NDIS_ERROR_CODE_MEMORY_CONFLICT
#define NDIS_ERROR_CODE_MEMORY_CONFLICT \
EVENT_NDIS_MEMORY_CONFLICT
#endif
#ifndef NDIS_ERROR_CODE_INVALID_DOWNLOAD_FILE_ERROR
#define NDIS_ERROR_CODE_INVALID_DOWNLOAD_FILE_ERROR \
EVENT_NDIS_INVALID_DOWNLOAD_FILE_ERROR
#endif
/**** End of NDISMOD.H *****************************************************/