summaryrefslogtreecommitdiffstats
path: root/private/ntos/ndis/ibmtok2i/tok162hw.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/ntos/ndis/ibmtok2i/tok162hw.h1382
1 files changed, 1382 insertions, 0 deletions
diff --git a/private/ntos/ndis/ibmtok2i/tok162hw.h b/private/ntos/ndis/ibmtok2i/tok162hw.h
new file mode 100644
index 000000000..d0cf26ab3
--- /dev/null
+++ b/private/ntos/ndis/ibmtok2i/tok162hw.h
@@ -0,0 +1,1382 @@
+/*++
+
+Copyright (c) 1990 Microsoft Corporation
+
+Module Name:
+
+ tokhrd.h
+
+Abstract:
+
+ The hardware-related definitions for the IBM Token-Ring 16/4 II
+ ISA driver.
+
+Author:
+
+ Kevin Martin (kevinma) 1-Feb-1994
+
+Environment:
+
+ Architecturally, there is an assumption in this driver that we are
+ on a little endian machine.
+
+Notes:
+
+ References to "IBM Spec" refer to the IBM "Supplement to the LAN
+ Technical Reference (Token-Ring Network 16/4 Adapter II)" Specification.
+ The document number is - SD21-052-00.
+
+ References to "TI Spec" refer to the Texas Instruments "TMS380 Second-
+ Generation Token Ring" User's Guide. The document number is - SPWU005.
+
+Revision History:
+
+--*/
+
+//
+// Pack everything on word boundaries
+//
+#include <pshpack2.h>
+
+//
+// Define "Physical Addresses" which are ULONG in size. The card
+// wants physical addresses.
+//
+typedef ULONG TOK162_PHYSICAL_ADDRESS, *PTOK162_PHYSICAL_ADDRESS;
+
+
+//
+// The length of an address (network) is 6 bytes
+//
+#define TOK162_LENGTH_OF_ADDRESS 6
+
+//
+// Define a NULL pointer
+//
+#define TOK162_NULL ((TOK162_PHYSICAL_ADDRESS)(-1L))
+
+//
+// Default number of command blocks
+//
+#define TOK162_NUMBER_OF_CMD_BLOCKS 4
+
+//
+// Burst size for transmit and receive DMA. A zero tells the adapter to
+// use the size of the transfer as the burst size.
+//
+// IBM Spec, Page 21
+
+#define TOK162_BURST_SIZE 0
+
+//
+// Number of retries to attempt after a DMA error
+//
+#define TOK162_DMA_RETRIES 0x0303
+
+//
+// Minimum packet size for a valid transfer/receive
+//
+#define MINIMUM_TOKENRING_PACKET_SIZE 32
+
+//
+// Default packet header size
+//
+#define TOK162_HEADER_SIZE 32
+
+//
+// TOK162 Receive/Command Block States
+//
+#define TOK162_STATE_FREE ((USHORT)0x0000)
+#define TOK162_STATE_EXECUTING ((USHORT)0x0001)
+#define TOK162_STATE_WAIT_FOR_ADAPTER ((USHORT)0x0002)
+
+//
+// Start of I/O ports based on switch settings.
+//
+// IBM Spec, Page 9.
+//
+#define BASE_OPTION_ZERO 0x86A0
+#define BASE_OPTION_ONE 0xC6A0
+#define BASE_OPTION_TWO 0xA6A0
+#define BASE_OPTION_THREE 0xE6A0
+#define BASE_OPTION_FOUR 0x96A0
+#define BASE_OPTION_FIVE 0xD6A0
+#define BASE_OPTION_SIX 0xB6A0
+#define BASE_OPTION_SEVEN 0xF6A0
+
+//
+// Offsets from above of the actual ports used.
+//
+// IBM Spec, Page 4.
+//
+#define PORT_OFFSET_DATA 0x0000
+#define PORT_OFFSET_DATA_AUTO_INC 0x0002
+#define PORT_OFFSET_ADDRESS 0x0004
+#define PORT_OFFSET_STATUS 0x0006
+#define PORT_OFFSET_COMMAND 0x0006
+#define PORT_OFFSET_ADAPTER_RESET 0x0008
+#define PORT_OFFSET_ADAPTER_ENABLE 0x000A
+#define PORT_OFFSET_SWITCH_INT_DISABLE 0x000C
+#define PORT_OFFSET_SWITCH_INT_ENABLE 0x000E
+
+//
+// Macro to write a ULONG variable to a register on the adapter
+//
+#define WRITE_ADAPTER_ULONG(a, p, v) \
+ NdisRawWritePortUshort((ULONG) (a)->PortIOAddress + (p), \
+ (ULONG) (v))
+
+//
+// Macro to read a ULONG variable from a register on the adapter
+//
+#define READ_ADAPTER_ULONG(a, p, v) \
+ NdisRawReadPortUshort((ULONG) (a)->PortIOAddress + (p), \
+ (PULONG) (v))
+
+//
+// Macro to write a USHORT variable to a register on the adapter
+//
+#define WRITE_ADAPTER_USHORT(a, p, v) \
+ NdisRawWritePortUshort((ULONG) (a)->PortIOAddress + (p), \
+ (USHORT) (v))
+
+//
+// Macro to read a USHORT variable from a register on the adapter
+//
+#define READ_ADAPTER_USHORT(a, p, v) \
+ NdisRawReadPortUshort((ULONG) (a)->PortIOAddress + (p), \
+ (PUSHORT) (v))
+
+//
+// Macro to write a CHAR variable to a register on the adapter
+//
+#define WRITE_ADAPTER_UCHAR(a, p, v) \
+ NdisRawWritePortUchar((ULONG)(a)->PortIOAddress + (p), \
+ (UCHAR)(v))
+
+//
+// Macro to read a ULONG variable from a register on the adapter
+//
+#define READ_ADAPTER_UCHAR(a, p, v) \
+ NdisRawReadPortUchar((ULONG)(a)->PortIOAddress + (p), \
+ (PUCHAR)(v))
+
+//
+// Masks for the command register
+//
+// IBM Spec, Pages 5-6.
+//
+#define CMD_PIO_INTERRUPT 0x8000
+#define CMD_PIO_RESET 0x4000
+#define CMD_PIO_SSB_CLEAR 0x2000
+#define CMD_PIO_EXECUTE 0x1000
+#define CMD_PIO_SCB_REQUEST 0x0800
+#define CMD_PIO_RCV_CONTINUE 0x0400
+#define CMD_PIO_RCV_VALID 0x0200
+#define CMD_PIO_XMIT_VALID 0x0100
+#define CMD_PIO_RESET_SYSTEM 0x0080
+
+//
+// Common mask combinations
+//
+#define EXECUTE_SCB_COMMAND 0x9080 // int+exec+resetsysint
+#define ENABLE_SSB_UPDATE 0xA000 // int+ssbclear
+#define ENABLE_RECEIVE_VALID 0x8200 // int+rcvvalid
+
+//
+// Masks for the status register.
+//
+// IBM Spec, Pages 6-7.
+//
+#define STATUS_ADAPTER_INTERRUPT 0x8000
+#define STATUS_SYSTEM_INTERRUPT 0x0080
+
+//
+// Masks for adapter interrupts.
+//
+// IBM Spec, Page 7.
+//
+#define STATUS_INT_CODE_MASK 0x000F
+#define STATUS_INT_CODE_CHECK 0x0000
+#define STATUS_INT_CODE_IMPL 0x0002
+#define STATUS_INT_CODE_RING 0x0004
+#define STATUS_INT_CODE_SCB_CLEAR 0x0006
+#define STATUS_INT_CODE_CMD_STATUS 0x0008
+#define STATUS_INT_CODE_RECEIVE_STATUS 0x000A
+#define STATUS_INT_CODE_XMIT_STATUS 0x000C
+
+//
+// My Mask for System Interrupts
+//
+#define MASK_ADAPTER_CHECK 0x0001
+#define MASK_RING_STATUS 0x0002
+#define MASK_SCB_CLEAR 0x0004
+#define MASK_COMMAND_STATUS 0x0008
+#define MASK_RECEIVE_STATUS 0x0010
+#define MASK_TRANSMIT_STATUS 0x0020
+
+
+//
+// Adapter switch structure. The switches determine the configuration of the
+// card.
+//
+// IBM Spec, Page 8.
+//
+typedef struct _ADAPTERSWITCHES {
+
+ //
+ // Connector Type.
+ //
+ USHORT UTP_STP:1;
+
+ //
+ // Token Ring Speed
+ //
+ USHORT RingSpeed:1;
+
+ //
+ // DMA Channel
+ //
+ USHORT DMA:2;
+
+ //
+ // Is Remote Program Load enabled?
+ //
+ USHORT RPL:1;
+
+ //
+ // Adapter mode, test or normal
+ //
+ USHORT AdapterMode:1;
+
+ //
+ // Adapter wait state
+ //
+ USHORT WaitState:1;
+
+ //
+ // Interrupt Request Level
+ //
+ USHORT IntRequest:2;
+
+ //
+ // RPL address (if RPL enabled) or adapter I/O base address
+ //
+ USHORT RPL_PIO_Address:3;
+
+ //
+ // Not used.
+ //
+ USHORT Reserved:4;
+} ADAPTERSWITCHES,*PADAPTERSWITCHES;
+
+//
+// #defines for the I/O Address switches
+//
+// IBM Spec, Page 9.
+//
+#define SW_PIO_ADDR_8 0x00
+#define SW_PIO_ADDR_C 0x01
+#define SW_PIO_ADDR_A 0x02
+#define SW_PIO_ADDR_E 0x03
+#define SW_PIO_ADDR_9 0x04
+#define SW_PIO_ADDR_D 0x05
+#define SW_PIO_ADDR_B 0x06
+#define SW_PIO_ADDR_F 0x07
+
+//
+// #defines for the interrupt request level
+//
+// IBM Spec, Page 9.
+//
+#define SW_INT_9 0x00
+#define SW_INT_11 0x01
+#define SW_INT_10 0x02
+#define SW_INT_15 0x03
+
+//
+// #defines for the wait state.
+//
+// IBM Spec, Page 9.
+//
+#define SW_WAITSTATE_NORMAL 0x00
+#define SW_WAITSTATE_FAST 0x01
+
+//
+// #defines for the adapter mode.
+//
+// IBM Spec, Page 10.
+//
+#define SW_ADAPTERMODE_NORMAL 0x00
+#define SW_ADAPTERMODE_TEST 0x01
+
+//
+// #defines for RPL
+//
+// IBM Spec, Page 10.
+//
+#define SW_RPL_DISABLE 0x00
+#define SW_RPL_ENABLE 0x01
+
+//
+// #defines for the DMA channel
+//
+// IBM Spec, Page 10.
+//
+#define SW_DMA_5 0x00
+#define SW_DMA_7 0x01
+#define SW_DMA_6 0x02
+
+//
+// #defines for the ring speed.
+//
+// IBM Spec, Page 10.
+//
+#define SW_RINGSPEED_4 0x00
+#define SW_RINGSPEED_16 0x01
+
+//
+// #defines for the connector interface.
+//
+// IBM Spec, Page 10.
+//
+#define SW_STP 0x00
+#define SW_UTP 0x01
+
+//
+// DMA Command Values
+//
+// IBM Spec, Page 25.
+//
+#define CMD_DMA_OPEN 0x0300
+#define CMD_DMA_XMIT 0x0400
+#define CMD_DMA_XMIT_HALT 0x0500
+#define CMD_DMA_RCV 0x0600
+#define CMD_DMA_CLOSE 0x0700
+#define CMD_DMA_SET_GRP_ADDR 0x0800
+#define CMD_DMA_SET_FUNC_ADDR 0x0900
+#define CMD_DMA_READ_ERRLOG 0x0A00
+#define CMD_DMA_READ 0x0B00
+#define CMD_DMA_IMPL_ENABLE 0x0C00
+#define CMD_DMA_START_STOP_TRACE 0x0D00
+
+//
+// System Command Block structure.
+//
+// IBM Spec, Pages 13-14.
+//
+typedef struct _SCB {
+
+ //
+ // Command to be submitted to the card.
+ //
+ USHORT Command;
+
+ //
+ // Parameter USHORTs, different for different commands.
+ //
+ USHORT Parm1;
+ USHORT Parm2;
+
+} SCB, *PSCB;
+
+//
+// Generic System Status Block Structure.
+//
+// IBM Spec, Page 15.
+//
+typedef struct _SSB {
+
+ //
+ // Command for which status is returned.
+ //
+ USHORT Command;
+
+ //
+ // Status USHORTs, different for different commands
+ //
+ USHORT Status1;
+ USHORT Status2;
+ USHORT Status3;
+
+} SSB, *PSSB;
+
+//
+// Ring Status SSB #defines and structure
+//
+// IBM Spec, Page 15-16.
+//
+typedef struct _SSB_RING_STATUS {
+
+ //
+ // Command code, will be SSB_CMD_RING_STATUS
+ //
+ USHORT Command;
+
+ //
+ // Ring Status code, as defined below.
+ //
+ USHORT RingStatus;
+
+ //
+ // Last two not used.
+ //
+ USHORT Reserved1;
+ USHORT Reserved2;
+
+} SSB_RING_STATUS,*PSSB_RING_STATUS;
+
+#define SSB_CMD_RING_STATUS 0x0100
+
+#define RING_STATUS_OVERFLOW 0x8000
+#define RING_STATUS_SINGLESTATION 0x4000
+#define RING_STATUS_RINGRECOVERY 0x2000
+#define RING_STATUS_SIGNAL_LOSS 0x0080
+#define RING_STATUS_HARD_ERROR 0x0040
+#define RING_STATUS_SOFT_ERROR 0x0020
+#define RING_STATUS_XMIT_BEACON 0x0010
+#define RING_STATUS_LOBE_WIRE_FAULT 0x0008
+#define RING_STATUS_AUTO_REMOVE_1 0x0004
+#define RING_STATUS_REMOVE_RECEIVED 0x0001
+
+//
+// Command Reject Status SSB #defines and structure
+//
+typedef struct _SSB_CMD_REJECT_STATUS {
+
+ //
+ // Command code, will be SSB_CMD_COMMAND_REJECT_STATUS
+ //
+ USHORT Command;
+
+ //
+ // Reason for rejection, as defined below.
+ //
+ USHORT Reason;
+
+ //
+ // Command that was rejected.
+ //
+ USHORT SCBCommand;
+
+ //
+ // Not used.
+ //
+ USHORT Reserved;
+
+} SSB_CMD_REJECT_STATUS, *PSSB_CMD_REJECT_STATUS;
+
+#define SSB_CMD_COMMAND_REJECT_STATUS 0x0200
+
+#define CMD_REJECT_STATUS_BAD_CMD 0x0080
+#define CMD_REJECT_STATUS_BAD_ADDR 0x0040
+#define CMD_REJECT_STATUS_BAD_OPEN 0x0020
+#define CMD_REJECT_STATUS_BAD_CLOSED 0x0010
+#define CMD_REJECT_STATUS_BAD_SAME 0x0008
+
+//
+// Adapter Check Port information, structure and defines
+//
+// IBM Spec, Pages 18-19.
+//
+
+//
+// Offsets within the adapter memory where the values for the check can
+// be obtained.
+//
+// IBM Spec, Page 18.
+//
+#define ADAPTER_CHECK_PORT_OFFSET_BASE 0x05E0
+#define ADAPTER_CHECK_PORT_OFFSET_PARM0 0x05E2
+#define ADAPTER_CHECK_PORT_OFFSET_PARM1 0x05E4
+#define ADAPTER_CHECK_PORT_OFFSET_PARM2 0x05E6
+
+//
+// Structure that can be used to gather all of the adapter check information.
+//
+typedef struct _ADAPTER_CHECK {
+
+ //
+ // USHORT indicating why the adapter check occurred. Reasons are defined
+ // below.
+ //
+ USHORT Check;
+
+ //
+ // The parameters are used based on the reason above. Please see the spec
+ // as to what the different parameters are for the given reason.
+ //
+ USHORT Parm0;
+ USHORT Parm1;
+ USHORT Parm2;
+
+} ADAPTER_CHECK, *PADAPTER_CHECK;
+
+#define ADAPTER_CHECK_DMA_ABORT_READ 0x4000
+#define ADAPTER_CHECK_DMA_ABORT_WRITE 0x2000
+#define ADAPTER_CHECK_ILLEGAL_OPCODE 0x1000
+#define ADAPTER_CHECK_PARITY_ERR 0x0800
+#define ADAPTER_CHECK_PARITY_ERR_EXT 0x0400
+#define ADAPTER_CHECK_PARITY_ERR_SIM 0x0200 // System Interface Master
+#define ADAPTER_CHECK_PARITY_ERR_PHM 0x0100 // Protocol Handler Master
+#define ADAPTER_CHECK_PARITY_ERR_RR 0x0080 // Ring Receive
+#define ADAPTER_CHECK_PARITY_ERR_RXMT 0x0040 // Ring Transmit
+#define ADAPTER_CHECK_RING_UNDERRUN 0x0020
+#define ADAPTER_CHECK_RING_OVERRUN 0x0010
+#define ADAPTER_CHECK_INVALID_INT 0x0008
+#define ADAPTER_CHECK_INVALID_ERR_INT 0x0004
+#define ADAPTER_CHECK_INVALID_XOP 0x0002
+#define ADAPTER_CHECK_PROGRAM_CHECK 0x0001
+
+//
+// Initialization Structure.
+//
+// IBM Spec, Pages 19-25.
+//
+
+//
+// This structure needs to be packed on a two-byte boundary or the
+// SCB pointer will be off during the loop that sends the initialization
+// bytes to the card.
+//
+
+typedef struct _ADAPTER_INITIALIZATION {
+
+ //
+ // Initialization options as defined below
+ //
+ USHORT Options;
+
+ //
+ // Reserved USHORTs
+ //
+ USHORT Reserved1;
+ USHORT Reserved2;
+ USHORT Reserved3;
+
+ //
+ // Size of DMA bursts on receives
+ //
+ USHORT ReceiveBurstSize;
+
+ //
+ // Size of DMA bursts on transmits
+ //
+ USHORT TransmitBurstSize;
+
+ //
+ // Number of retries on DMA errors before giving up
+ //
+ USHORT DMAAbortThresholds;
+
+ //
+ // Pointer to the SCB (physical pointer), split into two words
+ // because we are writing them to the adaper in words
+ //
+ USHORT SCBHigh;
+ USHORT SCBLow;
+
+ //
+ // Pointer to the SSB (physical pointer), split into words because
+ // we are writing them to the adapter in words
+ //
+ USHORT SSBHigh;
+ USHORT SSBLow;
+
+} ADAPTER_INITIALIZATION, *PADAPTER_INITIALIZATION;
+
+//
+// Initialization options
+//
+#define INIT_OPTIONS_RESERVED 0x8000
+#define INIT_OPTIONS_SCBSSB_BURST 0x1000
+#define INIT_OPTIONS_SCBSSB_CYCLE 0x0000
+#define INIT_OPTIONS_LIST_BURST 0x0800
+#define INIT_OPTIONS_LIST_CYCLE 0x0000
+#define INIT_OPTIONS_LIST_STATUS_BURST 0x0400
+#define INIT_OPTIONS_LIST_STATUS_CYCLE 0x0000
+#define INIT_OPTIONS_RECEIVE_BURST 0x0200
+#define INIT_OPTIONS_RECEIVE_CYCLE 0x0000
+#define INIT_OPTIONS_XMIT_BURST 0x0100
+#define INIT_OPTIONS_XMIT_CYCLE 0x0000
+#define INIT_OPTIONS_SPEED_16 0x0040
+#define INIT_OPTIONS_SPEED_4 0x0000
+#define INIT_OPTIONS_DISABLE_ETR 0x0020
+#define INIT_OPTIONS_ENABLE_ETR 0x0000
+
+//
+// Starting address on card of where to write the init block
+//
+// IBM Spec, Page 22.
+//
+#define INIT_ADAPTER_PORT_OFFSET 0x0200
+
+//
+// Value to write to the command register after the init block has been
+// downloaded.
+//
+#define INIT_ADAPTER_INTERRUPT 0x9080
+
+//
+// Bit masks for initialization results.
+//
+// IBM Spec, Page 23.
+//
+#define STATUS_INIT_INITIALIZE 0x0040
+#define STATUS_INIT_TEST 0x0020
+#define STATUS_INIT_ERROR 0x0010
+
+//
+// Bring-Up Error Codes
+//
+// IBM Spec, Pages 23-24
+//
+#define BRING_UP_ERR_INIT_TEST 0x0000
+#define BRING_UP_ERR_CRC 0x0001
+#define BRING_UP_ERR_RAM 0x0002
+#define BRING_UP_ERR_INSTRUCTION_TEST 0x0003
+#define BRING_UP_ERR_INT_TEST 0x0004
+#define BRING_UP_ERR_PROTOCOL_HANDLER 0x0005
+#define BRING_UP_ERR_SYSTEM_INTERFACE_REG 0x0006
+
+//
+// Initialize Error Codes
+//
+// IBM Spec, Page 24.
+//
+#define INITIALIZE_ERR_PARM_LEN 0x0001
+#define INITIALIZE_ERR_INV_OPTIONS 0x0002
+#define INITIALIZE_ERR_INV_RCV_BURST 0x0003
+#define INITIALIZE_ERR_INV_XMIT_BURST 0x0004
+#define INITIALIZE_ERR_INV_DMA_ABORT 0x0005
+#define INITIALIZE_ERR_INV_SCB 0x0006
+#define INITIALIZE_ERR_INV_SSB 0x0007
+#define INITIALIZE_ERR_DMA_TIMEOUT 0x0009
+#define INITIALIZE_ERR_DMA_BUS 0x000B
+#define INITIALIZE_ERR_DMA_DATA 0x000C
+#define INITIALIZE_ERR_ADAPTER_CHECK 0x000D
+
+//
+// Recommended burst sizes.
+//
+// IBM Spec, Page 25.
+//
+#define DEFAULT_BURST_SIZE_FAST 0x004C
+#define DEFAULT_BURST_SIZE_NORMAL 0x0040
+
+//
+// TOK162 ErrorLog structure.
+//
+// IBM Spec, Page 35.
+//
+typedef struct _TOK162_ERRORLOG {
+
+ //
+ // These are error count fields. The adapter resets the internal
+ // counters after they are read into this structure.
+ //
+ UCHAR LineError;
+ UCHAR InternalError;
+ UCHAR BurstError;
+ UCHAR ARIFCIError;
+ UCHAR AbortDelimeter;
+ UCHAR Reserved1;
+ UCHAR LostFrameError;
+ UCHAR ReceiveCongestionError;
+ UCHAR FrameCopiedError;
+ UCHAR Reserved2;
+ UCHAR TokenError;
+ UCHAR Reserved3;
+ UCHAR DMABusError;
+ UCHAR Reserved4;
+
+} TOK162_ERRORLOG, *PTOK162_ERRORLOG;
+
+//
+// TOK162 Read Adapter Log structure. Used to get permanent address, current
+// addresses (network, group, functional), the microcode level, and the MAC
+// buffer.
+//
+// IBM Spec, Pages 32-33.
+//
+typedef struct _TOK162_READADAPTERBUF {
+
+ //
+ // Number of bytes to be read from the adapter
+ //
+ USHORT DataCount;
+
+ //
+ // Offset for buffer
+ //
+ USHORT DataAddress;
+
+ //
+ // Buffer space
+ //
+ UCHAR BufferSpace[68-6];
+
+} TOK162_READADAPTERBUF, *PTOK162_READADAPTERBUF;
+
+//
+// TOK162 Address Block
+//
+// IBM Spec, Page 33.
+//
+typedef struct _TOK162_ADDRESSBLOCK {
+
+ //
+ // The node address. Used for both the current address and the permanent
+ // address (depending on the read call).
+ //
+ UCHAR NodeAddress[6];
+
+ //
+ // The current group address.
+ //
+ UCHAR GroupAddress[4];
+
+ //
+ // The current functional address.
+ //
+ UCHAR FunctionalAddress[4];
+
+} TOK162_ADDRESSBLOCK, *PTOK162_ADDRESSBLOCK;
+
+//
+// TOK162 Receive List
+//
+// IBM Spec, Pages 36-40.
+//
+typedef struct _TOK162_RECEIVE_LIST {
+
+ //
+ // This is the physical address of the next entry
+ // in the Receive Ring.
+ //
+ TOK162_PHYSICAL_ADDRESS ForwardPointer;
+
+ //
+ // List entry characteristics
+ //
+ USHORT CSTAT;
+
+ //
+ // This is the total size of the received frame.
+ //
+ USHORT FrameSize;
+
+ //
+ // This is the length (in bytes) of the buffer associated. IBM Format.
+ //
+ USHORT DataCount1;
+
+ //
+ // This is the address of the buffer associated. IBM Format.
+ //
+ ULONG PhysicalAddress1;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount2;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ ULONG PhysicalAddress2;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount3;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ ULONG PhysicalAddress3;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount4;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ ULONG PhysicalAddress4;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCoun5;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ ULONG PhysicalAddress5;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount6;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ ULONG PhysicalAddress6;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount7;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ ULONG PhysicalAddress7;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount8;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ ULONG PhysicalAddress8;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount9;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ ULONG PhysicalAddress9;
+
+} TOK162_RECEIVE_LIST, *PTOK162_RECEIVE_LIST;
+
+//
+// Receive and Transmit buffer sizes, depending on the ring speed.
+//
+// IBM Spec, Page 13.
+//
+#define RECEIVE_LIST_BUFFER_SIZE_4 4500
+#define RECEIVE_LIST_BUFFER_SIZE_16 17986
+
+//
+// The number of receive lists/buffers
+//
+#define RECEIVE_LIST_COUNT 3
+
+//
+// Receive CSTAT bit masks
+//
+// IBM Spec, Pages 38-39.
+//
+#define RECEIVE_CSTAT_REQUEST_RESET 0x0088 // Valid bit + frame int
+#define RECEIVE_CSTAT_VALID 0x0080 // Valid bit
+
+//
+// Transmit list entry. This is exactly like the receive list entry.
+//
+// IBM Spec, Pages 46-55.
+//
+typedef struct _TOK162_TRANSMIT_LIST {
+
+ //
+ // This is the physical address of the next entry
+ // in the Transmit Chain.
+ //
+ TOK162_PHYSICAL_ADDRESS ForwardPointer;
+
+ //
+ // List entry characteristics. IBM Format.
+ //
+ USHORT CSTAT;
+
+ //
+ // This is the total size of the received frame. IBM Format.
+ //
+ USHORT FrameSize;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount1;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ TOK162_PHYSICAL_ADDRESS PhysicalAddress1;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount2;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ TOK162_PHYSICAL_ADDRESS PhysicalAddress2;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount3;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ TOK162_PHYSICAL_ADDRESS PhysicalAddress3;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount4;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ TOK162_PHYSICAL_ADDRESS PhysicalAddress4;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCoun5;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ TOK162_PHYSICAL_ADDRESS PhysicalAddress5;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount6;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ TOK162_PHYSICAL_ADDRESS PhysicalAddress6;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount7;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ TOK162_PHYSICAL_ADDRESS PhysicalAddress7;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount8;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ TOK162_PHYSICAL_ADDRESS PhysicalAddress8;
+
+ //
+ // This is the length (in bytes) of this block. Stored in IBM format
+ //
+ USHORT DataCount9;
+
+ //
+ // This is the physical address of this block. Stored in IBM Format
+ //
+ TOK162_PHYSICAL_ADDRESS PhysicalAddress9;
+
+} TOK162_TRANSMIT_LIST, *PTOK162_TRANSMIT_LIST;
+
+//
+// The number of transmit lists
+//
+#define TRANSMIT_LIST_COUNT 0x0002
+
+//
+// The maximum number of transmit list scatter-gathers
+//
+#define TOK162_MAX_SG 0x0003
+
+//
+// Transmit CSTAT bit masks
+//
+#define TRANSMIT_CSTAT_REQUEST 0x00B0
+#define TRANSMIT_CSTAT_XMIT_ERROR 0x0004
+
+//
+// TOK162 Command Block. Contains all of the fields necessary to support
+// both commands and transmits.
+//
+typedef struct _TOK162_COMMAND_BLOCK {
+
+ //
+ // Transmit List Entry
+ //
+ TOK162_TRANSMIT_LIST TransmitEntry;
+
+ //
+ // This is the state of this Command Block.
+ //
+ USHORT State;
+
+ //
+ // This is the status of this Command Block.
+ //
+ USHORT Status;
+
+ //
+ // This is the physical address of the next Command Block
+ // to be executed. If this address == -1, then there are
+ // no more commands to be executed.
+ //
+ UNALIGNED TOK162_PHYSICAL_ADDRESS NextPending;
+
+ //
+ // This is the TOK162 Command Code.
+ //
+ USHORT CommandCode;
+
+ //
+ // Pointer used by different commands
+ //
+ ULONG ParmPointer;
+
+ //
+ // This is the immediate data to be used by all commands
+ // other than transmit.
+ //
+ ULONG ImmediateData;
+
+} TOK162_COMMAND_BLOCK, *PTOK162_COMMAND_BLOCK;
+
+
+//
+// Data block pointer
+// Used only to reference the different fields of the transmit list entry.
+// Allows code to access the transmit list entries in a for loop rather than
+// having code for each specific entry.
+//
+// Must be packed on a 2 byte boundary.
+//
+typedef struct _TOK162_DATA_BLOCK {
+
+ //
+ // size of the block. IBM format.
+ //
+ USHORT Size;
+
+ //
+ // physical pointer to the buffer. IBM format.
+ //
+ TOK162_PHYSICAL_ADDRESS IBMPhysicalAddress;
+
+} TOK162_DATA_BLOCK,*PTOK162_DATA_BLOCK;
+
+//
+// Numerical values for switches
+// (e.g. - Interrupt 5 instead of 00 [switch value])
+//
+// IBM Spec, Pages 8-10.
+//
+
+//
+// Adapter mode values
+//
+#define CFG_ADAPTERMODE_NORMAL 0x0000
+#define CFG_ADAPTERMODE_TEST 0x0001
+
+//
+// Wait state values
+//
+#define CFG_WAITSTATE_NORMAL 0x0000
+#define CFG_WAITSTATE_FAST 0x0001
+
+//
+// DMA channel values
+//
+#define CFG_DMACHANNEL_5 0x0005
+#define CFG_DMACHANNEL_6 0x0006
+#define CFG_DMACHANNEL_7 0x0007
+
+//
+// Connector type values
+//
+#define CFG_MEDIATYPE_STP 0x0000
+#define CFG_MEDIATYPE_UTP 0x0001
+
+//
+// Adapter interrupt values
+//
+#define CFG_INT_9 0x0009
+#define CFG_INT_10 0x000A
+#define CFG_INT_11 0x000B
+#define CFG_INT_15 0x000F
+
+//
+// RPL address values
+//
+#define CFG_RPLADDR_C0000 0xC0000
+#define CFG_RPLADDR_C4000 0xC4000
+#define CFG_RPLADDR_C8000 0xC8000
+#define CFG_RPLADDR_CC000 0xCC000
+#define CFG_RPLADDR_D0000 0xD0000
+#define CFG_RPLADDR_D4000 0xD4000
+#define CFG_RPLADDR_D8000 0xD8000
+#define CFG_RPLADDR_DC000 0xDC000
+
+//
+// Ring speed values
+//
+#define CFG_RINGSPEED_4 0x0004
+#define CFG_RINGSPEED_16 0x0010
+
+//
+// command and result structures
+//
+
+//
+// Open command structure. Submitted to the card to insert the system in
+// the Token Ring.
+//
+// IBM Spec, Pages 27-32.
+//
+typedef struct _OPEN_COMMAND {
+
+ //
+ // Open options. Defined below.
+ //
+ USHORT Options;
+
+ //
+ // Address to insert ourselves into the ring under.
+ //
+ UCHAR NodeAddress[6];
+
+ //
+ // Group address adapter should respond to.
+ //
+ ULONG GroupAddress;
+
+ //
+ // Functional address adapter should respond to.
+ //
+ ULONG FunctionalAddress;
+
+ //
+ // Size of the receive list structure
+ //
+ USHORT ReceiveListSize;
+ //
+ // Size of the transmit list structure
+ //
+ USHORT TransmitListSize;
+
+ //
+ // Adapter buffer size.
+ //
+ USHORT BufferSize;
+
+ //
+ // Unused.
+ //
+ USHORT Reserved1;
+ USHORT Reserved2;
+
+ //
+ // Minimum number of buffers to reserve for transmits
+ //
+ UCHAR TransmitBufCountMin;
+
+ //
+ // Maximum number of buffers to reserve for transmits
+ //
+ UCHAR TransmitBufCountMax;
+
+ //
+ // Pointer to the system product ID
+ //
+ ULONG ProdIDAddress;
+
+} OPEN_COMMAND, *POPEN_COMMAND;
+
+#define OPEN_OPTION_PASS_BEACON_FRAMES 0x8000
+#define OPEN_OPTION_DISABLE_DMA_TIMEOUT 0x4000
+#define OPEN_OPTION_ENABLE_DMA_TIMEOUT 0x0000
+#define OPEN_OPTION_WRAP_INTERFACE 0x0080
+#define OPEN_OPTION_DISABLE_HARD_ERROR 0x0040
+#define OPEN_OPTION_ENABLE_HARD_ERROR 0x0000
+#define OPEN_OPTION_DISABLE_SOFT_ERROR 0x0020
+#define OPEN_OPTION_ENABLE_SOFT_ERROR 0x0000
+#define OPEN_OPTION_PASS_ADAPTER_FRAMES 0x0010
+#define OPEN_OPTION_PASS_ATTENTION_FRAMES 0x0008
+#define OPEN_OPTION_PAD_ROUTING_FIELD 0x0004
+#define OPEN_OPTION_FRAME_HOLD 0x0002
+#define OPEN_OPTION_CONTENDER 0x0001
+
+//
+// Values to set the open parameters to
+//
+#define OPEN_RECEIVE_LIST_SIZE 0x000e
+#define OPEN_TRANSMIT_LIST_SIZE 0x001A
+#define OPEN_BUFFER_SIZE 512
+
+//
+// Open completion structure (SSB)
+//
+// IBM Spec, Pages 31-32.
+//
+typedef struct _OPEN_COMPLETION {
+
+ //
+ // Better be CMD_DMA_OPEN.
+ //
+ USHORT Command;
+
+ //
+ // Completion code. Bitmasks defined below.
+ //
+ USHORT Completion;
+
+ //
+ // Not used.
+ //
+ USHORT Reserved1;
+ USHORT Reserved2;
+
+} OPEN_COMPLETION, *POPEN_COMPLETION;
+
+#define OPEN_COMPLETION_MASK_PHASE 0xF000
+#define OPEN_COMPLETION_MASK_ERROR 0x0F00
+#define OPEN_COMPLETION_MASK_RESULT 0x00FF
+
+#define OPEN_COMPLETION_PHASE_LOBE 0x1000
+#define OPEN_COMPLETION_PHASE_INSERTION 0x2000
+#define OPEN_COMPLETION_PHASE_VERIFY 0x3000
+#define OPEN_COMPLETION_PHASE_RING 0x4000
+#define OPEN_COMPLETION_PHASE_PARMS 0x5000
+
+#define OPEN_COMPLETION_ERROR_FUNCTION 0x0100
+#define OPEN_COMPLETION_ERROR_SIGLOSS 0x0200
+#define OPEN_COMPLETION_ERROR_TIMEOUT 0x0500
+#define OPEN_COMPLETION_ERROR_RINGFAIL 0x0600
+#define OPEN_COMPLETION_ERROR_RINGBEACON 0x0700
+#define OPEN_COMPLETION_ERROR_DUPLICATE 0x0800
+#define OPEN_COMPLETION_ERROR_REQPARMS 0x0900
+#define OPEN_COMPLETION_ERROR_REMOVE_REC 0x0A00
+#define OPEN_COMPLETION_ERROR_IMPL_REC 0x0B00
+#define OPEN_COMPLETION_ERROR_DUPMOD 0x0C00
+
+#define OPEN_RESULT_ADAPTER_OPEN 0x0080
+#define OPEN_RESULT_NODE_ADDR_ERROR 0x0040
+#define OPEN_RESULT_LIST_SIZE_ERROR 0x0020
+#define OPEN_RESULT_BUF_SIZE_ERROR 0x0010
+#define OPEN_RESULT_EXT_RAM_ERROR 0x0008
+#define OPEN_RESULT_XMIT_CNT_ERROR 0x0004
+#define OPEN_RESULT_OPEN_ERROR 0x0002
+
+//
+// The adapter requires many of the WORD values and almost all of the
+// DWORD values to be in IBM format, versus Intel Format. The difference
+// between the two is as follows:
+//
+// If you are storing the value 0x1234, a word value, memory would look like:
+//
+// --------- ---------
+// | | | |
+// Intel | 34 | | 12 |
+// | | | |
+// --------- ---------
+// Address 100 101
+//
+//
+// --------- ---------
+// | | | |
+// IBM | 12 | | 34 |
+// | | | |
+// --------- ---------
+// Address 100 101
+//
+//
+// If you are storing the value 0x12345678, a dword value, memory would look
+// like:
+//
+// --------- --------- --------- ---------
+// | | | | | | | |
+// Intel | 78 | | 56 | | 34 | | 12 |
+// | | | | | | | |
+// --------- --------- --------- ---------
+// Address 100 101
+//
+//
+// --------- --------- --------- ---------
+// | | | | | | | |
+// IBM | 12 | | 34 | | 56 | | 78 |
+// | | | | | | | |
+// --------- --------- --------- ---------
+// Address 100 101
+//
+//
+// To convert "Intel" WORDs and DWORDs to "IBM" format, the following macros
+// are used.
+//
+
+//
+// Macro to byte swap a word.
+//
+#define BYTE_SWAP(_word) (\
+ (USHORT) (((_word) >> 8) | ((_word) << 8)) )
+
+//
+// Macro to byte swap a word.
+//
+#define WORD_SWAP(_dword) (\
+ (ULONG) (((_dword) >> 16) | ((_dword) << 16)) )
+
+//
+// Macro to get low byte of a word.
+//
+#define LOW_BYTE(_word) (\
+ (UCHAR) ((_word) & 0x00FF) )
+
+//
+// Macro to get high byte of a word.
+//
+#define HIGH_BYTE(_word) (\
+ (UCHAR) (((_word) >> 8) & 0x00FF) )
+
+//
+// Macro to get low word of a dword.
+//
+#define LOW_WORD(_dword) (\
+ (USHORT) ((_dword) & 0x0000FFFF) )
+
+//
+// Macro to get high word of a dword.
+//
+#define HIGH_WORD(_dword) (\
+ (USHORT) (((_dword) >> 16) & 0x0000FFFF) )
+
+//
+// Macro to create a dword from two words.
+//
+#define MAKE_LONG(_highword,_lowword) (\
+ (ULONG) ((((ULONG)_highword) << 16) + _lowword))
+
+//
+// Macro to byte swap a dword.
+//
+#define BYTE_SWAP_ULONG(_ulong) (\
+ (ULONG)((ULONG)(BYTE_SWAP(LOW_WORD(_ulong)) << 16) + \
+ BYTE_SWAP(HIGH_WORD(_ulong))))
+
+//
+// End the packing
+//
+#include <poppack.h>