NT4/private/ntos/miniport/aha154x/aha154x.h
2020-09-30 17:12:29 +02:00

473 lines
13 KiB
C

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
aha154x.h
Abstract:
This module contains the structures, specific to the Adaptec aha154x
host bus adapter, used by the SCSI miniport driver. Data structures
that are part of standard ANSI SCSI will be defined in a header
file that will be available to all SCSI device drivers.
Author:
Mike Glass December 1990
Bill Williams (Adaptec)
Revision History:
--*/
#include "scsi.h"
//
// The following definitions are used to convert ULONG addresses
// to Adaptec's 3 byte address format.
//
typedef struct _THREE_BYTE {
UCHAR Msb;
UCHAR Mid;
UCHAR Lsb;
} THREE_BYTE, *PTHREE_BYTE;
//
// Convert four-byte Little Endian to three-byte Big Endian
//
#define FOUR_TO_THREE(Three, Four) { \
ASSERT(!((Four)->Byte3)); \
(Three)->Lsb = (Four)->Byte0; \
(Three)->Mid = (Four)->Byte1; \
(Three)->Msb = (Four)->Byte2; \
}
#define THREE_TO_FOUR(Four, Three) { \
(Four)->Byte0 = (Three)->Lsb; \
(Four)->Byte1 = (Three)->Mid; \
(Four)->Byte2 = (Three)->Msb; \
(Four)->Byte3 = 0; \
}
//
// Context information for adapter scan/sniff
//
typedef struct _SCAN_CONTEXT {
ULONG adapterCount;
ULONG biosScanStart;
} SCAN_CONTEXT, *PSCAN_CONTEXT;
///////////////////////////////////////////////////////////////////////////////
//
// CCB - Adaptec SCSI Command Control Block
//
// The CCB is a superset of the CDB (Command Descriptor Block)
// and specifies detailed information about a SCSI command.
//
///////////////////////////////////////////////////////////////////////////////
//
// Byte 0 Command Control Block Operation Code
//
#define SCSI_INITIATOR_OLD_COMMAND 0x00
#define TARGET_MODE_COMMAND 0x01
#define SCATTER_GATHER_OLD_COMMAND 0x02
#define SCSI_INITIATOR_COMMAND 0x03
#define SCATTER_GATHER_COMMAND 0x04
//
// Byte 1 Address and Direction Control
//
#define CCB_TARGET_ID_SHIFT 0x06 // CCB Op Code = 00, 02
#define CCB_INITIATOR_ID_SHIFT 0x06 // CCB Op Code = 01
#define CCB_DATA_XFER_OUT 0x10 // Write
#define CCB_DATA_XFER_IN 0x08 // Read
#define CCB_LUN_MASK 0x07 // Logical Unit Number
//
// Byte 2 SCSI_Command_Length - Length of SCSI CDB
//
// Byte 3 Request Sense Allocation Length
//
#define FOURTEEN_BYTES 0x00 // Request Sense Buffer size
#define NO_AUTO_REQUEST_SENSE 0x01 // No Request Sense Buffer
//
// Bytes 4, 5 and 6 Data Length // Data transfer byte count
//
// Bytes 7, 8 and 9 Data Pointer // SGD List or Data Buffer
//
// Bytes 10, 11 and 12 Link Pointer // Next CCB in Linked List
//
// Byte 13 Command Link ID // TBD (I don't know yet)
//
// Byte 14 Host Status // Host Adapter status
//
#define CCB_COMPLETE 0x00 // CCB completed without error
#define CCB_LINKED_COMPLETE 0x0A // Linked command completed
#define CCB_LINKED_COMPLETE_INT 0x0B // Linked complete with interrupt
#define CCB_SELECTION_TIMEOUT 0x11 // Set SCSI selection timed out
#define CCB_DATA_OVER_UNDER_RUN 0x12
#define CCB_UNEXPECTED_BUS_FREE 0x13 // Target dropped SCSI BSY
#define CCB_PHASE_SEQUENCE_FAIL 0x14 // Target bus phase sequence failure
#define CCB_BAD_MBO_COMMAND 0x15 // MBO command not 0, 1 or 2
#define CCB_INVALID_OP_CODE 0x16 // CCB invalid operation code
#define CCB_BAD_LINKED_LUN 0x17 // Linked CCB LUN different from first
#define CCB_INVALID_DIRECTION 0x18 // Invalid target direction
#define CCB_DUPLICATE_CCB 0x19 // Duplicate CCB
#define CCB_INVALID_CCB 0x1A // Invalid CCB - bad parameter
//
// Byte 15 Target Status
//
// See SCSI.H files for these statuses.
//
//
// Bytes 16 and 17 Reserved (must be 0)
//
//
// Bytes 18 through 18+n-1, where n=size of CDB Command Descriptor Block
//
//
// Bytes 18+n through 18+m-1, where m=buffer size Allocated for Sense Data
//
#define REQUEST_SENSE_BUFFER_SIZE 18
///////////////////////////////////////////////////////////////////////////////
//
// Scatter/Gather Segment List Definitions
//
///////////////////////////////////////////////////////////////////////////////
//
// Adapter limits
//
#define MAX_SG_DESCRIPTORS 17
#define MAX_TRANSFER_SIZE 64 * 1024
//
// Scatter/Gather Segment Descriptor Definition
//
typedef struct _SGD {
THREE_BYTE Length;
THREE_BYTE Address;
} SGD, *PSGD;
typedef struct _SDL {
SGD Sgd[MAX_SG_DESCRIPTORS];
} SDL, *PSDL;
#define SEGMENT_LIST_SIZE MAX_SG_DESCRIPTORS * sizeof(SGD)
///////////////////////////////////////////////////////////////////////////////
//
// CCB Typedef
//
typedef struct _CCB {
UCHAR OperationCode;
UCHAR ControlByte;
UCHAR CdbLength;
UCHAR RequestSenseLength;
THREE_BYTE DataLength;
THREE_BYTE DataPointer;
THREE_BYTE LinkPointer;
UCHAR LinkIdentifier;
UCHAR HostStatus;
UCHAR TargetStatus;
UCHAR Reserved[2];
UCHAR Cdb[MAXIMUM_CDB_SIZE];
PVOID SrbAddress;
PVOID AbortSrb;
SDL Sdl;
UCHAR RequestSenseBuffer[REQUEST_SENSE_BUFFER_SIZE];
} CCB, *PCCB;
//
// CCB and request sense buffer
//
#define CCB_SIZE sizeof(CCB)
///////////////////////////////////////////////////////////////////////////////
//
// Adapter Command Overview
//
// Adapter commands are issued by writing to the Command/Data Out port.
// They are used to initialize the host adapter and to establish control
// conditions within the host adapter. They may not be issued when there
// are outstanding SCSI commands.
//
// All adapter commands except Start SCSI(02) and Enable Mailbox-Out
// Interrupt(05) must be executed only when the IDLE bit (Status bit 4)
// is one. Many commands require additional parameter bytes which are
// then written to the Command/Data Out I/O port (base+1). Before each
// byte is written by the host to the host adapter, the host must verify
// that the CDF bit (Status bit 3) is zero, indicating that the command
// port is ready for another byte of information. The host adapter usually
// clears the Command/Data Out port within 100 microseconds. Some commands
// require information bytes to be returned from the host adapter to the
// host. In this case, the host monitors the DF bit (Status bit 2) to
// determine when the host adapter has placed a byte in the Data In I/O
// port for the host to read. The DF bit is reset automatically when the
// host reads the byte. The format of each adapter command is strictly
// defined, so the host adapter and host system can always agree upon the
// correct number of parameter bytes to be transferred during a command.
//
//
///////////////////////////////////////////////////////////////////////////////
//
// Host Adapter Command Operation Codes
//
#define AC_NO_OPERATION 0x00
#define AC_MAILBOX_INITIALIZATION 0x01
#define AC_START_SCSI_COMMAND 0x02
#define AC_START_BIOS_COMMAND 0x03
#define AC_ADAPTER_INQUIRY 0x04
#define AC_ENABLE_MBO_AVAIL_INT 0x05
#define AC_SET_SELECTION_TIMEOUT 0x06
#define AC_SET_BUS_ON_TIME 0x07
#define AC_SET_BUS_OFF_TIME 0x08
#define AC_SET_TRANSFER_SPEED 0x09
#define AC_RET_INSTALLED_DEVICES 0x0A
#define AC_RET_CONFIGURATION_DATA 0x0B
#define AC_ENABLE_TARGET_MODE 0x0C
#define AC_RETURN_SETUP_DATA 0x0D
#define AC_WRITE_CHANNEL_2_BUFFER 0x1A
#define AC_READ_CHANNEL_2_BUFFER 0x1B
#define AC_WRITE_FIFO_BUFFER 0x1C
#define AC_READ_FIFO_BUFFER 0x1D
#define AC_ECHO_COMMAND_DATA 0x1F
#define AC_SET_HA_OPTION 0x21
#define AC_RETURN_EEPROM 0x23
#define AC_GET_BIOS_INFO 0x28
#define AC_SET_MAILBOX_INTERFACE 0x29
#define AC_EXTENDED_SETUP_INFO 0x8D
//
//Adapter commands new to the AHA-154xCP are defined below.
//
#define AC_SET_DMS_BUS_SPEED 0x2B
#define AC_TERMINATION_AND_CABLE_STATUS 0x2C
#define AC_DEVICE_INQUIRY 0x2D
#define AC_SCSI_DEVICE_TABLE 0x2E
#define AC_PERFORM_SCAM 0x2F
//
// EEPROM define for SCAM
//
#define SCSI_BUS_CONTROL_FLAG 0x06
#define SCAM_ENABLED 0x40
//
// DMA Transfer Speeds
//
#define DMA_SPEED_50_MBS 0x00
//
// I/O Port Interface
//
typedef struct _BASE_REGISTER {
UCHAR StatusRegister;
UCHAR CommandRegister;
UCHAR InterruptRegister;
} BASE_REGISTER, *PBASE_REGISTER;
//
// Base+0 Write: Control Register
//
#define IOP_HARD_RESET 0x80 // bit 7
#define IOP_SOFT_RESET 0x40 // bit 6
#define IOP_INTERRUPT_RESET 0x20 // bit 5
#define IOP_SCSI_BUS_RESET 0x10 // bit 4
//
// Base+0 Read: Status
//
#define IOP_SELF_TEST 0x80 // bit 7
#define IOP_INTERNAL_DIAG_FAILURE 0x40 // bit 6
#define IOP_MAILBOX_INIT_REQUIRED 0x20 // bit 5
#define IOP_SCSI_HBA_IDLE 0x10 // bit 4
#define IOP_COMMAND_DATA_OUT_FULL 0x08 // bit 3
#define IOP_DATA_IN_PORT_FULL 0x04 // bit 2
#define IOP_INVALID_COMMAND 0X01 // bit 1
//
// Base+1 Write: Command/Data Out
//
//
// Base+1 Read: Data In
//
//
// Base+2 Read: Interrupt Flags
//
#define IOP_ANY_INTERRUPT 0x80 // bit 7
#define IOP_SCSI_RESET_DETECTED 0x08 // bit 3
#define IOP_COMMAND_COMPLETE 0x04 // bit 2
#define IOP_MBO_EMPTY 0x02 // bit 1
#define IOP_MBI_FULL 0x01 // bit 0
///////////////////////////////////////////////////////////////////////////////
//
// Mailbox Definitions
//
//
///////////////////////////////////////////////////////////////////////////////
//
// Mailbox Definition
//
#define MB_COUNT 0x08 // number of mailboxes
//
// Mailbox Out
//
typedef struct _MBO {
UCHAR Command;
THREE_BYTE Address;
} MBO, *PMBO;
//
// MBO Command Values
//
#define MBO_FREE 0x00
#define MBO_START 0x01
#define MBO_ABORT 0x02
//
// Mailbox In
//
typedef struct _MBI {
UCHAR Status;
THREE_BYTE Address;
} MBI, *PMBI;
//
// MBI Status Values
//
#define MBI_FREE 0x00
#define MBI_SUCCESS 0x01
#define MBI_ABORT 0x02
#define MBI_NOT_FOUND 0x03
#define MBI_ERROR 0x04
//
// Mailbox Initialization
//
typedef struct _MAILBOX_INIT {
UCHAR Count;
THREE_BYTE Address;
} MAILBOX_INIT, *PMAILBOX_INIT;
#define MAILBOX_UNLOCK 0x00
#define TRANSLATION_LOCK 0x01 // mailbox locked for extended BIOS
#define DYNAMIC_SCAN_LOCK 0x02 // mailbox locked for 154xC
#define TRANSLATION_ENABLED 0x08 // extended BIOS translation (1023/64)
//
// Scatter/Gather firmware bug detection
//
#define BOARD_ID 0x00
#define HARDWARE_ID 0x01
#define FIRMWARE_ID 0x02
#define OLD_BOARD_ID1 0x00
#define OLD_BOARD_ID2 0x30
#define A154X_BOARD 0x41
#define A154X_BAD_HARDWARE_ID 0x30
#define A154X_BAD_FIRMWARE_ID 0x33
//
// MCA specific definitions.
//
#define NUMBER_POS_SLOTS 8
#define POS_IDENTIFIER 0x0F1F
#define POS_PORT_MASK 0xC7
#define POS_PORT_130 0x01
#define POS_PORT_134 0x41
#define POS_PORT_230 0x02
#define POS_PORT_234 0x42
#define POS_PORT_330 0x03
#define POS_PORT_334 0x43
typedef struct _POS_DATA {
USHORT AdapterId;
UCHAR BiosEnabled;
UCHAR IoPortInformation;
UCHAR ScsiInformation;
UCHAR DmaInformation;
} POS_DATA, *PPOS_DATA;
typedef struct _INIT_DATA {
ULONG AdapterId;
ULONG CardSlot;
POS_DATA PosData[NUMBER_POS_SLOTS];
} INIT_DATA, *PINIT_DATA;
//
// Real Mode Adapter Config Info
//
typedef struct _RM_SAVRES {
UCHAR SDTPar;
UCHAR TxSpeed;
UCHAR BusOnTime;
UCHAR BusOffTime;
UCHAR NumMailBoxes;
UCHAR MBAddrHiByte;
UCHAR MBAddrMiByte;
UCHAR MBAddrLoByte;
UCHAR SyncNeg[8];
UCHAR DisOpt;
} RM_CFG, *PRM_CFG;
//
//AMI Detect Code
//
#define AC_AMI_INQUIRY 0x41 // Get model number, ect. (ASCIIZ)
//
// I/O Port Interface
//
typedef struct _X330_REGISTER {
UCHAR StatusRegister;
UCHAR CommandRegister;
UCHAR InterruptRegister;
UCHAR DiagRegister;
} X330_REGISTER, *PX330_REGISTER;