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.
1373 lines
29 KiB
1373 lines
29 KiB
/*++
|
|
|
|
Copyright (c) 1990 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
toksft.h
|
|
|
|
Abstract:
|
|
|
|
The main header for a IBMTOK NDIS driver.
|
|
|
|
The overall structure is taken from the Lance driver
|
|
by Tony Ercolano.
|
|
|
|
Author:
|
|
|
|
Anthony V. Ercolano (tonye) creation-date 19-Jun-1990
|
|
Adam Barr (adamba) 20-Nov-1990
|
|
|
|
Environment:
|
|
|
|
Architecturally, there is an assumption in this driver that we are
|
|
on a little endian machine.
|
|
|
|
Notes:
|
|
|
|
optional-notes
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#ifndef _IBMTOKSFT_
|
|
#define _IBMTOKSFT_
|
|
|
|
|
|
#define IBMTOK_NDIS_MAJOR_VERSION 3
|
|
#define IBMTOK_NDIS_MINOR_VERSION 0
|
|
|
|
#if DBG
|
|
#define LOG 1
|
|
#else
|
|
#define LOG 0
|
|
#endif
|
|
|
|
#if LOG
|
|
|
|
//
|
|
// Place in the circular buffer.
|
|
//
|
|
extern UCHAR IbmtokLogPlace;
|
|
|
|
//
|
|
// Circular buffer for storing log information.
|
|
//
|
|
extern UCHAR IbmtokLog[];
|
|
|
|
#define IF_LOG(A) {IbmtokLog[IbmtokLogPlace] = (A); \
|
|
IbmtokLog[(IbmtokLogPlace+3) % 255] = '.'; \
|
|
IbmtokLogPlace = (IbmtokLogPlace+1) % 255; }
|
|
|
|
#else
|
|
|
|
#define IF_LOG(A)
|
|
|
|
#endif
|
|
|
|
extern const NDIS_PHYSICAL_ADDRESS HighestAcceptableMax;
|
|
|
|
#define IBMTOK_ALLOC_PHYS(pp,s) NdisAllocateMemory((PVOID *)(pp),(s),0,HighestAcceptableMax)
|
|
#define IBMTOK_FREE_PHYS(p,s) NdisFreeMemory((PVOID)(p),(s),0)
|
|
#define IBMTOK_MOVE_MEMORY(Destination,Source,Length) NdisMoveMemory((PVOID)(Destination),(PVOID)(Source),Length)
|
|
#define IBMTOK_ZERO_MEMORY(Destination,Length) NdisZeroMemory((PVOID)(Destination),Length)
|
|
#define IBMTOK_MOVE_TO_MAPPED_MEMORY(Destination,Source,Length) NdisMoveToMappedMemory((PVOID)(Destination),(PVOID)(Source),Length)
|
|
#define IBMTOK_MOVE_FROM_MAPPED_MEMORY(Destination,Source,Length) NdisMoveFromMappedMemory((PVOID)(Destination),(PVOID)(Source),Length)
|
|
#define IBMTOK_ZERO_MAPPED_MEMORY(Destination,Length) NdisZeroMappedMemory((PVOID)(Destination),Length)
|
|
#define IBMTOK_STORE_ULONG(Destination,Source)\
|
|
{\
|
|
PUCHAR _D = (PUCHAR)(Destination);\
|
|
ULONG _S = (ULONG)(Source);\
|
|
_D[0] = (UCHAR)(_S >> 24);\
|
|
_D[1] = (UCHAR)(_S >> 16);\
|
|
_D[2] = (UCHAR)(_S >> 8);\
|
|
_D[3] = (UCHAR)(_S);\
|
|
}
|
|
|
|
|
|
typedef struct _IBMTOK_MAC {
|
|
|
|
//
|
|
// The handle returned by NdisInitializeWrapper.
|
|
//
|
|
|
|
NDIS_HANDLE NdisWrapperHandle;
|
|
|
|
//
|
|
// The handle returned by NdisRegisterMac.
|
|
//
|
|
|
|
NDIS_HANDLE NdisMacHandle;
|
|
|
|
} IBMTOK_MAC, *PIBMTOK_MAC;
|
|
|
|
|
|
|
|
//
|
|
// This record type is inserted into the MacReserved portion
|
|
// of the packet header when the packet is going through the
|
|
// staged allocation of buffer space prior to the actual send.
|
|
//
|
|
typedef struct _IBMTOK_RESERVED {
|
|
|
|
//
|
|
// Points to the next packet in the chain of queued packets
|
|
// waiting for the SRB or the ASB.
|
|
//
|
|
// The packet will start out on the Transmit queue,
|
|
// then move to TransmittingPacket when its transmit is
|
|
// in the SRB. When the correlator is assigned it is placed
|
|
// in CorrelatorArray (where the Next field is not used),
|
|
// and at that time may also be in WaitingForAsb if it
|
|
// needs the ASB to acknowledge the copying down of the
|
|
// transmit data. Packets are completed out of the
|
|
// CorrelatorArray.
|
|
//
|
|
//
|
|
PNDIS_PACKET Next;
|
|
|
|
//
|
|
// This field holds the binding handle of the open binding
|
|
// that submitted this packet for send.
|
|
//
|
|
NDIS_HANDLE MacBindingHandle;
|
|
|
|
//
|
|
// This field holds the pointer to the packet so that when
|
|
// the send finnaly completes it can be used to indicate to
|
|
// the protocol.
|
|
//
|
|
PNDIS_PACKET Packet;
|
|
|
|
//
|
|
// TRUE if a command correlator has been assigned for this
|
|
// packet.
|
|
//
|
|
BOOLEAN CorrelatorAssigned;
|
|
|
|
//
|
|
// The value of the adapter-assigned command correlator.
|
|
//
|
|
UCHAR CommandCorrelator;
|
|
|
|
} IBMTOK_RESERVED,*PIBMTOK_RESERVED;
|
|
|
|
|
|
//
|
|
// This macro will return a pointer to the reserved portion
|
|
// of a packet given a pointer to a packet.
|
|
//
|
|
#define PIBMTOK_RESERVED_FROM_PACKET(Packet) \
|
|
((PIBMTOK_RESERVED)((PVOID)((Packet)->MacReserved)))
|
|
|
|
|
|
|
|
//
|
|
// This structure is inserted into the MacReserved section of the
|
|
// NDIS_REQUEST for operations that must pend. Note: the sizeof
|
|
// this structure must be less than or equal to 16 bytes.
|
|
//
|
|
// The flags are broken down as follows....
|
|
//
|
|
// Type == IBMTOK_PEND_MAC for requests submitted by the MAC to clear card errors.
|
|
// ReadLogPending == TRUE if the MAC submitted a DIR.READ.LOG command.
|
|
// ReadLogPending == FALSE if the MAC submitted DLC.STATISTICS.
|
|
//
|
|
// Type == IBMTOK_PEND_NDIS_CLOSE for request submitted thru Ndis.
|
|
// Open, the open that submitted the Ndis request.
|
|
//
|
|
// Type == IBMTOK_PEND_NDIS_SET_FILTER for request submitted thru Ndis.
|
|
// Open, the open that submitted the Ndis request.
|
|
//
|
|
// Type == IBMTOK_PEND_NDIS_STATISTICS for request submitted thru Ndis.
|
|
// ReadLogPending, Boolean if the DIR.READ.LOG command was submitted.
|
|
//
|
|
//
|
|
//
|
|
typedef struct _IBMTOK_PEND_DATA{
|
|
|
|
//
|
|
// Points to the next request in the chain of queued packets
|
|
// waiting for the SRB.
|
|
//
|
|
// The request will start out on the PendQueue,
|
|
// then move to front of the queue when its operation is
|
|
// in the SRB.
|
|
//
|
|
//
|
|
struct _IBMTOK_PEND_DATA * Next;
|
|
|
|
|
|
union _COMMAND{
|
|
|
|
struct _MAC{
|
|
|
|
//
|
|
// Whether the statistics command was a
|
|
// DIR.READ.LOG or DLC.STATISTICS
|
|
//
|
|
|
|
UINT ReadLogPending;
|
|
|
|
}MAC;
|
|
|
|
union _NDIS{
|
|
|
|
struct _CLOSE{
|
|
|
|
//
|
|
// This field holds the open instance which submitted the
|
|
// request.
|
|
//
|
|
|
|
struct _IBMTOK_OPEN *Open;
|
|
|
|
//
|
|
// This field holds the new filter value.
|
|
//
|
|
|
|
UINT NewFilterValue;
|
|
|
|
|
|
}CLOSE;
|
|
|
|
|
|
struct _SET_FILTER{
|
|
|
|
//
|
|
// The first two fields of SET_FILTER and SET_ADDRESS need
|
|
// to align so that the processing in FinishSetOperation
|
|
// is easier.
|
|
//
|
|
|
|
|
|
//
|
|
// This field holds the open instance which submitted the
|
|
// request.
|
|
//
|
|
|
|
struct _IBMTOK_OPEN *Open;
|
|
|
|
//
|
|
// This field holds the new filter value.
|
|
//
|
|
|
|
UINT NewFilterValue;
|
|
|
|
}SET_FILTER;
|
|
|
|
|
|
struct _SET_ADDRESS{
|
|
|
|
//
|
|
// The first two fields of SET_FILTER and SET_ADDRESS need
|
|
// to align so that the processing in FinishSetOperation
|
|
// is easier.
|
|
//
|
|
|
|
|
|
//
|
|
// This field holds the open instance which submitted the
|
|
// request.
|
|
//
|
|
|
|
struct _IBMTOK_OPEN *Open;
|
|
|
|
//
|
|
// This field holds the new address value.
|
|
//
|
|
|
|
TR_FUNCTIONAL_ADDRESS NewAddressValue;
|
|
|
|
}SET_ADDRESS;
|
|
|
|
|
|
struct _STATISTICS{
|
|
|
|
//
|
|
// Pointer into NdisRequest at the New filter value.
|
|
//
|
|
|
|
BOOLEAN ReadLogPending;
|
|
|
|
|
|
}STATISTICS;
|
|
|
|
}NDIS;
|
|
|
|
}COMMAND;
|
|
|
|
//
|
|
// Buffer to fill in Reserved section so that the next field overlaps
|
|
// with the RequestType in the NdisRequest.
|
|
//
|
|
|
|
ULONG Buffer;
|
|
|
|
|
|
NDIS_REQUEST_TYPE RequestType;
|
|
|
|
|
|
}IBMTOK_PEND_DATA, *PIBMTOK_PEND_DATA;
|
|
|
|
//
|
|
// This macro will return a pointer to the reserved area of
|
|
// a PNDIS_REQUEST.
|
|
//
|
|
#define PIBMTOK_PEND_DATA_FROM_PNDIS_REQUEST(Request) \
|
|
((PIBMTOK_PEND_DATA)((PVOID)((Request)->MacReserved)))
|
|
|
|
//
|
|
// This macros returns the enclosing NdisRequest.
|
|
//
|
|
#define PNDIS_REQUEST_FROM_PIBMTOK_PEND_DATA(PendOp)\
|
|
((PNDIS_REQUEST)((PVOID)(PendOp)))
|
|
|
|
//
|
|
// Define Maximum number of bytes a protocol can read during a
|
|
// receive data indication.
|
|
//
|
|
#define IBMTOK_MAX_LOOKAHEAD 240
|
|
|
|
|
|
typedef struct _IBMTOK_ADAPTER {
|
|
|
|
//
|
|
// Holds the interrupt object for this adapter.
|
|
//
|
|
NDIS_INTERRUPT Interrupt;
|
|
|
|
//
|
|
// Flag to tell if the ISR removed the interrupt.
|
|
//
|
|
UCHAR ContinuousIsrs;
|
|
|
|
PVOID WakeUpDpc;
|
|
NDIS_TIMER WakeUpTimer;
|
|
BOOLEAN SendTimeout;
|
|
BOOLEAN RequestTimeout;
|
|
UCHAR WakeUpErrorCount;
|
|
|
|
//
|
|
// Defines whether the adapter is an ISA or PCMCIA adapter.
|
|
//
|
|
UINT CardType;
|
|
|
|
//
|
|
// Boolean to turn on/off early token release
|
|
//
|
|
BOOLEAN EarlyTokenRelease;
|
|
|
|
//
|
|
// Flag to indicate that the card initialized.
|
|
//
|
|
BOOLEAN BringUp;
|
|
|
|
//
|
|
// Spinlock for the interrupt.
|
|
//
|
|
NDIS_SPIN_LOCK InterruptLock;
|
|
|
|
//
|
|
// The interrupt level as read from the card.
|
|
//
|
|
UINT InterruptLevel;
|
|
|
|
//
|
|
// Is the adapter running at 16 Mbps (versus 4 Mbps).
|
|
//
|
|
BOOLEAN Running16Mbps;
|
|
|
|
//
|
|
// Is the adapter using the PC I/O Bus (versus MicroChannel).
|
|
//
|
|
BOOLEAN UsingPcIoBus;
|
|
|
|
//
|
|
// Does the upper 512 bytes of the shared RAM have to
|
|
// be zeroed after initialization.
|
|
//
|
|
BOOLEAN UpperSharedRamZero;
|
|
|
|
//
|
|
// Are we using Shared RAM paging.
|
|
//
|
|
BOOLEAN SharedRamPaging;
|
|
|
|
//
|
|
// The size of the RAM on the adapter.
|
|
//
|
|
ULONG TotalSharedRam;
|
|
|
|
//
|
|
// The amount of Shared RAM to be mapped in.
|
|
//
|
|
ULONG MappedSharedRam;
|
|
|
|
//
|
|
// The maximum size of a DHB at 4 Mbps.
|
|
//
|
|
USHORT Max4MbpsDhb;
|
|
|
|
//
|
|
// The maximum size of a DHB at 16 Mbps.
|
|
//
|
|
USHORT Max16MbpsDhb;
|
|
|
|
//
|
|
// Value of the RRR Low register (address of Shared Ram).
|
|
//
|
|
UCHAR RrrLowValue;
|
|
|
|
// The following fields are accessed by the ISR and must be aligned to the
|
|
// minimum granularity of the architecture on which it runs
|
|
|
|
#if defined(_ALPHA_)
|
|
|
|
union {
|
|
UQUAD _ForceQuadwordAlignment;
|
|
struct {
|
|
|
|
#endif // defined(_ALPHA_)
|
|
|
|
//
|
|
// These variables are used to hold bits stored in the ISR
|
|
// and read in the DPC.
|
|
//
|
|
UCHAR IsrpBits;
|
|
|
|
//
|
|
// These hold ISR bits whose processing is delayed because
|
|
// the adapter is not accepting requests.
|
|
//
|
|
UCHAR IsrpDeferredBits;
|
|
|
|
//
|
|
// Any Error conditions found in the IsrpLow register
|
|
//
|
|
UCHAR IsrpLowBits;
|
|
|
|
#if defined(_ALPHA_)
|
|
|
|
};
|
|
};
|
|
|
|
#endif // defined(_ALPHA_)
|
|
|
|
// End of ISR access fields
|
|
|
|
//
|
|
// This boolean is used as a gate to ensure that only one thread
|
|
// of execution is actually processing SRB interrupts
|
|
//
|
|
BOOLEAN HandleSrbRunning;
|
|
|
|
//
|
|
// This boolean is used as a gate to ensure that only one thread
|
|
// of execution is actually processing SRB interrupts
|
|
//
|
|
BOOLEAN HandleArbRunning;
|
|
|
|
//
|
|
// The network address in use.
|
|
//
|
|
CHAR NetworkAddress[TR_LENGTH_OF_ADDRESS];
|
|
|
|
//
|
|
// The network address from the hardware.
|
|
//
|
|
CHAR PermanentNetworkAddress[TR_LENGTH_OF_ADDRESS];
|
|
|
|
//
|
|
// Pointer to the beginning of the IBMTOK ports.
|
|
//
|
|
ULONG IbmtokPortAddress;
|
|
|
|
//
|
|
// Keeps a reference count on the current number of uses of
|
|
// this adapter block. Uses is defined to be the number of
|
|
// routines currently within the "external" interface.
|
|
//
|
|
UINT References;
|
|
|
|
//
|
|
// List head for all open bindings for this adapter.
|
|
//
|
|
LIST_ENTRY OpenBindings;
|
|
|
|
//
|
|
// List head for all opens that had outstanding references
|
|
// when an attempt was made to close them.
|
|
//
|
|
LIST_ENTRY CloseList;
|
|
|
|
//
|
|
// List head for all opens that were attempted to be closed
|
|
// during a reset.
|
|
LIST_ENTRY CloseDuringResetList;
|
|
|
|
//
|
|
// Spinlock to protect fields in this structure..
|
|
//
|
|
NDIS_SPIN_LOCK Lock;
|
|
|
|
//
|
|
// Handle given by NDIS when the MAC registered itself.
|
|
//
|
|
NDIS_HANDLE NdisMacHandle;
|
|
|
|
//
|
|
// Handle given by NDIS when the adapter was registered.
|
|
//
|
|
NDIS_HANDLE NdisAdapterHandle;
|
|
|
|
//
|
|
// Pointer to the filter database for the MAC.
|
|
//
|
|
PTR_FILTER FilterDB;
|
|
|
|
//
|
|
// Holds queued Pending operations.
|
|
//
|
|
PIBMTOK_PEND_DATA PendQueue;
|
|
|
|
//
|
|
// Last pending operation on queue.
|
|
//
|
|
PIBMTOK_PEND_DATA EndOfPendQueue;
|
|
|
|
//
|
|
// Pointer to the pended operation that is currently executing.
|
|
//
|
|
PIBMTOK_PEND_DATA PendData;
|
|
|
|
//
|
|
// The current packet filter.
|
|
//
|
|
UINT CurrentPacketFilter;
|
|
|
|
//
|
|
// The old packet filter (in case of failure to set to a new filter).
|
|
//
|
|
UINT OldPacketFilter;
|
|
|
|
//
|
|
// The current functional address requested.
|
|
//
|
|
TR_FUNCTIONAL_ADDRESS CurrentFunctionalAddress;
|
|
|
|
//
|
|
// The functional address on the card (may differ
|
|
// from CurrentFunctionalAddress if ALL_MULTICAST
|
|
// is selected).
|
|
//
|
|
TR_FUNCTIONAL_ADDRESS CurrentCardFunctional;
|
|
|
|
//
|
|
// The current group address requested.
|
|
//
|
|
TR_FUNCTIONAL_ADDRESS CurrentGroupAddress;
|
|
|
|
//
|
|
// The group address on the card
|
|
//
|
|
TR_FUNCTIONAL_ADDRESS CurrentCardGroup;
|
|
|
|
//
|
|
// The address that the MMIO is mapped to.
|
|
//
|
|
PUCHAR MmioRegion;
|
|
|
|
//
|
|
// The address that the Shared RAM is mapped to.
|
|
//
|
|
PUCHAR SharedRam;
|
|
|
|
//
|
|
// Initial offset of WRB in Shared RAM (contains location
|
|
// of bring-up SRB).
|
|
//
|
|
USHORT InitialWrbOffset;
|
|
|
|
//
|
|
// Addresses of the Shared RAM structures.
|
|
//
|
|
PVOID SrbAddress;
|
|
PVOID SsbAddress;
|
|
PVOID ArbAddress;
|
|
PVOID AsbAddress;
|
|
|
|
//
|
|
// For Shared RAM Paging mode, the SRPR Low value needed
|
|
// to talk to each of the Shared RAM structures.
|
|
//
|
|
UCHAR SrbSrprLow;
|
|
UCHAR SsbSrprLow;
|
|
UCHAR ArbSrprLow;
|
|
UCHAR AsbSrprLow;
|
|
|
|
//
|
|
// Is the SRB available.
|
|
//
|
|
BOOLEAN SrbAvailable;
|
|
|
|
//
|
|
// Is the ASB available.
|
|
//
|
|
BOOLEAN AsbAvailable;
|
|
|
|
//
|
|
// The next correlator number which we think we should
|
|
// be completing the send for.
|
|
//
|
|
UCHAR NextCorrelatorToComplete;
|
|
|
|
//
|
|
// Points to the packet being transmitted if TransmitInSrb
|
|
// is TRUE.
|
|
//
|
|
PNDIS_PACKET TransmittingPacket;
|
|
|
|
//
|
|
// The receive buffer that is waiting for the ASB.
|
|
//
|
|
SRAM_PTR ReceiveWaitingForAsbList;
|
|
|
|
//
|
|
// A SRAM_PTR to the last receive buffer waiting for
|
|
// the ASB to indicate completion.
|
|
//
|
|
SRAM_PTR ReceiveWaitingForAsbEnd;
|
|
|
|
|
|
//
|
|
// The receive buffer that the transfer data should
|
|
// begin at (used during receive indications).
|
|
//
|
|
SRAM_PTR IndicatedReceiveBuffer;
|
|
|
|
//
|
|
// Length of the header for this received indication.
|
|
//
|
|
USHORT IndicatedHeaderLength;
|
|
|
|
//
|
|
// Should the ASB be used for a receive next.
|
|
//
|
|
BOOLEAN UseNextAsbForReceive;
|
|
|
|
//
|
|
// The number of transmit buffers.
|
|
//
|
|
USHORT NumberOfTransmitBuffers;
|
|
|
|
//
|
|
// The size of the transmit buffers.
|
|
//
|
|
USHORT TransmitBufferLength;
|
|
|
|
//
|
|
// The size of the maximum packet transmittable.
|
|
//
|
|
UINT MaxTransmittablePacket;
|
|
|
|
//
|
|
// The number of receive buffers.
|
|
//
|
|
USHORT NumberOfReceiveBuffers;
|
|
|
|
//
|
|
// The size of the receive buffers.
|
|
//
|
|
USHORT ReceiveBufferLength;
|
|
|
|
//
|
|
// Pointers to the first and last packets at a particular stage
|
|
// of allocation. All packets in transmit are linked
|
|
// via there next field.
|
|
//
|
|
// Can only be accessed when the adapter lock
|
|
// is held.
|
|
//
|
|
PNDIS_PACKET FirstTransmit;
|
|
PNDIS_PACKET LastTransmit;
|
|
|
|
PNDIS_PACKET FirstWaitingForAsb;
|
|
PNDIS_PACKET LastWaitingForAsb;
|
|
|
|
//
|
|
// Holds counter return by DLC.STATISTICS command.
|
|
//
|
|
|
|
UINT FramesTransmitted;
|
|
UINT FramesReceived;
|
|
UINT FrameTransmitErrors;
|
|
UINT FrameReceiveErrors;
|
|
|
|
|
|
//
|
|
// Holds counter returned by the DIR.READ.LOG command.
|
|
//
|
|
UINT LineErrors;
|
|
UINT InternalErrors;
|
|
UINT BurstErrors;
|
|
UINT AcErrors;
|
|
UINT AbortDelimeters;
|
|
UINT LostFrames;
|
|
UINT ReceiveCongestionCount;
|
|
UINT FrameCopiedErrors;
|
|
UINT FrequencyErrors;
|
|
UINT TokenErrors;
|
|
|
|
//
|
|
// Holds number of different types of RING.STATUS.CHANGE
|
|
// indications.
|
|
//
|
|
UINT SignalLoss;
|
|
UINT HardError;
|
|
UINT SoftError;
|
|
UINT TransmitBeacon;
|
|
UINT LobeWireFault;
|
|
UINT AutoRemovalError;
|
|
UINT RemoveReceived;
|
|
UINT CounterOverflow;
|
|
UINT SingleStation;
|
|
UINT RingRecovery;
|
|
|
|
//
|
|
// Last ring status indicated to protocols.
|
|
//
|
|
NDIS_STATUS LastNotifyStatus;
|
|
|
|
//
|
|
// Current state of the ring.
|
|
//
|
|
NDIS_802_5_RING_STATE CurrentRingState;
|
|
|
|
//
|
|
// Flag that when enabled lets routines know that a reset
|
|
// is in progress.
|
|
//
|
|
BOOLEAN ResetInProgress;
|
|
|
|
//
|
|
// The progress of the reset.
|
|
//
|
|
UINT CurrentResetStage;
|
|
|
|
//
|
|
// LookAhead information
|
|
//
|
|
|
|
ULONG LookAhead;
|
|
|
|
//
|
|
// TRUE when the ISR is expecting the next interrupt to
|
|
// be the one following adapter reset.
|
|
//
|
|
BOOLEAN ResetInterruptAllowed;
|
|
|
|
//
|
|
// TRUE when ISR gets the reset interrupt.
|
|
//
|
|
BOOLEAN ResetInterruptHasArrived;
|
|
|
|
//
|
|
// Pointer to the binding that initiated the reset. This
|
|
// will be null if the reset is initiated by the MAC itself.
|
|
//
|
|
struct _IBMTOK_OPEN *ResettingOpen;
|
|
|
|
//
|
|
// Will be true the first time that the hardware is initialized
|
|
// by the driver initialization.
|
|
//
|
|
BOOLEAN FirstInitialization;
|
|
|
|
//
|
|
// Will be true if the adapter is not yet opened.
|
|
//
|
|
BOOLEAN AdapterNotOpen;
|
|
|
|
//
|
|
// Will be true if the driver is being opened.
|
|
//
|
|
BOOLEAN OpenInProgress;
|
|
|
|
//
|
|
// TRUE if ResetInProgress or OpenInProgress is TRUE.
|
|
//
|
|
BOOLEAN NotAcceptingRequests;
|
|
|
|
//
|
|
// Last Error Code.
|
|
//
|
|
USHORT OpenErrorCode;
|
|
|
|
//
|
|
// TRUE if we get a ring status indicating the cable is unplugged.
|
|
//
|
|
BOOLEAN Unplugged;
|
|
|
|
//
|
|
// TRUE if we are doing a reset after the cable was unplugged
|
|
// to try to reenter the ring.
|
|
//
|
|
BOOLEAN UnpluggedResetInProgress;
|
|
|
|
//
|
|
// TRUE if we have gotten a lobe wire fault indication,
|
|
// meaning the adapter is closed.
|
|
//
|
|
BOOLEAN LobeWireFaultIndicated;
|
|
|
|
//
|
|
// TRUE if there exists an outstanding ASB_FREE_REQUEST
|
|
//
|
|
BOOLEAN OutstandingAsbFreeRequest;
|
|
|
|
//
|
|
// The command correlator array (put this at the end since
|
|
// it is so big).
|
|
//
|
|
PNDIS_PACKET CorrelatorArray[MAX_COMMAND_CORRELATOR];
|
|
|
|
//
|
|
// IBM_TOKEN_RING_16_4_CREDIT_CARD_ADAPTER specific
|
|
// keywords
|
|
//
|
|
UINT RingSpeed;
|
|
ULONG Ram;
|
|
UINT RamSize;
|
|
ULONG MmioAddress;
|
|
BOOLEAN InvalidValue;
|
|
BOOLEAN RingSpeedListen;
|
|
ULONG RingSpeedRetries;
|
|
|
|
} IBMTOK_ADAPTER,*PIBMTOK_ADAPTER;
|
|
|
|
|
|
//
|
|
// Given a MacBindingHandle this macro returns a pointer to the
|
|
// IBMTOK_ADAPTER.
|
|
//
|
|
#define PIBMTOK_ADAPTER_FROM_BINDING_HANDLE(Handle) \
|
|
(((PIBMTOK_OPEN)((PVOID)(Handle)))->OwningIbmtok)
|
|
|
|
|
|
//
|
|
// Given a MacContextHandle return the PIBMTOK_ADAPTER
|
|
// it represents.
|
|
//
|
|
#define PIBMTOK_ADAPTER_FROM_CONTEXT_HANDLE(Handle) \
|
|
((PIBMTOK_ADAPTER)((PVOID)(Handle)))
|
|
|
|
|
|
//
|
|
// Given a pointer to a IBMTOK_ADAPTER return the
|
|
// proper MacContextHandle.
|
|
//
|
|
#define CONTEXT_HANDLE_FROM_PIBMTOK_ADAPTER(Ptr) \
|
|
((NDIS_HANDLE)((PVOID)(Ptr)))
|
|
|
|
|
|
//
|
|
// One of these structures is created on each MacOpenAdapter.
|
|
//
|
|
typedef struct _IBMTOK_OPEN {
|
|
|
|
//
|
|
// Linking structure for all of the open bindings of a particular
|
|
// adapter.
|
|
//
|
|
LIST_ENTRY OpenList;
|
|
|
|
//
|
|
// The Adapter that requested this open binding.
|
|
//
|
|
PIBMTOK_ADAPTER OwningIbmtok;
|
|
|
|
//
|
|
// Handle of this adapter in the filter database.
|
|
//
|
|
NDIS_HANDLE NdisFilterHandle;
|
|
|
|
//
|
|
// Given by NDIS when the adapter was opened.
|
|
//
|
|
NDIS_HANDLE NdisBindingContext;
|
|
|
|
//
|
|
// Counter of all the different reasons that a open binding
|
|
// couldn't be closed. This would be incremented each time
|
|
// for:
|
|
//
|
|
// While a particular interface routine is accessing this open
|
|
//
|
|
// During an indication.
|
|
//
|
|
// When the open causes a reset.
|
|
//
|
|
// A packet currently being sent.
|
|
//
|
|
// (Basically the above two mean any time the open has left
|
|
// some processing around to be accomplished later.)
|
|
//
|
|
// This field should only be accessed when the adapter lock is held.
|
|
//
|
|
UINT References;
|
|
|
|
//
|
|
// Minimum Number of bytes for a lookahead.
|
|
//
|
|
UINT LookAhead;
|
|
|
|
//
|
|
// A flag indicating that the open has pended.
|
|
//
|
|
BOOLEAN OpenPending;
|
|
|
|
//
|
|
// A flag indicating that this binding is in the process of closing.
|
|
//
|
|
BOOLEAN BindingShuttingDown;
|
|
|
|
|
|
//
|
|
// A bogus NdisRequest to queue operations during a close.
|
|
//
|
|
NDIS_REQUEST CloseRequestChangeFilter;
|
|
NDIS_REQUEST CloseRequestChangeAddress;
|
|
NDIS_REQUEST CloseRequestChangeGroupAddress;
|
|
|
|
} IBMTOK_OPEN,*PIBMTOK_OPEN;
|
|
|
|
|
|
//
|
|
// procedures which do error logging
|
|
//
|
|
|
|
typedef enum _IBMTOK_PROC_ID{
|
|
registerAdapter,
|
|
openAdapter,
|
|
hardwareDetails,
|
|
handleResetStaging,
|
|
handleSrbSsb,
|
|
startPendQueueOp,
|
|
finishPendQueueOp,
|
|
handleDeferred,
|
|
ibmtokDpc
|
|
}IBMTOK_PROC_ID;
|
|
|
|
//
|
|
// Error log values
|
|
//
|
|
|
|
#define IBMTOK_ERRMSG_NOT_FOUND (ULONG)0x01
|
|
#define IBMTOK_ERRMSG_CREATE_DB (ULONG)0x02
|
|
#define IBMTOK_ERRMSG_INIT_INTERRUPT (ULONG)0x03
|
|
#define IBMTOK_ERRMSG_OPEN_DB (ULONG)0x04
|
|
#define IBMTOK_ERRMSG_ALLOC_MEM (ULONG)0x05
|
|
#define IBMTOK_ERRMSG_UNSUPPORTED_RAM (ULONG)0x06
|
|
#define IBMTOK_ERRMSG_BRINGUP_FAILURE (ULONG)0x07
|
|
#define IBMTOK_ERRMSG_INVALID_CMD (ULONG)0x08
|
|
#define IBMTOK_ERRMSG_BAD_OP (ULONG)0x09
|
|
#define IBMTOK_ERRMSG_INVALID_STATUS (ULONG)0x0A
|
|
#define IBMTOK_ERRMSG_INVALID_STATE (ULONG)0x0B
|
|
#define IBMTOK_ERRMSG_ISRP_LOW_ERROR (ULONG)0x0C
|
|
|
|
//
|
|
// This macro returns a pointer to a PIBMTOK_OPEN given a MacBindingHandle.
|
|
//
|
|
#define PIBMTOK_OPEN_FROM_BINDING_HANDLE(Handle) \
|
|
((PIBMTOK_OPEN)((PVOID)Handle))
|
|
|
|
|
|
//
|
|
// This macro returns a NDIS_HANDLE from a PIBMTOK_OPEN
|
|
//
|
|
#define BINDING_HANDLE_FROM_PIBMTOK_OPEN(Open) \
|
|
((NDIS_HANDLE)((PVOID)Open))
|
|
|
|
|
|
//
|
|
// This macro will act a "epilogue" to every routine in the
|
|
// *interface*. It will check whether there any requests needed
|
|
// to defer there processing. It will also decrement the reference
|
|
// count on the adapter. If the reference count is zero and there
|
|
// is deferred work to do it will insert the interrupt processing
|
|
// routine in the DPC queue.
|
|
//
|
|
// Note that we don't need to include checking for blocked receives
|
|
// since blocked receives imply that there will eventually be an
|
|
// interrupt.
|
|
//
|
|
// NOTE: This macro assumes that it is called with the lock acquired.
|
|
//
|
|
#define IBMTOK_DO_DEFERRED(Adapter) \
|
|
{ \
|
|
PIBMTOK_ADAPTER _A = (Adapter); \
|
|
_A->References--; \
|
|
if ((!_A->References) && \
|
|
(_A->ResetInProgress || \
|
|
(!IsListEmpty(&_A->CloseList)))) { \
|
|
IbmtokHandleDeferred(_A); \
|
|
NdisReleaseSpinLock(&_A->Lock); \
|
|
} else { \
|
|
NdisReleaseSpinLock(&_A->Lock); \
|
|
} \
|
|
}
|
|
|
|
|
|
//++
|
|
//
|
|
// VOID
|
|
// SET_INTERRUPT_RESET_FLAG(
|
|
// IN PIBMTOK_ADAPTER Adapter,
|
|
// )
|
|
//
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This routine uses NdisSynchronizeWithInterrupt to call the
|
|
// IbmtokSynchSetReset, which sets the ResetInterruptAllowed
|
|
// flag in the adapter structure. This is set after the
|
|
// adapter is reset to allow the interrupt indicating the
|
|
// end of the reset to come through (since all others
|
|
// should be blocked during the reset).
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Adapter - The adapter to set the flag for.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
#define SET_INTERRUPT_RESET_FLAG(A) \
|
|
{ \
|
|
PIBMTOK_ADAPTER _A = A; \
|
|
NdisSynchronizeWithInterrupt( \
|
|
&_A->Interrupt, \
|
|
(PVOID) IbmtokSynchSetReset, \
|
|
(PVOID)_A \
|
|
); \
|
|
}
|
|
|
|
|
|
//
|
|
// This macro is to clear the SRB/SSB and ARB/ASB bits
|
|
// used by the interrupt handlers.
|
|
//
|
|
|
|
#define CLEAR_ISRP_BITS(A) \
|
|
{ \
|
|
PIBMTOK_ADAPTER _A = A; \
|
|
NdisSynchronizeWithInterrupt( \
|
|
&_A->Interrupt, \
|
|
(PVOID) IbmtokSynchClearIsrpBits, \
|
|
(PVOID)_A \
|
|
); \
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// VOID
|
|
// IbmtokProcessSrbRequests(
|
|
// IN PIBMTOK_ADAPTER Adapter
|
|
// )
|
|
// /*++
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// Check if the SRB is available, if so queue the next
|
|
// request on it. Preferably, it is called when it is known
|
|
// that there is something on the queue.
|
|
//
|
|
// NOTE: THIS IS CALLED WITH THE LOCK HELD!!!
|
|
//
|
|
// NOTE: THIS MUST BE CALLED WITH Adapter->SrbAvailable == TRUE !!!!!
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Adapter - The Adapter to process interrupts for.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
// --*/
|
|
//
|
|
|
|
#define IbmtokProcessSrbRequests(_Adapter) \
|
|
{ \
|
|
if (_Adapter->SrbAvailable) { \
|
|
(_Adapter)->SrbAvailable = FALSE;\
|
|
SetupSrbCommand(_Adapter); \
|
|
} \
|
|
}
|
|
|
|
|
|
// VOID
|
|
// PutPacketInCorrelatorArray(
|
|
// IN PIBMTOK_ADAPTER Adapter,
|
|
// IN PNDIS_PACKET Packet
|
|
// )
|
|
//
|
|
// /*++
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This inserts a packet in the correlator array, based
|
|
// on the value of its command correlator.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Adapter - The adapter that this packet is coming through.
|
|
//
|
|
// Packet - The packet that is to be inserted.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
// --*/
|
|
//
|
|
#define PutPacketInCorrelatorArray( _Adapter, _Packet) \
|
|
{ \
|
|
PIBMTOK_RESERVED _Reserved = PIBMTOK_RESERVED_FROM_PACKET(_Packet); \
|
|
ASSERT(_Reserved->CorrelatorAssigned); \
|
|
ASSERT((_Adapter)->CorrelatorArray[_Reserved->CommandCorrelator] == (PNDIS_PACKET)NULL); \
|
|
(_Adapter)->CorrelatorArray[_Reserved->CommandCorrelator] = (_Packet); \
|
|
}
|
|
|
|
|
|
|
|
// STATIC
|
|
// VOID
|
|
// RemovePacketFromCorrelatorArray(
|
|
// IN PIBMTOK_ADAPTER Adapter,
|
|
// IN PNDIS_PACKET Packet
|
|
// )
|
|
//
|
|
// /*++
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This deletes a packet in the correlator array, based
|
|
// on the value of its command correlator.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Adapter - The adapter that this packet is coming through.
|
|
//
|
|
// Packet - The packet that is to be removed.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
// --*/
|
|
//
|
|
#define RemovePacketFromCorrelatorArray(_Adapter, _Packet) \
|
|
{ \
|
|
PIBMTOK_RESERVED _Reserved = PIBMTOK_RESERVED_FROM_PACKET(_Packet); \
|
|
ASSERT(_Reserved->CorrelatorAssigned); \
|
|
_Reserved->CorrelatorAssigned = FALSE; \
|
|
(_Adapter)->CorrelatorArray[_Reserved->CommandCorrelator] = (PNDIS_PACKET)NULL; \
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
// We define the external interfaces to the ibmtok driver.
|
|
// These routines are only external to permit separate
|
|
// compilation. Given a truely fast compiler they could
|
|
// all reside in a single file and be static.
|
|
//
|
|
|
|
|
|
extern
|
|
VOID
|
|
IbmtokAdjustMaxLookAhead(
|
|
IN PIBMTOK_ADAPTER Adapter
|
|
);
|
|
|
|
|
|
extern
|
|
VOID
|
|
IbmtokDPC(
|
|
IN PVOID SystemSpecific1,
|
|
IN PVOID Context,
|
|
IN PVOID SystemArgument1,
|
|
IN PVOID SystemArgument2
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
SetupSrbCommand(
|
|
IN PIBMTOK_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
IbmtokWakeUpDpc(
|
|
IN PVOID SystemSpecific1,
|
|
IN PVOID Context,
|
|
IN PVOID SystemArgument1,
|
|
IN PVOID SystemArgument2
|
|
);
|
|
|
|
extern
|
|
BOOLEAN
|
|
IbmtokISR(
|
|
IN PVOID Context
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
IbmtokHandleDeferred(
|
|
IN PIBMTOK_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
IbmtokSetPacketFilter(
|
|
IN PIBMTOK_ADAPTER Adapter,
|
|
IN PIBMTOK_OPEN Open,
|
|
IN PNDIS_REQUEST NdisRequest,
|
|
IN UINT PacketFilter
|
|
);
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
IbmtokChangeFunctionalAddress(
|
|
IN PIBMTOK_ADAPTER Adapter,
|
|
IN PIBMTOK_OPEN Open,
|
|
IN PNDIS_REQUEST NdisRequest,
|
|
IN PUCHAR Address
|
|
);
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
IbmtokFillInGlobalData(
|
|
IN PIBMTOK_ADAPTER Adapter,
|
|
IN PNDIS_REQUEST NdisRequest
|
|
);
|
|
|
|
|
|
extern
|
|
VOID
|
|
IbmtokForceAdapterInterrupt(
|
|
IN PIBMTOK_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
IbmtokSetupForReset(
|
|
IN PIBMTOK_ADAPTER Adapter,
|
|
IN PIBMTOK_OPEN Open
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
IbmtokStartAdapterReset(
|
|
IN PIBMTOK_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
IbmtokFinishAdapterReset(
|
|
IN PIBMTOK_ADAPTER Adapter
|
|
);
|
|
|
|
extern
|
|
BOOLEAN
|
|
IbmtokSynchSetReset(
|
|
IN PVOID Context
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
IbmtokAbortPending(
|
|
IN PIBMTOK_ADAPTER Adapter,
|
|
IN NDIS_STATUS AbortStatus
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
IbmtokAbortSends(
|
|
IN PIBMTOK_ADAPTER Adapter,
|
|
IN NDIS_STATUS AbortStatus
|
|
);
|
|
|
|
extern
|
|
BOOLEAN
|
|
IbmtokSynchClearIsrpBits(
|
|
IN PVOID Context
|
|
);
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
IbmtokTransferData(
|
|
IN NDIS_HANDLE MacBindingHandle,
|
|
IN NDIS_HANDLE MacReceiveContext,
|
|
IN UINT ByteOffset,
|
|
IN UINT BytesToTransfer,
|
|
OUT PNDIS_PACKET Packet,
|
|
OUT PUINT BytesTransferred
|
|
);
|
|
|
|
extern
|
|
NDIS_STATUS
|
|
IbmtokSend(
|
|
IN NDIS_HANDLE MacBindingHandle,
|
|
IN PNDIS_PACKET Packet
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
IbmtokCopyFromPacketToBuffer(
|
|
IN PNDIS_PACKET Packet,
|
|
IN UINT Offset,
|
|
IN UINT BytesToCopy,
|
|
OUT PCHAR Buffer,
|
|
OUT PUINT BytesCopied
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
IbmtokCopyFromBufferToPacket(
|
|
IN PCHAR Buffer,
|
|
IN UINT BytesToCopy,
|
|
IN PNDIS_PACKET Packet,
|
|
IN UINT Offset,
|
|
OUT PUINT BytesCopied
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
IbmtokCopyFromPacketToPacket(
|
|
IN PNDIS_PACKET Destination,
|
|
IN UINT DestinationOffset,
|
|
IN UINT BytesToCopy,
|
|
IN PNDIS_PACKET Source,
|
|
IN UINT SourceOffset,
|
|
OUT PUINT BytesCopied
|
|
);
|
|
|
|
extern
|
|
VOID
|
|
IbmtokShutdown(
|
|
IN PVOID ShutdownContext
|
|
);
|
|
|
|
#endif // _IBMTOKSFT_
|
|
|