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.
428 lines
10 KiB
428 lines
10 KiB
/*++
|
|
|
|
Copyright (c) 1994 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Dac960Nt.h
|
|
|
|
Abstract:
|
|
|
|
This is header file for the driver for the Mylex 960 family.
|
|
|
|
Author:
|
|
|
|
Mike Glass (mglass)
|
|
|
|
Environment:
|
|
|
|
kernel mode only
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "scsi.h"
|
|
|
|
//
|
|
// SG list size is 17, one additional entry to support Fw 3.x format
|
|
//
|
|
|
|
#define MAXIMUM_SGL_DESCRIPTORS 0x12
|
|
|
|
#define MAXIMUM_TRANSFER_LENGTH 0xF000
|
|
#define MAXIMUM_EISA_SLOTS 0x10
|
|
#define MAXIMUM_CHANNELS 0x05
|
|
#define MAXIMUM_TARGETS_PER_CHANNEL 0x07
|
|
|
|
#define DAC_EISA_ID 0x70009835
|
|
|
|
#define DAC960_SYSTEM_DRIVE 0x08
|
|
#define DAC960_DEVICE_NOT_ACCESSIBLE 0x00
|
|
#define DAC960_DEVICE_ACCESSIBLE 0x01
|
|
|
|
//
|
|
// DAC960 mailbox register definition
|
|
//
|
|
|
|
typedef struct _MAILBOX {
|
|
UCHAR OperationCode; // zC90
|
|
UCHAR CommandIdSubmit; // zC91
|
|
USHORT BlockCount; // zC92
|
|
UCHAR BlockNumber[3]; // zC94
|
|
UCHAR DriveNumber; // zC97
|
|
ULONG PhysicalAddress; // zC98
|
|
UCHAR ScatterGatherCount; // zC9C
|
|
UCHAR CommandIdComplete; // zC9D
|
|
USHORT Status; // zC9E
|
|
} MAILBOX, *PMAILBOX;
|
|
|
|
//
|
|
// DAC960 mailbox register definition for DAC960 Extended Commands
|
|
//
|
|
|
|
typedef struct _EXTENDED_MAILBOX {
|
|
UCHAR OperationCode; // zC90
|
|
UCHAR CommandIdSubmit; // zC91
|
|
USHORT BlockCount; // zC92
|
|
UCHAR BlockNumber[4]; // zC94
|
|
ULONG PhysicalAddress; // zC98
|
|
UCHAR DriveNumber; // zC9C
|
|
UCHAR CommandIdComplete; // zC9D
|
|
USHORT Status; // zC9E
|
|
} EXTENDED_MAILBOX, *PEXTENDED_MAILBOX;
|
|
|
|
//
|
|
// DAC960 EISA register definition
|
|
//
|
|
|
|
typedef struct _EISA_REGISTERS {
|
|
ULONG EisaId; // zC80
|
|
UCHAR NotUsed1[4]; // zC84
|
|
UCHAR GlobalConfiguration; // zC88
|
|
UCHAR InterruptEnable; // zC89
|
|
UCHAR NotUsed2[2]; // zC9A
|
|
UCHAR LocalDoorBellEnable; // zC8C
|
|
UCHAR LocalDoorBell; // zC8D
|
|
UCHAR SystemDoorBellEnable; // zC8E
|
|
UCHAR SystemDoorBell; // zC8F
|
|
MAILBOX MailBox; // zC90
|
|
UCHAR Unused4[33]; // zCA0
|
|
UCHAR BiosAddress; // zCC1
|
|
UCHAR Unused5; // zCC2
|
|
UCHAR InterruptLevel; // zCC3
|
|
} EISA_REGISTERS, *PEISA_REGISTERS;
|
|
|
|
//
|
|
// DAC960 PCI register definition
|
|
//
|
|
|
|
typedef struct _PCI_REGISTERS {
|
|
MAILBOX MailBox; // 0x00
|
|
UCHAR NotUsed1[48]; // 0x10
|
|
UCHAR LocalDoorBell; // 0x40
|
|
UCHAR SystemDoorBell; // 0x41
|
|
UCHAR NotUsed2[1]; // 0x42
|
|
UCHAR InterruptEnable; // 0x43
|
|
} PCI_REGISTERS, *PPCI_REGISTERS;
|
|
|
|
|
|
//
|
|
// Local doorbell definition
|
|
//
|
|
|
|
#define DAC960_LOCAL_DOORBELL_SUBMIT_BUSY 0x01
|
|
#define DAC960_LOCAL_DOORBELL_MAILBOX_FREE 0x02
|
|
|
|
//
|
|
// System doorbell definition
|
|
//
|
|
|
|
#define DAC960_SYSTEM_DOORBELL_COMMAND_COMPLETE 0x01
|
|
#define DAC960_SYSTEM_DOORBELL_SUBMISSION_COMPLETE 0x02
|
|
|
|
//
|
|
// Command complete status
|
|
//
|
|
|
|
#define DAC960_STATUS_GOOD 0x0000
|
|
#define DAC960_STATUS_ERROR 0x0001
|
|
#define DAC960_STATUS_NO_DRIVE 0x0002 // system drives
|
|
#define DAC960_STATUS_CHECK_CONDITION 0x0002 // pass-through
|
|
#define DAC960_STATUS_BUSY 0x0008
|
|
#define DAC960_STATUS_SELECT_TIMEOUT 0x000F
|
|
#define DAC960_STATUS_DEVICE_TIMEOUT 0x000E
|
|
#define DAC960_STATUS_NOT_IMPLEMENTED 0x0104
|
|
#define DAC960_STATUS_BOUNDS_ERROR 0x0105
|
|
|
|
//
|
|
// Command codes
|
|
//
|
|
|
|
#define DAC960_COMMAND_READ 0x02 // DAC960 Fw Ver < 3.x
|
|
#define DAC960_COMMAND_READ_EXT 0x33 // DAC960 Fw Ver >= 3.x
|
|
#define DAC960_COMMAND_WRITE 0x03 // DAC960 Fw Ver < 3.x
|
|
#define DAC960_COMMAND_WRITE_EXT 0x34 // DAC960 Fw Ver >= 3.x
|
|
#define DAC960_COMMAND_DIRECT 0x04
|
|
#define DAC960_COMMAND_ENQUIRE 0x05 // DAC960 Fw Ver < 3.x
|
|
#define DAC960_COMMAND_ENQUIRE_3X 0x53 // DAC960 Fw Ver >= 3.x
|
|
#define DAC960_COMMAND_FLUSH 0x0A
|
|
#define DAC960_COMMAND_RESET 0x1A
|
|
#define DAC960_COMMAND_ENQUIRE2 0x1C
|
|
#define DAC960_COMMAND_SG 0x80
|
|
#define DAC960_COMMAND_EXTENDED 0x31 // DAC960 Fw Ver >= 3.x
|
|
|
|
//
|
|
// Define BIOS enabled bit
|
|
//
|
|
|
|
#define DAC960_BIOS_ENABLED 0x40
|
|
|
|
//
|
|
// Scatter Gather List
|
|
//
|
|
|
|
typedef struct _SG_DESCRIPTOR {
|
|
ULONG Address;
|
|
ULONG Length;
|
|
} SG_DESCRIPTOR, *PSG_DESCRIPTOR;
|
|
|
|
typedef struct _SGL {
|
|
SG_DESCRIPTOR Descriptor[1];
|
|
} SGL, *PSGL;
|
|
|
|
//
|
|
// Enquiry data, DAC960 Fw < 3.x
|
|
//
|
|
|
|
typedef struct _DAC960_ENQUIRY {
|
|
UCHAR NumberOfDrives; // 00
|
|
UCHAR Unused1[3]; // 01
|
|
ULONG SectorSize[8]; // 04
|
|
USHORT NumberOfFlashes; // 36
|
|
UCHAR StatusFlags; // 38
|
|
UCHAR FreeStateChangeCount; // 39
|
|
UCHAR MinorFirmwareRevision; // 40
|
|
UCHAR MajorFirmwareRevision; // 41
|
|
UCHAR RebuildFlag; // 42
|
|
UCHAR NumberOfConcurrentCommands; // 43
|
|
UCHAR NumberOfOfflineDrives; // 44
|
|
UCHAR Unused2[3]; // 45
|
|
UCHAR NumberOfCriticalDrives; // 48
|
|
UCHAR Unused3[3]; // 49
|
|
UCHAR NumberOfDeadDisks; // 52
|
|
UCHAR Unused4; // 53
|
|
UCHAR NumberOfRebuildingDisks; // 54
|
|
UCHAR MiscellaneousFlags; // 55
|
|
} DAC960_ENQUIRY, *PDAC960_ENQUIRY;
|
|
|
|
//
|
|
// Enquiry data, DAC960 Fw >= 3.x
|
|
//
|
|
|
|
typedef struct _DAC960_ENQUIRY_3X {
|
|
UCHAR NumberOfDrives; // 00
|
|
UCHAR Unused1[3]; // 01
|
|
ULONG SectorSize[32]; // 04
|
|
USHORT NumberOfFlashes; // 100
|
|
UCHAR StatusFlags; // 102
|
|
UCHAR FreeStateChangeCount; // 103
|
|
UCHAR MinorFirmwareRevision; // 104
|
|
UCHAR MajorFirmwareRevision; // 105
|
|
UCHAR RebuildFlag; // 106
|
|
UCHAR NumberOfConcurrentCommands; // 107
|
|
UCHAR NumberOfOfflineDrives; // 108
|
|
UCHAR Unused2[3]; // 109
|
|
UCHAR NumberOfCriticalDrives; // 112
|
|
UCHAR Unused3[3]; // 113
|
|
UCHAR NumberOfDeadDisks; // 116
|
|
UCHAR Unused4; // 117
|
|
UCHAR NumberOfRebuildingDisks; // 118
|
|
UCHAR MiscellaneousFlags; // 119
|
|
} DAC960_ENQUIRY_3X, *PDAC960_ENQUIRY_3X;
|
|
|
|
|
|
//
|
|
// Pass-through command
|
|
//
|
|
|
|
typedef struct _DIRECT_CDB {
|
|
UCHAR TargetId:4; // 00 (bits 0-3)
|
|
UCHAR Channel:4; // 00 (bits 4-7)
|
|
UCHAR CommandControl; // 01
|
|
USHORT DataTransferLength; // 02
|
|
ULONG DataBufferAddress; // 04
|
|
UCHAR CdbLength; // 08
|
|
UCHAR RequestSenseLength; // 09
|
|
UCHAR Cdb[12]; // 10
|
|
UCHAR RequestSenseData[64]; // 22
|
|
UCHAR Status; // 86
|
|
UCHAR Reserved; // 87
|
|
} DIRECT_CDB, *PDIRECT_CDB;
|
|
|
|
//
|
|
// Direct CDB command control bit definitions
|
|
//
|
|
|
|
#define DAC960_CONTROL_ENABLE_DISCONNECT 0x80
|
|
#define DAC960_CONTROL_DISABLE_REQUEST_SENSE 0x40
|
|
#define DAC960_CONTROL_DATA_IN 0x01
|
|
#define DAC960_CONTROL_DATA_OUT 0x02
|
|
#define DAC960_CONTROL_TIMEOUT_10_SECS 0x10
|
|
#define DAC960_CONTROL_TIMEOUT_60_SECS 0x20
|
|
#define DAC960_CONTROL_TIMEOUT_20_MINUTES 0x30
|
|
|
|
|
|
//
|
|
// Enquire 2 structure
|
|
//
|
|
|
|
typedef struct _ENQUIRE2 {
|
|
ULONG Reserved1;
|
|
ULONG EisaId;
|
|
ULONG InterruptMode:1;
|
|
ULONG Unused1:31;
|
|
UCHAR ConfiguredChannels;
|
|
UCHAR ActualChannels;
|
|
UCHAR MaximumTargets;
|
|
UCHAR MaximumTags;
|
|
UCHAR MaximumSystemDrives;
|
|
UCHAR MaximumDrivesPerStripe;
|
|
UCHAR MaximumSpansPerSystemDrive;
|
|
UCHAR Reserved2[5];
|
|
ULONG DramSize;
|
|
UCHAR DramForCache[5];
|
|
UCHAR SizeOfFlash[3];
|
|
ULONG SizeOfNvram;
|
|
ULONG Reserved3[5];
|
|
USHORT PhysicalSectorSize;
|
|
USHORT LogicalSectorSize;
|
|
USHORT MaximumSectorsPerCommand;
|
|
USHORT BlockingFactor;
|
|
USHORT CacheLineSize;
|
|
} ENQUIRE2, *PENQUIRE2;
|
|
|
|
//
|
|
// Device extension
|
|
//
|
|
|
|
typedef struct _DEVICE_EXTENSION {
|
|
|
|
//
|
|
// DAC960 register base address
|
|
//
|
|
|
|
PUCHAR BaseIoAddress;
|
|
|
|
//
|
|
// Command submission mailbox address
|
|
//
|
|
|
|
PMAILBOX PmailBox;
|
|
|
|
//
|
|
// Mailbox structure space
|
|
//
|
|
|
|
MAILBOX MailBox;
|
|
|
|
//
|
|
// System doorbell address
|
|
//
|
|
|
|
PUCHAR SystemDoorBell;
|
|
|
|
//
|
|
// Local doorbell address
|
|
//
|
|
|
|
PUCHAR LocalDoorBell;
|
|
|
|
//
|
|
// Noncached extension
|
|
//
|
|
|
|
PDAC960_ENQUIRY NoncachedExtension;
|
|
|
|
//
|
|
// Pending request queue
|
|
//
|
|
|
|
PSCSI_REQUEST_BLOCK SubmissionQueueHead;
|
|
PSCSI_REQUEST_BLOCK SubmissionQueueTail;
|
|
|
|
//
|
|
// Maximum number of outstanding requests per adapter
|
|
//
|
|
|
|
UCHAR MaximumAdapterRequests;
|
|
|
|
//
|
|
// Current number of outstanding requests per adapter
|
|
//
|
|
|
|
UCHAR CurrentAdapterRequests;
|
|
|
|
//
|
|
// Last active request index used
|
|
//
|
|
|
|
UCHAR CurrentIndex;
|
|
|
|
//
|
|
// HBA Slot number.
|
|
//
|
|
|
|
UCHAR Slot;
|
|
|
|
//
|
|
// Number of SCSI channels. (Used for resetting adapter.)
|
|
//
|
|
|
|
ULONG NumberOfChannels;
|
|
|
|
//
|
|
// System I/O Bus Number.
|
|
//
|
|
|
|
ULONG SystemIoBusNumber;
|
|
|
|
//
|
|
// Host Bus Adapter Interface Type.
|
|
//
|
|
|
|
INTERFACE_TYPE AdapterInterfaceType;
|
|
|
|
//
|
|
// Host Bus Adapter Interrupt Level.
|
|
//
|
|
|
|
ULONG BusInterruptLevel;
|
|
|
|
//
|
|
// Adapter Interrupt Mode: Level/Latched.
|
|
//
|
|
|
|
KINTERRUPT_MODE InterruptMode;
|
|
|
|
//
|
|
// BIOS Base Address.
|
|
//
|
|
|
|
PUCHAR BaseBiosAddress;
|
|
|
|
//
|
|
// Adapter Type (DAC960 PCI device id 0x0002 - new adapter, else old)
|
|
//
|
|
|
|
ULONG AdapterType;
|
|
|
|
//
|
|
// Active request pointers
|
|
//
|
|
|
|
PSCSI_REQUEST_BLOCK ActiveRequests[256];
|
|
|
|
//
|
|
// DMC960 POS Registers.
|
|
//
|
|
|
|
POS_DATA PosData;
|
|
|
|
//
|
|
// Flag to indicate, if we should send a new command to controller
|
|
// and ask for new request. To handle Abort/SCSI Bus Reset Scenerio.
|
|
//
|
|
|
|
BOOLEAN NextRequest;
|
|
|
|
//
|
|
// Contains List Of Physical Devices that are accessible
|
|
//
|
|
|
|
UCHAR DeviceList[MAXIMUM_CHANNELS][MAXIMUM_TARGETS_PER_CHANNEL];
|
|
|
|
|
|
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
|
|
|
|
|