413 lines
9.8 KiB
C
413 lines
9.8 KiB
C
/*++
|
|
|
|
Copyright (c) 1991-4 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
cpqarray.h
|
|
|
|
Abstract:
|
|
|
|
This file contains definitions of structures used to
|
|
communicate with the Compaq Intelligent Disk Array.
|
|
|
|
Author:
|
|
|
|
Mike Glass (mglass)
|
|
Tom Bonola (Compaq)
|
|
|
|
Notes:
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
//
|
|
// The Command List Header contiains information that applies to all
|
|
// the Request Blocks in the Command List.
|
|
//
|
|
|
|
typedef struct _COMMAND_LIST_HEADER {
|
|
|
|
UCHAR LogicalDriveNumber;
|
|
UCHAR RequestPriority;
|
|
USHORT Flags;
|
|
|
|
} COMMAND_LIST_HEADER, *PCOMMAND_LIST_HEADER;
|
|
|
|
//
|
|
// Request Priorities
|
|
//
|
|
|
|
#define CL_NORMAL_PRIORITY 0x02
|
|
|
|
//
|
|
// Flag word bit definitions
|
|
//
|
|
|
|
#define CL_FLAGS_NOTIFY_LIST_COMPLETE 0x0000
|
|
#define CL_FLAGS_NOTIFY_REQUEST_COMPLETE 0x0001
|
|
#define CL_FLAGS_NOTIFY_LIST_ERROR 0x0000
|
|
#define CL_FLAGS_NOTIFY_REQUEST_ERROR 0x0002
|
|
#define CL_FLAGS_ABORT_ON_ERROR 0x0004
|
|
#define CL_FLAGS_ORDERED_REQUESTS 0x0008
|
|
|
|
typedef struct _REQUEST_HEADER {
|
|
|
|
USHORT NextRequestOffset;
|
|
UCHAR CommandByte;
|
|
UCHAR ErrorCode;
|
|
ULONG BlockNumber;
|
|
USHORT BlockCount;
|
|
UCHAR ScatterGatherCount;
|
|
UCHAR Reserved;
|
|
|
|
} REQUEST_HEADER, *PREQUEST_HEADER;
|
|
|
|
//
|
|
// Error code definitions
|
|
//
|
|
|
|
#define RH_SUCCESS 0x00
|
|
#define RH_INVALID_REQUEST 0x10
|
|
#define RH_REQUEST_ABORTED 0x08
|
|
#define RH_FATAL_ERROR 0x04
|
|
#define RH_RECOVERABLE_ERROR 0x02
|
|
#define RH_WARNING 0x40
|
|
#define RH_BAD_COMMAND_LIST 0x20
|
|
|
|
//
|
|
// Scatter/Gather descriptor definition
|
|
//
|
|
|
|
#define PAGE_SIZE (ULONG)0x1000
|
|
#define MAXIMUM_SG_DESCRIPTORS 17
|
|
#define MAXIMUM_TRANSFER_SIZE (MAXIMUM_SG_DESCRIPTORS - 1) * PAGE_SIZE
|
|
|
|
typedef struct _SG_DESCRIPTOR {
|
|
|
|
ULONG Length;
|
|
ULONG Address;
|
|
|
|
} SG_DESCRIPTOR, *PSG_DESCRIPTOR;
|
|
|
|
//
|
|
// Command List
|
|
//
|
|
|
|
typedef struct _COMMAND_LIST {
|
|
|
|
//
|
|
// Compaq RLH.
|
|
//
|
|
|
|
COMMAND_LIST_HEADER CommandListHeader;
|
|
REQUEST_HEADER RequestHeader;
|
|
SG_DESCRIPTOR SgDescriptor[MAXIMUM_SG_DESCRIPTORS];
|
|
|
|
//
|
|
// Next list entry
|
|
//
|
|
|
|
struct _COMMAND_LIST *NextEntry;
|
|
|
|
//
|
|
// SRB pointer
|
|
//
|
|
|
|
PSCSI_REQUEST_BLOCK SrbAddress;
|
|
|
|
//
|
|
// Request tracking flags
|
|
//
|
|
|
|
ULONG Flags;
|
|
|
|
//
|
|
// Command list size.
|
|
//
|
|
|
|
USHORT CommandListSize;
|
|
|
|
} COMMAND_LIST, *PCOMMAND_LIST;
|
|
|
|
//
|
|
// Commands
|
|
//
|
|
|
|
#define RH_COMMAND_IDENTIFY_LOGICAL_DRIVES 0x10
|
|
#define RH_COMMAND_IDENTIFY_CONTROLLER 0x11
|
|
#define RH_COMMAND_IDENTIFY_LOGICAL_DRIVE_STATUS 0x12
|
|
#define RH_COMMAND_READ 0x20
|
|
#define RH_COMMAND_WRITE 0x30
|
|
#define RH_COMMAND_SENSE_CONFIGURATION 0x50
|
|
#define RH_COMMAND_SET_CONFIGURATION 0x51
|
|
#define RH_COMMAND_FLUSH_DISABLE_CACHE 0xc2
|
|
#define RH_COMMAND_SCSI_PASS_THRU 0x90
|
|
|
|
//
|
|
// Flag field bit definitions
|
|
//
|
|
|
|
#define CL_FLAGS_REQUEST_QUEUED 0x0001
|
|
#define CL_FLAGS_REQUEST_STARTED 0x0002
|
|
#define CL_FLAGS_REQUEST_COMPLETED 0x0004
|
|
#define CL_FLAGS_IDENTIFY_REQUEST 0x0008
|
|
|
|
//
|
|
// Fixed Disk Parameter Table
|
|
//
|
|
|
|
#pragma pack(1)
|
|
|
|
typedef struct _DISK_PARAMETER_TABLE {
|
|
|
|
USHORT MaximumCylinders; // BIOS translated
|
|
UCHAR MaximumHeads; // BIOS translated
|
|
UCHAR TranslationSignature;
|
|
UCHAR SectorsPerTrack; // physical characteristics
|
|
USHORT WritePrecompCylinder;
|
|
UCHAR MaximumECCBurst;
|
|
UCHAR DriveControl;
|
|
USHORT NumberOfCylinders; // physical characteristics
|
|
UCHAR NumberOfHeads; // physical characteristics
|
|
USHORT LandingZone;
|
|
UCHAR MaximumSectorsPerTrack; // BIOS translated
|
|
UCHAR CheckSum;
|
|
|
|
} DISK_PARAMETER_TABLE, *PDISK_PARAMETER_TABLE;
|
|
|
|
#define IDENTIFY_BUFFER_SIZE 512
|
|
|
|
//
|
|
// Identify Logical Drives
|
|
//
|
|
|
|
typedef struct _IDENTIFY_LOGICAL_DRIVE {
|
|
|
|
USHORT BlockLength;
|
|
ULONG NumberOfBlocks;
|
|
DISK_PARAMETER_TABLE ParameterTable;
|
|
UCHAR FaultToleranceType;
|
|
UCHAR Reserved[5];
|
|
|
|
} IDENTIFY_LOGICAL_DRIVE, *PIDENTIFY_LOGICAL_DRIVE;
|
|
|
|
//
|
|
// Identify Controller information
|
|
//
|
|
|
|
typedef struct _IDENTIFY_CONTROLLER {
|
|
|
|
UCHAR NumberLogicalDrives;
|
|
ULONG ConfigurationSignature;
|
|
UCHAR FirmwareRevision[4];
|
|
UCHAR Reserved[247];
|
|
|
|
} IDENTIFY_CONTROLLER, *PIDENTIFY_CONTROLLER;
|
|
|
|
//
|
|
// Set/Sense Configuration information
|
|
//
|
|
|
|
typedef struct _SENSE_CONFIGURATION {
|
|
|
|
ULONG ConfigurationSignature;
|
|
USHORT SiConfiguration;
|
|
USHORT OsConfiguration;
|
|
USHORT NumberPhysicalDrives;
|
|
USHORT PDrivesInLDrives;
|
|
USHORT FaultToleranceType;
|
|
UCHAR PhysicalDrive[16];
|
|
UCHAR LogicalDrive[16];
|
|
ULONG DriveAssignmentMap;
|
|
UCHAR Reserved[462];
|
|
|
|
} SENSE_CONFIGURATION, *PCONFIGURATION;
|
|
|
|
//
|
|
// Fault Tolerance Type
|
|
//
|
|
|
|
#define FT_DATA_GUARD 0x0002
|
|
#define FT_MIRRORING 0x0001
|
|
#define FT_NONE_ 0x0000
|
|
|
|
//
|
|
// Drive Failure Assignment Map
|
|
//
|
|
|
|
typedef struct _DRIVE_FAILURE_MAP {
|
|
|
|
UCHAR LogicalDriveStatus;
|
|
UCHAR DriveFailureAssignmentMap[4];
|
|
UCHAR Reserved[251];
|
|
|
|
} DRIVE_FAILURE_MAP, *PDRIVE_FAILURE_MAP;
|
|
|
|
#pragma pack()
|
|
|
|
typedef struct _MAILBOX {
|
|
|
|
ULONG Address;
|
|
USHORT Length;
|
|
UCHAR Status;
|
|
UCHAR TagId;
|
|
|
|
} MAILBOX, *PMAILBOX;
|
|
|
|
//
|
|
// Command List Status bit definitions
|
|
//
|
|
|
|
#define CL_STATUS_LIST_COMPLETE 0x01
|
|
#define CL_STATUS_NONFATAL_ERROR 0x02
|
|
#define CL_STATUS_FATAL_ERROR 0x04
|
|
#define CL_STATUS_ABORT 0x08
|
|
|
|
//
|
|
// 32-bit IDA Controller registers
|
|
//
|
|
|
|
typedef struct _IDA_CONTROLLER {
|
|
|
|
ULONG BoardId; // xC80
|
|
UCHAR Undefined[4]; // xC84
|
|
UCHAR Configuration; // xC88
|
|
UCHAR InterruptControl; // xC89
|
|
UCHAR Undefined1[2]; // xC8A
|
|
UCHAR LocalDoorBellMask; // xC8C
|
|
UCHAR LocalDoorBell; // xC8D
|
|
UCHAR SystemDoorBellMask; // xC8E
|
|
UCHAR SystemDoorBell; // xC8F
|
|
MAILBOX CommandListSubmit; // xC90
|
|
MAILBOX CommandListComplete; // xC98`
|
|
UCHAR Reserved[32]; // xCA0
|
|
UCHAR ControllerConfiguration; // xCC0
|
|
|
|
} IDA_CONTROLLER, *PIDA_CONTROLLER;
|
|
|
|
//
|
|
// Controller bHBAModel definitions
|
|
//
|
|
#define IDA_UNDEFINED_CONTROLLER 0
|
|
#define IDA_BASE_CONTROLLER 1
|
|
#define IDA_PCI_DAZZLER 2
|
|
#define IDA_EISA_DAZZLER 3
|
|
|
|
//
|
|
// DAZZLER PCI interface definitions for EISA I/O space
|
|
//
|
|
|
|
typedef struct _EISAPCI_CONTROLLER {
|
|
|
|
ULONG Timer; // x000
|
|
ULONG CPFIFO; // x004
|
|
ULONG CCFIFO; // x008
|
|
ULONG InterruptMask; // x00C
|
|
ULONG InterruptStatus; // x010
|
|
ULONG InterruptPending; // x014
|
|
|
|
} EISAPCI_CONTROLLER, *PEISAPCI_CONTROLLER;
|
|
|
|
#define IDA_PCI_TIMER_OFFSET 0
|
|
#define IDA_PCI_CPFIFO_OFFSET 4
|
|
#define IDA_PCI_CCFIFO_OFFSET 8
|
|
#define IDA_PCI_MASK_OFFSET 12
|
|
#define IDA_PCI_STATUS_OFFSET 16
|
|
#define IDA_PCI_PENDING_OFFSET 20
|
|
|
|
#define IDA_PCI_IRQ_DISABLE_MASK 0x00000000
|
|
#define IDA_PCI_FIFO_NOT_EMPTY_MASK 0x00000001
|
|
#define IDA_PCI_FIFO_NOT_FULL_MASK 0x00000002
|
|
#define IDA_PCI_COMPLETION_STATUS_ACTIVE 0x00000001
|
|
#define IDA_PCI_ISSUE_STATUS_CLEAR 0x00000002
|
|
|
|
#define IDA_PCI_PHYS_ADDR_MASK 0xfffffffc
|
|
#define IDA_PCI_COMPLETION_STATUS_MASK 0x00000003
|
|
#define IDA_PCI_COMPLETION_ERROR 0x00000001
|
|
|
|
#define IDA_PCI_COMPAQ_ID 0x00000E11
|
|
#define IDA_PCI_DAZZLER_DEVICE_ID 0x0000AE10
|
|
#define IDA_EISA_ID_MASKID_LOW 0xff000000
|
|
|
|
#define IDA_PCI_NUM_ACCESS_RANGES 3
|
|
|
|
typedef struct _PCI_IDENTIFIER {
|
|
USHORT usVendorID;
|
|
USHORT usDeviceID;
|
|
} PCI_IDENTIFIER, *PPCI_IDENTIFIER;
|
|
|
|
typedef struct _IDA_CONTEXT {
|
|
UCHAR bHBAModel;
|
|
USHORT usEisaSlot;
|
|
PCI_IDENTIFIER PciIdentifier;
|
|
PCI_ADDRESS PciAddress;
|
|
} IDA_CONTEXT, *PIDA_CONTEXT;
|
|
|
|
|
|
//
|
|
// System Doorbell Interrupt Register bit definitions
|
|
//
|
|
|
|
#define SYSTEM_DOORBELL_COMMAND_LIST_COMPLETE 0x01
|
|
#define SYSTEM_DOORBELL_SUBMIT_CHANNEL_CLEAR 0x02
|
|
|
|
//
|
|
// Local Doorbell Interrupt Register bit definitions
|
|
//
|
|
|
|
#define LOCAL_DOORBELL_COMMAND_LIST_SUBMIT 0x01
|
|
#define LOCAL_DOORBELL_COMPLETE_CHANNEL_CLEAR 0x02
|
|
|
|
//
|
|
// Doorbell register channel clear bit
|
|
//
|
|
|
|
#define IDA_CHANNEL_CLEAR 0x01
|
|
|
|
//
|
|
// Interrupt Control register bit definitions
|
|
//
|
|
|
|
#define IDA_INTERRUPT_PENDING 0x02
|
|
|
|
//
|
|
// System doorbell register interrupt mask
|
|
//
|
|
|
|
#define IDA_COMPLETION_INTERRUPT_ENABLE 0x01
|
|
|
|
//
|
|
// Controller Configuration Register bit definitions
|
|
//
|
|
|
|
#define STANDARD_INTERFACE_ENABLE 0x01
|
|
#define STANDARD_INTERFACE_SECONDARY_IO_ADDRESS 0x02
|
|
#define BUS_MASTER_DISABLE 0x04
|
|
#define SOFTWARE_RESET 0x08
|
|
#define BUS_MASTER_INTERRUPT_11_ENABLE 0x10
|
|
#define BUS_MASTER_INTERRUPT_10_ENABLE 0x20
|
|
#define BUS_MASTER_INTERRUPT_14_ENABLE 0x40
|
|
#define BUS_MASTER_INTERRUPT_15_ENABLE 0x80
|
|
|
|
//
|
|
// Disk configuration information
|
|
//
|
|
|
|
typedef struct _DISK_CONFIGURATION {
|
|
|
|
UCHAR NumberLogicalDrives;
|
|
IDENTIFY_LOGICAL_DRIVE LogicalDriveInformation[2];
|
|
|
|
} DISK_CONFIGURATION, *PDISK_CONFIGURATION;
|
|
|
|
//
|
|
// structure for the flush/disable cache command
|
|
//
|
|
typedef struct _FLUSH_DISABLE {
|
|
USHORT disable_flag;
|
|
UCHAR reserved[30];
|
|
} FLUSH_DISABLE, *PFLUSH_DISABLE;
|
|
|