431 lines
9.8 KiB
C
431 lines
9.8 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1990 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
ncr53c9x.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
The module defines the structures, defines and functions for the NCR 53c9x
|
|||
|
family of host bus adapter chips.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Jeff Havens (jhavens) 28-Feb-1991
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _NCR53C9X_
|
|||
|
#define _NCR53C9X_
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Protocol Chip register format.
|
|||
|
//
|
|||
|
|
|||
|
#if defined(DECSTATION)
|
|||
|
|
|||
|
typedef struct _SCSI_REGISTER {
|
|||
|
UCHAR Byte;
|
|||
|
UCHAR Fill[3];
|
|||
|
} SCSI_REGISTER, *PSCSI_REGISTER;
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
#define SCSI_REGISTER UCHAR
|
|||
|
|
|||
|
#endif // DECSTATION
|
|||
|
|
|||
|
//
|
|||
|
// SCSI Protocol Chip Definitions.
|
|||
|
//
|
|||
|
// Define SCSI Protocol Chip Read registers structure.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SCSI_READ_REGISTERS {
|
|||
|
SCSI_REGISTER TransferCountLow;
|
|||
|
SCSI_REGISTER TransferCountHigh;
|
|||
|
SCSI_REGISTER Fifo;
|
|||
|
SCSI_REGISTER Command;
|
|||
|
SCSI_REGISTER ScsiStatus;
|
|||
|
SCSI_REGISTER ScsiInterrupt;
|
|||
|
SCSI_REGISTER SequenceStep;
|
|||
|
SCSI_REGISTER FifoFlags;
|
|||
|
SCSI_REGISTER Configuration1;
|
|||
|
SCSI_REGISTER Reserved1;
|
|||
|
SCSI_REGISTER Reserved2;
|
|||
|
SCSI_REGISTER Configuration2;
|
|||
|
SCSI_REGISTER Configuration3;
|
|||
|
SCSI_REGISTER Configuration4;
|
|||
|
SCSI_REGISTER TransferCountPage;
|
|||
|
SCSI_REGISTER FifoBottem;
|
|||
|
} SCSI_READ_REGISTERS, *PSCSI_READ_REGISTERS;
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Protocol Chip Write registers structure.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SCSI_WRITE_REGISTERS {
|
|||
|
SCSI_REGISTER TransferCountLow;
|
|||
|
SCSI_REGISTER TransferCountHigh;
|
|||
|
SCSI_REGISTER Fifo;
|
|||
|
SCSI_REGISTER Command;
|
|||
|
SCSI_REGISTER DestinationId;
|
|||
|
SCSI_REGISTER SelectTimeOut;
|
|||
|
SCSI_REGISTER SynchronousPeriod;
|
|||
|
SCSI_REGISTER SynchronousOffset;
|
|||
|
SCSI_REGISTER Configuration1;
|
|||
|
SCSI_REGISTER ClockConversionFactor;
|
|||
|
SCSI_REGISTER TestMode;
|
|||
|
SCSI_REGISTER Configuration2;
|
|||
|
SCSI_REGISTER Configuration3;
|
|||
|
SCSI_REGISTER Configuration4;
|
|||
|
SCSI_REGISTER TransferCountPage;
|
|||
|
SCSI_REGISTER FifoBottem;
|
|||
|
} SCSI_WRITE_REGISTERS, *PSCSI_WRITE_REGISTERS;
|
|||
|
|
|||
|
typedef union _SCSI_REGISTERS {
|
|||
|
SCSI_READ_REGISTERS ReadRegisters;
|
|||
|
SCSI_WRITE_REGISTERS WriteRegisters;
|
|||
|
} SCSI_REGISTERS, *PSCSI_REGISTERS;
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Command Codes.
|
|||
|
//
|
|||
|
|
|||
|
#define NO_OPERATION_DMA 0x80
|
|||
|
#define FLUSH_FIFO 0x1
|
|||
|
#define RESET_SCSI_CHIP 0x2
|
|||
|
#define RESET_SCSI_BUS 0x3
|
|||
|
#define TRANSFER_INFORMATION 0x10
|
|||
|
#define TRANSFER_INFORMATION_DMA 0x90
|
|||
|
#define COMMAND_COMPLETE 0x11
|
|||
|
#define MESSAGE_ACCEPTED 0x12
|
|||
|
#define TRANSFER_PAD 0x18
|
|||
|
#define SET_ATTENTION 0x1a
|
|||
|
#define RESET_ATTENTION 0x1b
|
|||
|
#define RESELECT 0x40
|
|||
|
#define SELECT_WITHOUT_ATTENTION 0x41
|
|||
|
#define SELECT_WITH_ATTENTION 0x42
|
|||
|
#define SELECT_WITH_ATTENTION_STOP 0x43
|
|||
|
#define ENABLE_SELECTION_RESELECTION 0x44
|
|||
|
#define DISABLE_SELECTION_RESELECTION 0x45
|
|||
|
#define SELECT_WITH_ATTENTION3 0x46
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Status Register structure.
|
|||
|
//
|
|||
|
typedef struct _SCSI_STATUS {
|
|||
|
UCHAR Phase : 3;
|
|||
|
UCHAR ValidGroup : 1;
|
|||
|
UCHAR TerminalCount : 1;
|
|||
|
UCHAR ParityError : 1;
|
|||
|
UCHAR GrossError : 1;
|
|||
|
UCHAR Interrupt : 1;
|
|||
|
} SCSI_STATUS, *PSCSI_STATUS;
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Phase Codes.
|
|||
|
//
|
|||
|
|
|||
|
#define DATA_OUT 0x0
|
|||
|
#define DATA_IN 0x1
|
|||
|
#define COMMAND_OUT 0x2
|
|||
|
#define STATUS_IN 0x3
|
|||
|
#define MESSAGE_OUT 0x6
|
|||
|
#define MESSAGE_IN 0x7
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Interrupt Register structure.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SCSI_INTERRUPT {
|
|||
|
UCHAR Selected : 1;
|
|||
|
UCHAR SelectedWithAttention : 1;
|
|||
|
UCHAR Reselected : 1;
|
|||
|
UCHAR FunctionComplete : 1;
|
|||
|
UCHAR BusService : 1;
|
|||
|
UCHAR Disconnect : 1;
|
|||
|
UCHAR IllegalCommand : 1;
|
|||
|
UCHAR ScsiReset : 1;
|
|||
|
} SCSI_INTERRUPT, *PSCSI_INTERRUPT;
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Sequence Step Register structure.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SCSI_SEQUENCE_STEP {
|
|||
|
UCHAR Step : 3;
|
|||
|
UCHAR MaximumOffset : 1;
|
|||
|
UCHAR Reserved : 4;
|
|||
|
} SCSI_SEQUENCE_STEP, *PSCSI_SEQUENCE_STEP;
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Fifo Flags Register structure.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SCSI_FIFO_FLAGS {
|
|||
|
UCHAR ByteCount : 5;
|
|||
|
UCHAR FifoStep : 3;
|
|||
|
} SCSI_FIFO_FLAGS, *PSCSI_FIFO_FLAGS;
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Configuration 1 Register structure.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SCSI_CONFIGURATION1 {
|
|||
|
UCHAR HostBusId : 3;
|
|||
|
UCHAR ChipTestEnable : 1;
|
|||
|
UCHAR ParityEnable : 1;
|
|||
|
UCHAR ParityTestMode : 1;
|
|||
|
UCHAR ResetInterruptDisable : 1;
|
|||
|
UCHAR SlowCableMode : 1;
|
|||
|
} SCSI_CONFIGURATION1, *PSCSI_CONFIGURATION1;
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Configuration 2 Register structure.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SCSI_CONFIGURATION2 {
|
|||
|
UCHAR DmaParityEnable : 1;
|
|||
|
UCHAR RegisterParityEnable : 1;
|
|||
|
UCHAR TargetBadParityAbort : 1;
|
|||
|
UCHAR Scsi2 : 1;
|
|||
|
UCHAR HighImpedance : 1;
|
|||
|
UCHAR EnableByteControl : 1;
|
|||
|
UCHAR EnablePhaseLatch : 1;
|
|||
|
UCHAR ReserveFifoByte : 1;
|
|||
|
} SCSI_CONFIGURATION2, *PSCSI_CONFIGURATION2;
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Configuration 3 Register structure.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SCSI_CONFIGURATION3 {
|
|||
|
UCHAR Threshold8 : 1;
|
|||
|
UCHAR AlternateDmaMode : 1;
|
|||
|
UCHAR SaveResidualByte : 1;
|
|||
|
UCHAR FastClock : 1;
|
|||
|
UCHAR FastScsi : 1;
|
|||
|
UCHAR EnableCdb10 : 1;
|
|||
|
UCHAR EnableQueue : 1;
|
|||
|
UCHAR CheckIdMessage : 1;
|
|||
|
} SCSI_CONFIGURATION3, *PSCSI_CONFIGURATION3;
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Configuration 4 Register structure.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SCSI_CONFIGURATION4 {
|
|||
|
UCHAR ActiveNegation : 1;
|
|||
|
UCHAR TestTransferCounter : 1;
|
|||
|
UCHAR BackToBackTransfer : 1;
|
|||
|
UCHAR Reserved : 5;
|
|||
|
} SCSI_CONFIGURATION4, *PSCSI_CONFIGURATION4;
|
|||
|
|
|||
|
//
|
|||
|
// Define Emulex FAS 218 unique part Id code.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _NCR_PART_CODE {
|
|||
|
UCHAR RevisionLevel : 3;
|
|||
|
UCHAR ChipFamily : 5;
|
|||
|
}NCR_PART_CODE, *PNCR_PART_CODE;
|
|||
|
|
|||
|
#define EMULEX_FAS_216 2
|
|||
|
#define NCR_53c96 0x14
|
|||
|
|
|||
|
//
|
|||
|
// SCSI Protocol Chip Control read and write macros.
|
|||
|
//
|
|||
|
|
|||
|
#if defined(DECSTATION)
|
|||
|
|
|||
|
#define SCSI_READ(ChipAddr, Register) \
|
|||
|
(READ_REGISTER_UCHAR (&((ChipAddr)->ReadRegisters.Register.Byte)))
|
|||
|
|
|||
|
#define SCSI_WRITE(ChipAddr, Register, Value) \
|
|||
|
WRITE_REGISTER_UCHAR(&((ChipAddr)->WriteRegisters.Register.Byte), (Value))
|
|||
|
|
|||
|
#else
|
|||
|
|
|||
|
#define SCSI_READ(ChipAddr, Register) \
|
|||
|
(READ_REGISTER_UCHAR (&((ChipAddr)->ReadRegisters.Register)))
|
|||
|
|
|||
|
#define SCSI_WRITE(ChipAddr, Register, Value) \
|
|||
|
WRITE_REGISTER_UCHAR(&((ChipAddr)->WriteRegisters.Register), (Value))
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Adapter Specific Read registers structure
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _ADAPTER_READ_REGISTERS {
|
|||
|
UCHAR Reserved00;
|
|||
|
UCHAR Reserved01;
|
|||
|
UCHAR OptionSelect1;
|
|||
|
UCHAR OptionSelect2;
|
|||
|
UCHAR Reserved04;
|
|||
|
UCHAR OptionSelect5;
|
|||
|
UCHAR Reserved06;
|
|||
|
UCHAR Reserved07;
|
|||
|
UCHAR Reserved08;
|
|||
|
UCHAR Reserved09;
|
|||
|
UCHAR Reserved0a;
|
|||
|
UCHAR Reserved0b;
|
|||
|
UCHAR DmaStatus;
|
|||
|
UCHAR Reserved0d;
|
|||
|
UCHAR Reserved0e;
|
|||
|
UCHAR Reserved0f;
|
|||
|
} ADAPTER_READ_REGISTERS, *PADAPTER_READ_REGISTERS;
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Adapter Specific Write registers structure
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _ADAPTER_WRITE_REGISTERS {
|
|||
|
UCHAR Reserved00;
|
|||
|
UCHAR Reserved01;
|
|||
|
UCHAR OptionSelect1;
|
|||
|
UCHAR OptionSelect2;
|
|||
|
UCHAR Reserved04;
|
|||
|
UCHAR OptionSelect5;
|
|||
|
UCHAR Reserved06;
|
|||
|
UCHAR Reserved07;
|
|||
|
UCHAR Reserved08;
|
|||
|
UCHAR Reserved09;
|
|||
|
UCHAR DmaDecode;
|
|||
|
UCHAR Reserved0b;
|
|||
|
UCHAR Reserved0c;
|
|||
|
UCHAR Reserved0d;
|
|||
|
UCHAR Reserved0e;
|
|||
|
UCHAR Reserved0f;
|
|||
|
} ADAPTER_WRITE_REGISTERS, *PADAPTER_WRITE_REGISTERS;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
typedef union _ADAPTER_REGISTERS {
|
|||
|
ADAPTER_READ_REGISTERS ReadRegisters;
|
|||
|
ADAPTER_WRITE_REGISTERS WriteRegisters;
|
|||
|
} ADAPTER_REGISTERS, *PADAPTER_REGISTERS;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Define Option Select Register structures.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _POS_DATA_1 {
|
|||
|
UCHAR AdapterEnable : 1;
|
|||
|
UCHAR IoAddressSelects : 3;
|
|||
|
UCHAR InterruptSelects : 2;
|
|||
|
UCHAR InterruptEnable : 1;
|
|||
|
UCHAR Reserved : 1;
|
|||
|
} POS_DATA_1, *PPOS_DATA_1;
|
|||
|
|
|||
|
typedef struct _POS_DATA_2 {
|
|||
|
UCHAR DmaSelects : 3;
|
|||
|
UCHAR UnusedDmaSelect : 1;
|
|||
|
UCHAR AdapterFairness : 1;
|
|||
|
UCHAR PreemptCount : 2;
|
|||
|
UCHAR DmaEnable : 1;
|
|||
|
} POS_DATA_2, *PPOS_DATA_2;
|
|||
|
|
|||
|
typedef struct _POS_DATA_3 {
|
|||
|
UCHAR Reserved : 3;
|
|||
|
UCHAR SramAddressSelects : 3; // 7f4c only
|
|||
|
UCHAR HostIdSelects : 2; // 7f4c only
|
|||
|
} POS_DATA_3, *PPOS_DATA_3;
|
|||
|
|
|||
|
typedef struct _POS_DATA_4 {
|
|||
|
UCHAR Reserved0 : 5;
|
|||
|
UCHAR HostIdSelects : 1; // 7f4d & 7f4f only
|
|||
|
UCHAR Reserved1 : 2;
|
|||
|
} POS_DATA_4, *PPOS_DATA_4;
|
|||
|
|
|||
|
//
|
|||
|
// Define SCSI Dma Status Register structure.
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _SCSI_DMA_STATUS {
|
|||
|
UCHAR Interrupt : 1;
|
|||
|
UCHAR DmaRequest : 1;
|
|||
|
UCHAR Reserved : 6;
|
|||
|
} SCSI_DMA_STATUS, *PSCSI_DMA_STATUS;
|
|||
|
|
|||
|
//
|
|||
|
// Adapter configuration Information.
|
|||
|
//
|
|||
|
|
|||
|
#define ONBOARD_C94_ADAPTER_ID 0x7f4c
|
|||
|
#define ONBOARD_C90_ADAPTER_ID 0x7f4d
|
|||
|
#define PLUGIN_C90_ADAPTER_ID 0x7f4f
|
|||
|
|
|||
|
typedef struct _POS_DATA {
|
|||
|
USHORT AdapterId;
|
|||
|
UCHAR OptionData1;
|
|||
|
UCHAR OptionData2;
|
|||
|
UCHAR OptionData3;
|
|||
|
UCHAR OptionData4;
|
|||
|
} POS_DATA, *PPOS_DATA;
|
|||
|
|
|||
|
typedef struct _INIT_DATA {
|
|||
|
ULONG AdapterId;
|
|||
|
ULONG CardSlot;
|
|||
|
POS_DATA PosData[8];
|
|||
|
}INIT_DATA, *PINIT_DATA;
|
|||
|
|
|||
|
static const PVOID
|
|||
|
AdapterBaseAddress[] = {
|
|||
|
(PVOID) 0x0000,
|
|||
|
(PVOID) 0x0240,
|
|||
|
(PVOID) 0x0340,
|
|||
|
(PVOID) 0x0400,
|
|||
|
(PVOID) 0x0420,
|
|||
|
(PVOID) 0x3240,
|
|||
|
(PVOID) 0x8240,
|
|||
|
(PVOID) 0xa240
|
|||
|
};
|
|||
|
|
|||
|
static const UCHAR
|
|||
|
AdapterInterruptLevel[] = {
|
|||
|
0x03,
|
|||
|
0x05,
|
|||
|
0x07,
|
|||
|
0x09
|
|||
|
};
|
|||
|
|
|||
|
static const UCHAR
|
|||
|
AdapterDmaLevel[] = {
|
|||
|
0x00,
|
|||
|
0x01,
|
|||
|
0x02, // invalid setting
|
|||
|
0x03,
|
|||
|
0x04, // invalid setting
|
|||
|
0x05,
|
|||
|
0x06,
|
|||
|
0x07
|
|||
|
};
|
|||
|
|
|||
|
static const UCHAR
|
|||
|
AdapterScsiIdC90[] = {
|
|||
|
0x06,
|
|||
|
0x07
|
|||
|
};
|
|||
|
|
|||
|
static const UCHAR
|
|||
|
AdapterScsiIdC94[] = {
|
|||
|
0x04,
|
|||
|
0x05,
|
|||
|
0x06,
|
|||
|
0x07
|
|||
|
};
|
|||
|
|
|||
|
#endif
|