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.
964 lines
26 KiB
964 lines
26 KiB
/*++
|
|
|
|
Copyright (c) 1990 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ne3200hw.h
|
|
|
|
Abstract:
|
|
|
|
Hardware specific values for the Novell NE3200 NDIS 3.0 driver.
|
|
|
|
Author:
|
|
|
|
Keith Moore (KeithMo) 08-Jan-1991
|
|
|
|
Environment:
|
|
|
|
Architecturally, there is an assumption in this driver that we are
|
|
on a little endian machine.
|
|
|
|
Notes:
|
|
|
|
optional-notes
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#ifndef _NE3200HARDWARE_
|
|
#define _NE3200HARDWARE_
|
|
|
|
//
|
|
// Defines for the packet and media specific information
|
|
//
|
|
#define MINIMUM_ETHERNET_PACKET_SIZE ((UINT)60)
|
|
#define MAXIMUM_ETHERNET_PACKET_SIZE ((UINT)1514)
|
|
#define NE3200_LENGTH_OF_ADDRESS 6
|
|
|
|
//
|
|
// The default interrupt number.
|
|
//
|
|
#define NE3200_DEFAULT_INTERRUPT_VECTOR ((CCHAR)11)
|
|
|
|
//
|
|
// The following parameters *MUST* each be a greater than one!
|
|
//
|
|
// The number of receive buffers to allocate.
|
|
// The number of transmit buffers to allocate.
|
|
// The number of command blocks for transmits that the driver has available.
|
|
// The number of command blocks for requests the driver has availabale.
|
|
//
|
|
#define NE3200_NUMBER_OF_RECEIVE_BUFFERS ((UINT)16)
|
|
#define NE3200_NUMBER_OF_TRANSMIT_BUFFERS ((UINT)4)
|
|
#define NE3200_NUMBER_OF_COMMAND_BLOCKS ((UINT)8)
|
|
#define NE3200_NUMBER_OF_PUBLIC_CMD_BLOCKS ((UINT)3)
|
|
|
|
|
|
//
|
|
// MAC.BIN info.
|
|
//
|
|
#define NE3200_MAXIMUM_MACBIN_SIZE ((ULONG)16384)
|
|
#define NE3200_MACBIN_LENGTH 4096
|
|
|
|
|
|
//
|
|
// This is the number of bytes per entry in the multicast table
|
|
// as presented to the NE3200. Note that this is *not* the number
|
|
// of bytes in a multicast address, just the number of bytes per
|
|
// table entry. For some goofy reason, MAC.BIN requires the table
|
|
// used in the NE3200_COMMAND_SET_MULTICAST_ADDRESS command to have
|
|
// 16 bytes per entry.
|
|
//
|
|
#define NE3200_SIZE_OF_MULTICAST_TABLE_ENTRY ((UINT)16)
|
|
#define NE3200_MAXIMUM_MULTICAST ((UINT)50)
|
|
|
|
|
|
//
|
|
// Our buffer sizes.
|
|
//
|
|
// These are *not* configurable. Portions of the code assumes
|
|
// that these buffers can contain *any* legal Ethernet packet.
|
|
//
|
|
#define NE3200_SIZE_OF_TRANSMIT_BUFFERS (MAXIMUM_ETHERNET_PACKET_SIZE)
|
|
#define NE3200_SIZE_OF_RECEIVE_BUFFERS (MAXIMUM_ETHERNET_PACKET_SIZE)
|
|
|
|
|
|
//
|
|
// I/O Port Address.
|
|
//
|
|
// Note that the NE3200 uses EISA Slot-Specific Addressing. In
|
|
// this method, each slot has its own I/O address space. This space
|
|
// begins at the slot number shifted left 12 bits. For example,
|
|
// the I/O space for slot number 6 begins at I/O address 6000h.
|
|
//
|
|
// Each of the following addresses are offset from the start of
|
|
// slot-specific I/O space.
|
|
//
|
|
#define NE3200_RESET_PORT ((USHORT)0x0000)
|
|
#define NE3200_ID_PORT ((USHORT)0x0C80)
|
|
#define NE3200_GLOBAL_CONFIGURATION_PORT ((USHORT)0x0C88)
|
|
#define NE3200_SYSTEM_INTERRUPT_PORT ((USHORT)0x0C89)
|
|
#define NE3200_LOCAL_DOORBELL_MASK_PORT ((USHORT)0x0C8C)
|
|
#define NE3200_LOCAL_DOORBELL_INTERRUPT_PORT ((USHORT)0x0C8D)
|
|
#define NE3200_SYSTEM_DOORBELL_MASK_PORT ((USHORT)0x0C8E)
|
|
#define NE3200_SYSTEM_DOORBELL_INTERRUPT_PORT ((USHORT)0x0C8F)
|
|
#define NE3200_BASE_MAILBOX_PORT ((USHORT)0x0C90)
|
|
|
|
|
|
//
|
|
// Definitions for NE3200_RESET_PORT.
|
|
//
|
|
#define NE3200_RESET_BIT_ON ((UCHAR)1)
|
|
#define NE3200_RESET_BIT_OFF ((UCHAR)0)
|
|
|
|
|
|
//
|
|
// Mailbox Registers
|
|
//
|
|
#define NE3200_MAILBOX_RESET_STATUS ((USHORT)0x0000)
|
|
#define NE3200_MAILBOX_COMMAND_POINTER ((USHORT)0x0000)
|
|
#define NE3200_MAILBOX_MACBIN_LENGTH ((USHORT)0x0001)
|
|
#define NE3200_MAILBOX_MACBIN_DOWNLOAD_MODE ((USHORT)0x0003)
|
|
#define NE3200_MAILBOX_RECEIVE_POINTER ((USHORT)0x0004)
|
|
#define NE3200_MAILBOX_MACBIN_POINTER ((USHORT)0x0004)
|
|
#define NE3200_MAILBOX_STATUS ((USHORT)0x0008)
|
|
#define NE3200_MAILBOX_MACBIN_TARGET ((USHORT)0x0008)
|
|
#define NE3200_MAILBOX_STATION_ID ((USHORT)0x000A)
|
|
|
|
|
|
//
|
|
// Values for MAC.BIN download
|
|
//
|
|
#define NE3200_MACBIN_DIRECT ((UCHAR)0x80)
|
|
#define NE3200_MACBIN_TARGET_ADDRESS ((USHORT)0x0400)
|
|
|
|
|
|
//
|
|
// Status read from NE3200_MAILBOX_RESET_STATUS after hardware reset
|
|
//
|
|
#define NE3200_RESET_FAILED ((UCHAR)0x40)
|
|
#define NE3200_RESET_PASSED ((UCHAR)0x80)
|
|
|
|
|
|
//
|
|
// Status read from NE3200_MAILBOX_STATUS after initialization
|
|
//
|
|
#define NE3200_INITIALIZATION_FAILED ((UCHAR)0x20)
|
|
#define NE3200_INITIALIZATION_PASSED ((UCHAR)0x60)
|
|
|
|
|
|
//
|
|
// Local DoorBell bits
|
|
//
|
|
#define NE3200_LOCAL_DOORBELL_NEW_COMMAND ((UCHAR)0x01)
|
|
#define NE3200_LOCAL_DOORBELL_RESET ((UCHAR)0x04)
|
|
#define NE3200_LOCAL_DOORBELL_INITIALIZE ((UCHAR)0x10)
|
|
#define NE3200_LOCAL_DOORBELL_NEW_RECEIVE ((UCHAR)0x20)
|
|
|
|
#define NE3200_LOCAL_DOORBELL_MASK \
|
|
( NE3200_LOCAL_DOORBELL_NEW_COMMAND \
|
|
| NE3200_LOCAL_DOORBELL_RESET \
|
|
| NE3200_LOCAL_DOORBELL_INITIALIZE \
|
|
| NE3200_LOCAL_DOORBELL_NEW_RECEIVE )
|
|
|
|
|
|
//
|
|
// System DoorBell bits
|
|
//
|
|
#define NE3200_SYSTEM_DOORBELL_PACKET_RECEIVED ((UCHAR)0x01)
|
|
#define NE3200_SYSTEM_DOORBELL_COMMAND_COMPLETE ((UCHAR)0x02)
|
|
#define NE3200_SYSTEM_DOORBELL_RESET_COMPLETE ((UCHAR)0x04)
|
|
#define NE3200_SYSTEM_DOORBELL_INIT_COMPLETE ((UCHAR)0x08)
|
|
#define NE3200_SYSTEM_DOORBELL_SELF_RESET ((UCHAR)0x10)
|
|
|
|
#define NE3200_SYSTEM_DOORBELL_MASK \
|
|
( NE3200_SYSTEM_DOORBELL_PACKET_RECEIVED \
|
|
| NE3200_SYSTEM_DOORBELL_COMMAND_COMPLETE)
|
|
|
|
|
|
//
|
|
// System Interrupt Mask/Control bits
|
|
//
|
|
#define NE3200_SYSTEM_INTERRUPT_ENABLE ((UCHAR)0x01)
|
|
#define NE3200_SYSTEM_INTERRUPT_PENDING ((UCHAR)0x02)
|
|
|
|
|
|
//
|
|
// NE3200 Command Codes
|
|
//
|
|
#define NE3200_COMMAND_NOP ((UCHAR)0x00)
|
|
#define NE3200_COMMAND_SET_STATION_ADDRESS ((UCHAR)0x01)
|
|
#define NE3200_COMMAND_CONFIGURE_82586 ((UCHAR)0x02)
|
|
#define NE3200_COMMAND_SET_MULTICAST_ADDRESS ((UCHAR)0x03)
|
|
#define NE3200_COMMAND_TRANSMIT ((UCHAR)0x04)
|
|
#define NE3200_COMMAND_READ_ADAPTER_STATISTICS ((UCHAR)0x08)
|
|
#define NE3200_COMMAND_INITIALIZE_ADAPTER ((UCHAR)0x09)
|
|
#define NE3200_COMMAND_CLEAR_ADAPTER_STATISTICS ((UCHAR)0x0A)
|
|
|
|
|
|
//
|
|
// NE3200 Receive/Command Block States
|
|
//
|
|
#define NE3200_STATE_FREE ((USHORT)0x0000)
|
|
#define NE3200_STATE_EXECUTION_COMPLETE ((USHORT)0x0001)
|
|
#define NE3200_STATE_WAIT_FOR_ADAPTER ((USHORT)0x0002)
|
|
|
|
|
|
//
|
|
// NE3200 Command Block Status
|
|
//
|
|
|
|
//
|
|
// These apply to all commands.
|
|
//
|
|
#define NE3200_STATUS_COMPLETE ((USHORT)0x8000)
|
|
#define NE3200_STATUS_BUSY ((USHORT)0x4000)
|
|
#define NE3200_STATUS_SUCCESS ((USHORT)0x2000)
|
|
#define NE3200_STATUS_ABORTED ((USHORT)0x1000)
|
|
#define NE3200_STATUS_GENERIC_MASK ((USHORT)0xF000)
|
|
|
|
//
|
|
// These apply to transmit only.
|
|
//
|
|
#define NE3200_STATUS_NO_CARRIER ((USHORT)0x0400)
|
|
#define NE3200_STATUS_NO_CLEAR_TO_SEND ((USHORT)0x0200)
|
|
#define NE3200_STATUS_DMA_UNDERRUN ((USHORT)0x0100)
|
|
#define NE3200_STATUS_TRANSMIT_DEFERRED ((USHORT)0x0080)
|
|
#define NE3200_STATUS_HEART_BEAT ((USHORT)0x0040)
|
|
#define NE3200_STATUS_MAXIMUM_COLLISIONS ((USHORT)0x0020)
|
|
#define NE3200_STATUS_COLLISION_MASK ((USHORT)0x000F)
|
|
#define NE3200_STATUS_FATALERROR_MASK (NE3200_STATUS_NO_CARRIER | \
|
|
NE3200_STATUS_NO_CLEAR_TO_SEND | \
|
|
NE3200_STATUS_DMA_UNDERRUN | \
|
|
NE3200_STATUS_HEART_BEAT | \
|
|
NE3200_STATUS_MAXIMUM_COLLISIONS)
|
|
|
|
//
|
|
// This defines a "proper" command complete status.
|
|
//
|
|
#define NE3200_STATUS_COMMAND_COMPLETE (NE3200_STATUS_COMPLETE | \
|
|
NE3200_STATUS_SUCCESS)
|
|
|
|
|
|
//
|
|
// Timeout constants
|
|
//
|
|
// Each of these timeout constants represents the time to wait
|
|
// for a particular event to occur. For example, NE3200_TIMEOUT_RESET
|
|
// represents the amount of time to wait for an adapter reset to
|
|
// complete. Each of these values is in units of 1/100 of a second.
|
|
// Therefore, a value of 200 would be approximately 2 seconds.
|
|
//
|
|
#define NE3200_TIMEOUT_RESET 200
|
|
#define NE3200_TIMEOUT_DOWNLOAD 100
|
|
|
|
//
|
|
// This timeout represents the maximum amount of time we'll wait
|
|
// for an NE3200 command to complete. This value is in units of
|
|
// 1/1000 of a second. Therefore, a value of 2000 would be approximately
|
|
// 2 seconds.
|
|
//
|
|
#define NE3200_TIMEOUT_COMMAND 2000
|
|
|
|
|
|
//
|
|
// This type defines the physical addresses used by the NE3200
|
|
// card itself. This should always be four bytes.
|
|
//
|
|
typedef ULONG NE3200_PHYSICAL_ADDRESS, *PNE3200_PHYSICAL_ADDRESS;
|
|
|
|
|
|
//
|
|
// Miscellaneous Constants
|
|
//
|
|
#define NE3200_NULL ((NE3200_PHYSICAL_ADDRESS)(-1L))
|
|
#define NE3200_MAXIMUM_BLOCKS_PER_PACKET ((UINT)4)
|
|
#define NE3200_IMMEDIATE_DATA_LENGTH ((UINT)64)
|
|
|
|
|
|
|
|
//
|
|
// Force misalignment of the following structures
|
|
//
|
|
#include <pshpack1.h>
|
|
|
|
|
|
//
|
|
// NE3200 Data Block Descriptor
|
|
//
|
|
typedef struct _NE3200_DATA_BLOCK {
|
|
|
|
//
|
|
// This is the length (in bytes) of this block.
|
|
//
|
|
USHORT BlockLength;
|
|
|
|
//
|
|
// This is the physical address of this block.
|
|
//
|
|
NE3200_PHYSICAL_ADDRESS PhysicalAddress;
|
|
|
|
} NE3200_DATA_BLOCK, *PNE3200_DATA_BLOCK;
|
|
|
|
|
|
//
|
|
// NE3200 Receive Ring Entry
|
|
//
|
|
typedef struct _NE3200_RECEIVE_ENTRY {
|
|
|
|
//
|
|
// This 4-byte field is unused by MAC.BIN and is
|
|
// available for use by the driver. We'll use
|
|
// this field as . . .
|
|
//
|
|
UCHAR Available1[4];
|
|
|
|
//
|
|
// This is the state of this Receive Ring entry.
|
|
//
|
|
USHORT State;
|
|
|
|
//
|
|
// This is the total size of the received frame.
|
|
//
|
|
USHORT FrameSize;
|
|
|
|
//
|
|
// This is the physical address of the next entry
|
|
// in the Receive Ring.
|
|
//
|
|
NE3200_PHYSICAL_ADDRESS NextPending;
|
|
|
|
//
|
|
// This 6-byte field is unused by MAC.BIN and is
|
|
// available for use by the driver. We'll use
|
|
// this field as . . .
|
|
//
|
|
UCHAR Available2[6];
|
|
|
|
//
|
|
// This is the descriptor which specifies the
|
|
// receive buffer used by this entry.
|
|
//
|
|
NE3200_DATA_BLOCK BufferDescriptor;
|
|
|
|
} NE3200_RECEIVE_ENTRY, *PNE3200_RECEIVE_ENTRY;
|
|
|
|
|
|
//
|
|
// NE3200 Command Block
|
|
//
|
|
typedef struct _NE3200_COMMAND_BLOCK {
|
|
|
|
//
|
|
// This 4-byte field is unused by MAC.BIN and is
|
|
// available for use by the driver. We'll use
|
|
// this field as . . .
|
|
//
|
|
UCHAR Available1[4];
|
|
|
|
//
|
|
// 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.
|
|
//
|
|
NE3200_PHYSICAL_ADDRESS NextPending;
|
|
|
|
//
|
|
// This 1-byte field is unused by MAC.BIN and is
|
|
// available for use by the driver. We'll use
|
|
// this field as . . .
|
|
//
|
|
UCHAR Available2[1];
|
|
|
|
//
|
|
// This is the NE3200 Command Code.
|
|
//
|
|
UCHAR CommandCode;
|
|
|
|
//
|
|
// This 1-byte field is unused by MAC.BIN and is
|
|
// available for use by the driver. We'll use
|
|
// this field as . . .
|
|
//
|
|
UCHAR Available3[1];
|
|
|
|
//
|
|
// The following eight bytes are used as parameters
|
|
// by various NE3200 commands.
|
|
//
|
|
union _PARAMETERS {
|
|
|
|
//
|
|
// Parameters for NE3200_COMMAND_SET_STATION_ADDRESS.
|
|
//
|
|
struct _SET_ADDRESS {
|
|
|
|
//
|
|
// This field contains the new station address.
|
|
//
|
|
IN UCHAR NewStationAddress[NE3200_LENGTH_OF_ADDRESS];
|
|
|
|
} SET_ADDRESS;
|
|
|
|
//
|
|
// Parameters for NE3200_COMMAND_CONFIGURE_82586.
|
|
//
|
|
struct _CONFIGURE {
|
|
|
|
//
|
|
// This field holds the physical address of
|
|
// the configuration block.
|
|
//
|
|
IN NE3200_PHYSICAL_ADDRESS ConfigurationBlock;
|
|
|
|
} CONFIGURE;
|
|
|
|
//
|
|
// Parameters for NE3200_COMMAND_SET_MULTICAST_ADDRESS.
|
|
//
|
|
struct _MULTICAST {
|
|
|
|
//
|
|
// This field holds the physical address of
|
|
// the multicast address table.
|
|
//
|
|
IN NE3200_PHYSICAL_ADDRESS MulticastAddressTable;
|
|
|
|
//
|
|
// This field holds the number of multicast
|
|
// address in the multicast address table.
|
|
//
|
|
IN USHORT NumberOfMulticastAddresses;
|
|
|
|
} MULTICAST;
|
|
|
|
//
|
|
// Parameters for NE3200_COMMAND_TRANSMIT.
|
|
//
|
|
struct _TRANSMIT {
|
|
|
|
//
|
|
// This field holds the length of "immediate data"
|
|
// to be transmitted.
|
|
//
|
|
IN USHORT ImmediateDataLength;
|
|
|
|
} TRANSMIT;
|
|
|
|
//
|
|
// Parameters for NE3200_READ_ADAPTER_STATISTICS.
|
|
//
|
|
struct _STATISTICS {
|
|
|
|
//
|
|
// The following fields are filled in by the adapter
|
|
// when it executes the NE3200_READ_ADAPTER_STATISTICS
|
|
// command.
|
|
//
|
|
|
|
//
|
|
// This field holds the number of properly aligned
|
|
// frames received with a CRC error.
|
|
//
|
|
OUT USHORT CrcErrors;
|
|
|
|
//
|
|
// This field holds the number of misaligned frames
|
|
// received.
|
|
//
|
|
OUT USHORT AlignmentErrors;
|
|
|
|
//
|
|
// This field holds the number of resource errors
|
|
// (the number of frames which were discarded due
|
|
// to lack of memory resources such as buffer space
|
|
// or receive frame descriptors).
|
|
//
|
|
OUT USHORT ResourceErrors;
|
|
|
|
//
|
|
// This field holds the number of received frame
|
|
// sequeneces lost because the memory bus was
|
|
// not available in time for the transfer.
|
|
//
|
|
OUT USHORT OverrunErrors;
|
|
|
|
} STATISTICS;
|
|
|
|
//
|
|
// This field holds the raw data.
|
|
//
|
|
IN OUT USHORT RawParameters[4];
|
|
|
|
} PARAMETERS;
|
|
|
|
//
|
|
// This is the total size of the frame to be transmitted.
|
|
//
|
|
USHORT TransmitFrameSize;
|
|
|
|
//
|
|
// This is the number of data blocks in the frame to be
|
|
// transmitted.
|
|
//
|
|
UCHAR NumberOfDataBlocks;
|
|
|
|
//
|
|
// These are the descriptors describing the transmit packet.
|
|
//
|
|
NE3200_DATA_BLOCK TransmitDataBlocks[NE3200_MAXIMUM_BLOCKS_PER_PACKET];
|
|
|
|
//
|
|
// This is the immediate data to be used by all commands
|
|
// other than transmit.
|
|
//
|
|
UCHAR ImmediateData[NE3200_IMMEDIATE_DATA_LENGTH];
|
|
|
|
} NE3200_COMMAND_BLOCK, *PNE3200_COMMAND_BLOCK;
|
|
|
|
|
|
//
|
|
// NE3200 Configuration Block
|
|
//
|
|
// This structure contains configuration data for the NE3200's
|
|
// on-board 82586 Lan Coprocessor. The majority of this data
|
|
// will not change during operation of the driver.
|
|
//
|
|
typedef struct _NE3200_CONFIGURATION_BLOCK {
|
|
|
|
//
|
|
// This field contains the number of bytes in the
|
|
// Configuration Block.
|
|
//
|
|
// In this implementation, this will always be 12.
|
|
//
|
|
USHORT ByteCount:4;
|
|
|
|
//
|
|
// This field is undefined by the 82586.
|
|
//
|
|
USHORT Undefined1:4;
|
|
|
|
//
|
|
// This field contains the FIFO threshold.
|
|
//
|
|
// In this implementation, this will always be 8.
|
|
//
|
|
USHORT FifoThreshold:4;
|
|
|
|
//
|
|
// This field is undefined by the 82586.
|
|
//
|
|
USHORT Undefined2:4;
|
|
|
|
//
|
|
// This field is undefined by the 82586.
|
|
//
|
|
USHORT Undefined3:6;
|
|
|
|
//
|
|
// If this field is set to 0, the 82586 operates with
|
|
// internal synchronization. If set to 1, the 82586
|
|
// uses external synchronization.
|
|
//
|
|
// This will always be set to 0 in this implementation
|
|
// (internal synchronization).
|
|
//
|
|
USHORT Synchronization:1;
|
|
|
|
//
|
|
// If this field is set to 0, the 82586 will not save
|
|
// bad frames in memory. If set to 1, the 82856 will
|
|
// save bad frames.
|
|
//
|
|
// In this implementation, this will always be 0
|
|
// (don't save bad frames).
|
|
//
|
|
USHORT SaveBadFrames:1;
|
|
|
|
//
|
|
// This field contains the number of bytes in a
|
|
// network address.
|
|
//
|
|
// In this implementation, this will always be 6.
|
|
//
|
|
USHORT AddressLength:3;
|
|
|
|
//
|
|
// If this field is set to 0, then the Destination
|
|
// Network Address is part of the Transmit Command Block
|
|
// and the Source Address is inserted by the 82586. If
|
|
// set to 1, then the Destination and Source Addresses
|
|
// are part of the Transmit/Receive data buffers.
|
|
//
|
|
// In this implementation, this is always set to 1
|
|
// (Addresses are part of the data buffers).
|
|
//
|
|
USHORT SeparateAddressAndLength:1;
|
|
|
|
//
|
|
// These two bits determine the length of the packet
|
|
// preamble according to the following table:
|
|
//
|
|
// Bits Preamble Length
|
|
// ---- ---------------
|
|
// 00 2 bytes
|
|
// 01 4 bytes
|
|
// 10 8 bytes
|
|
// 11 16 bytes
|
|
//
|
|
// In this implementation, these bits will always be
|
|
// set to 10 (8 byte preamble).
|
|
//
|
|
USHORT PreambleLength:2;
|
|
|
|
//
|
|
// These two field control internal/external loopback on
|
|
// the 82586.
|
|
//
|
|
// In this implementation, these two fields should be set to 0.
|
|
//
|
|
USHORT InternalLoopback:1;
|
|
USHORT ExternalLoopback:1;
|
|
|
|
//
|
|
// This field contains the linear backoff priority.
|
|
//
|
|
// In this implementation, this field will always be 0.
|
|
//
|
|
USHORT LinearPriority:3;
|
|
|
|
//
|
|
// This field is undefined by the 82586.
|
|
//
|
|
USHORT Undefined4:1;
|
|
|
|
//
|
|
// This field contains the exponential backoff priority.
|
|
//
|
|
// In this implementation, this field will always be 0.
|
|
//
|
|
USHORT ExponentialPriority:3;
|
|
|
|
//
|
|
// If this field is set to 0, the 82586 will use the
|
|
// IEEE 802.3/Ethernet exponential backoff method. If
|
|
// set to 1, the 82586 will use an alternate backoff
|
|
// method.
|
|
//
|
|
// In this implementation, this field will always be 0
|
|
// (use the IEEE 802.3/Ethernet backoff method).
|
|
//
|
|
USHORT ExponentialBackoffMethod:1;
|
|
|
|
//
|
|
// This field contains the Interframe Spacing in TxC units.
|
|
//
|
|
// In this implementation, this field will always be 96.
|
|
//
|
|
USHORT InterframeSpacing:8;
|
|
|
|
//
|
|
// This field contains the Slot Time Number.
|
|
//
|
|
// In this implementation, this field will always be 512.
|
|
//
|
|
USHORT SlotTime:11;
|
|
|
|
//
|
|
// This field is undefined by the 82586.
|
|
//
|
|
USHORT Undefined5:1;
|
|
|
|
//
|
|
// This field contains the maximum number of transmission
|
|
// retries on collisions.
|
|
//
|
|
// In this implementation, this field will always be 15.
|
|
//
|
|
USHORT MaximumRetries:4;
|
|
|
|
//
|
|
// If this field is set to 0, Promiscuous Mode will be disabled.
|
|
// If set to 1, then Promiscuous Mode will be enabled and the
|
|
// 82586 will receive *all* packets.
|
|
//
|
|
// This field will initially be set to 0 (disable Promiscuous
|
|
// Mode) but may be changed when a protocol requests a change
|
|
// to the packet filter.
|
|
//
|
|
USHORT PromiscuousMode:1;
|
|
|
|
//
|
|
// If this field is set to 0, then all Broadcast Packets will be
|
|
// received. If set to 1, then Broadcast reception is disabled.
|
|
//
|
|
// This field will initially be set to 1 (disable Broadcast
|
|
// reception) but may be changed when a protocol requests a change
|
|
// to the packet filter.
|
|
//
|
|
USHORT DisableBroadcast:1;
|
|
|
|
//
|
|
// If this field is set to 0, then the 82586 will use NRZ encoding
|
|
// and decoding. If set to 1, the 82586 will use Manchester
|
|
// encoding and decoding.
|
|
//
|
|
// In this implementation, this field will always be set to 0
|
|
// (use NRZ encoding).
|
|
//
|
|
USHORT EncodingMethod:1;
|
|
|
|
//
|
|
// If this field is set to 0, then the 82586 will cease transmission
|
|
// if CRS goes inactive during frame transmission. If set to 1,
|
|
// the 82586 will continue transmission even if there is no carrier
|
|
// sense.
|
|
//
|
|
// In this implementation, this field will always be set to 0
|
|
// (cease transmission if carrier lost).
|
|
//
|
|
USHORT TransmitOnNoCarrier:1;
|
|
|
|
//
|
|
// If this field is set to 0, then the 82586 will insert a CRC
|
|
// field into the packet. If set to 1, then no CRC will be
|
|
// inserted
|
|
//
|
|
// In this implementation, this field will always be set to 0
|
|
// (insert CRC field).
|
|
//
|
|
USHORT DisableCrcInsertion:1;
|
|
|
|
//
|
|
// If this field is set to 0, then the 82856 will use the
|
|
// 32-bit Autodin II CRC polynomial. If set to 1 then the
|
|
// 16-bit CCITT CRC polynomial will be used.
|
|
//
|
|
// In this implementation, this field will always be set to 0
|
|
// (use the 32-bit Autodin II CRC polynomial).
|
|
//
|
|
USHORT CrcType:1;
|
|
|
|
//
|
|
// If this field is set to 0, then the 82586 will use the
|
|
// Ethernet bitstuffing method. If set to 1 then the 82586 will
|
|
// use an HDLC-like bitstuffing method.
|
|
//
|
|
// In this implementation, this field will always be set to 0
|
|
// (use the Ethernet bitstuffing method).
|
|
//
|
|
USHORT BitStuffingMethod:1;
|
|
|
|
//
|
|
// If this field is set to 0, then the 82586 will perform no
|
|
// padding. If set to 1 then the 82586 will pad transmits
|
|
// out to the full slot time.
|
|
//
|
|
// In this implementation, this field will always be set to 0
|
|
// (no padding).
|
|
//
|
|
USHORT EnablePadding:1;
|
|
|
|
//
|
|
// This field contains the Carrier Sense Filter (in bit times).
|
|
//
|
|
// In this implementation, this field will always be set to 0.
|
|
//
|
|
USHORT CarrierSenseFilter:2;
|
|
|
|
//
|
|
// If this field is set to 0, then the 82586 will use an external
|
|
// carrier sense source. If set to 1 than an internal carrier
|
|
// sense source is used.
|
|
//
|
|
// In this implementation, this field will always be set to 0
|
|
// (external carrier sense source).
|
|
//
|
|
USHORT CarrierSenseSource:1;
|
|
|
|
//
|
|
// This field contains the Collision Detect Filter (in bit times).
|
|
//
|
|
// In this implementation, this field will always be set to 0.
|
|
//
|
|
USHORT CollisionDetectFilter:2;
|
|
|
|
//
|
|
// If this field is set to 0, then the 82586 will use an external
|
|
// collision detect source. If set to 1 then an internal
|
|
// collision detect source is used.
|
|
//
|
|
// In this implementation, this field will always be set to 0
|
|
// (external collision detect source).
|
|
//
|
|
USHORT CollisionDetectSource:1;
|
|
|
|
//
|
|
// Padding bits to align MinimumFrameLength
|
|
//
|
|
USHORT TempPadding:2;
|
|
|
|
//
|
|
// This field contains the minimum number of bytes in a frame.
|
|
//
|
|
// In this implementation, this field will always be 64.
|
|
//
|
|
USHORT MinimumFrameLength:8;
|
|
|
|
//
|
|
// The following three bits are technically undefined by the
|
|
// 82586, but are used by MAC.BIN.
|
|
//
|
|
|
|
//
|
|
// This bit must be set to 1 to enable packet reception. If
|
|
// this bit is not set, then no packets will be received.
|
|
//
|
|
USHORT MacBinEnablePacketReception:1;
|
|
|
|
//
|
|
// This bit is unused.
|
|
//
|
|
USHORT MacBinUnused:1;
|
|
|
|
//
|
|
// If promiscuous mode is enabled, then this but must also
|
|
// be set. This short-circuits MAC.BIN's multicast filtering.
|
|
//
|
|
USHORT MacBinPromiscuous:1;
|
|
|
|
//
|
|
// This field is (honest!) unused.
|
|
//
|
|
USHORT Undefined6:5;
|
|
|
|
} NE3200_CONFIGURATION_BLOCK, *PNE3200_CONFIGURATION_BLOCK;
|
|
|
|
#include <poppack.h>
|
|
|
|
|
|
|
|
//
|
|
// Macros to read/write BMIC registers
|
|
//
|
|
#define NE3200_READ_MAILBOX_UCHAR(_Adapter, _MailboxIndex, _pValue) \
|
|
NdisRawReadPortUchar( \
|
|
(ULONG)(_Adapter)->BaseMailboxPort+(_MailboxIndex), \
|
|
(PUCHAR)(_pValue) \
|
|
)
|
|
|
|
#define NE3200_READ_MAILBOX_USHORT(_Adapter, _MailboxIndex, _pValue) \
|
|
NdisRawReadPortUshort( \
|
|
(ULONG)(_Adapter)->BaseMailboxPort+(_MailboxIndex), \
|
|
(PUSHORT)(_pValue) \
|
|
)
|
|
|
|
#define NE3200_READ_MAILBOX_ULONG(_Adapter, _MailboxIndex, _pValue) \
|
|
NdisRawReadPortUlong( \
|
|
(ULONG)(_Adapter)->BaseMailboxPort+(_MailboxIndex), \
|
|
(PULONG)(_pValue) \
|
|
)
|
|
|
|
#define NE3200_WRITE_MAILBOX_UCHAR(_Adapter, _MailboxIndex, _Value) \
|
|
NdisRawWritePortUchar( \
|
|
(ULONG)(_Adapter)->BaseMailboxPort+(_MailboxIndex), \
|
|
(UCHAR)(_Value) \
|
|
)
|
|
|
|
#define NE3200_WRITE_MAILBOX_USHORT(_Adapter, _MailboxIndex, _Value) \
|
|
NdisRawWritePortUshort( \
|
|
(ULONG)(_Adapter)->BaseMailboxPort+(_MailboxIndex), \
|
|
(USHORT)(_Value) \
|
|
)
|
|
|
|
#define NE3200_WRITE_MAILBOX_ULONG(_Adapter, _MailboxIndex, _Value) \
|
|
NdisRawWritePortUlong( \
|
|
(ULONG)(_Adapter)->BaseMailboxPort+(_MailboxIndex), \
|
|
(ULONG)(_Value) \
|
|
)
|
|
|
|
#define NE3200_WRITE_COMMAND_POINTER(_Adapter, _Address) \
|
|
NE3200_WRITE_MAILBOX_ULONG( \
|
|
_Adapter, \
|
|
NE3200_MAILBOX_COMMAND_POINTER, \
|
|
(_Address) \
|
|
)
|
|
|
|
#define NE3200_WRITE_RECEIVE_POINTER(_Adapter, _Address) \
|
|
NE3200_WRITE_MAILBOX_ULONG( \
|
|
_Adapter, \
|
|
NE3200_MAILBOX_RECEIVE_POINTER, \
|
|
(_Address) \
|
|
)
|
|
|
|
#define NE3200_READ_LOCAL_DOORBELL_INTERRUPT(_Adapter, _pValue) \
|
|
NdisRawReadPortUchar( \
|
|
(ULONG)(_Adapter)->LocalDoorbellInterruptPort, \
|
|
(PUCHAR)(_pValue) \
|
|
)
|
|
|
|
#define NE3200_WRITE_LOCAL_DOORBELL_INTERRUPT(_Adapter, _Value) \
|
|
NdisRawWritePortUchar( \
|
|
(ULONG)(_Adapter)->LocalDoorbellInterruptPort, \
|
|
(UCHAR)(_Value) \
|
|
)
|
|
|
|
#define NE3200_READ_SYSTEM_DOORBELL_INTERRUPT(_Adapter, _pValue) \
|
|
NdisRawReadPortUchar( \
|
|
(ULONG)(_Adapter)->SystemDoorbellInterruptPort, \
|
|
(PUCHAR)(_pValue) \
|
|
)
|
|
|
|
#define NE3200_SYNC_CLEAR_SYSTEM_DOORBELL_INTERRUPT(_Adapter) \
|
|
NdisMSynchronizeWithInterrupt(\
|
|
&(_Adapter)->Interrupt,\
|
|
SyncNE3200ClearDoorbellInterrupt,\
|
|
(PVOID)(_Adapter)\
|
|
)
|
|
|
|
#define NE3200_WRITE_SYSTEM_DOORBELL_INTERRUPT(_Adapter, _Value) \
|
|
NdisRawWritePortUchar( \
|
|
(ULONG)(_Adapter)->SystemDoorbellInterruptPort, \
|
|
(UCHAR)(_Value) \
|
|
)
|
|
|
|
#define NE3200_READ_SYSTEM_DOORBELL_MASK(_Adapter, _pValue) \
|
|
NdisRawReadPortUchar( \
|
|
(ULONG)(_Adapter)->SystemDoorbellMaskPort, \
|
|
(PUCHAR)(_pValue) \
|
|
)
|
|
|
|
#define NE3200_WRITE_SYSTEM_DOORBELL_MASK(_Adapter, _Value) \
|
|
NdisRawWritePortUchar( \
|
|
(ULONG)(_Adapter)->SystemDoorbellMaskPort, \
|
|
(UCHAR)(_Value) \
|
|
)
|
|
|
|
#define NE3200_WRITE_SYSTEM_INTERRUPT(_Adapter, _Value) \
|
|
NdisRawWritePortUchar( \
|
|
(ULONG)(_Adapter)->SystemInterruptPort, \
|
|
(UCHAR)(_Value) \
|
|
)
|
|
|
|
#define NE3200_WRITE_RESET(_Adapter, _Value) \
|
|
NdisRawWritePortUchar( \
|
|
(ULONG)(_Adapter)->ResetPort, \
|
|
(UCHAR)(_Value) \
|
|
)
|
|
|
|
#endif // _NE3200HARDWARE_
|