diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/miniport/aha154x/aha154x.h | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to 'private/ntos/miniport/aha154x/aha154x.h')
-rw-r--r-- | private/ntos/miniport/aha154x/aha154x.h | 472 |
1 files changed, 472 insertions, 0 deletions
diff --git a/private/ntos/miniport/aha154x/aha154x.h b/private/ntos/miniport/aha154x/aha154x.h new file mode 100644 index 000000000..6339c4e09 --- /dev/null +++ b/private/ntos/miniport/aha154x/aha154x.h @@ -0,0 +1,472 @@ +/*++ + +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; |