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

384 lines
7.5 KiB
C

/*
** Mylex DCE376 miniport driver for Windows NT
**
** File: dce376nt.h
** Equates for DCE376 adapter
**
** (c) Copyright 1992 Deutsch-Amerikanische Freundschaft, Inc.
** Written by Jochen Roth
*/
#include "scsi.h"
/*
** Firmware related stuff
*/
#define DCE_MAX_IOCMDS 1
#define DCE_MAX_XFERLEN 0x4000 // SCSI only. This must be 16 kBytes or less
// because we use the other half of the SCSI
// IO buffer for s/g breakdown...
#define DCE_THUNK 512
#define DCE_MAXRQS 64
#define DCE_BUFLOC 0x79000 // 0x75000 + 16kBytes
/*
** EISA specific stuff
*/
#define EISA_IO_SLOT1 0x1000
#define EISA_IO_STEP 0x1000
#define MAXIMUM_EISA_SLOTS 6 // Leave out non-bus master slots
#define EISA_ID_START 0x0c80 /* Offset from IO base to ID */
#define EISA_ID_COUNT 4
#define DCE_EISA_MASK { 0xff, 0xff, 0xff, 0xf0 } /* 4 bytes EISA ID mask */
#define DCE_EISA_ID { 0x35, 0x98, 0, 0x20 } /* 4 bytes EISA ID */
/*
** EISA side of BMIC chip
*/
#define BMIC_GLBLCFG 0xc88
#define BMIC_SYSINTCTRL 0xc89 // System interrupt enable/status
#define BMIC_SIC_ENABLE 0x01 // read-write interrupt enable
#define BMIC_SIC_PENDING 0x02 // read-only interrupt(s) pending
#define BMIC_LOCAL_DB_ENABLE 0xc8c // Read-only from EISA side
#define BMIC_LOCAL_DB 0xc8d // EISA to local notification
#define BMIC_EISA_DB_ENABLE 0xc8e // Read-write from EISA side
#define BMIC_EISA_DB 0xc8f // Local to EISA notification
#define BMIC_MBOX 0xc90 // BMIC mailbox registers
/*
** More defines
*/
#define DCE_PRIMARY_IRQ 15
#define DCE_SECONDARY_IRQ 10
#define DCE_SCSI_IRQ 14
/*
** Various DCE mailbox formats
*/
typedef struct { // I/O mailbox
UCHAR Command;
UCHAR Reserved1;
UCHAR Status; // Also drive unit (target)
UCHAR Error; // Also error
USHORT SectorCount;
USHORT Reserved2;
ULONG PhysAddr;
ULONG Block;
} DCE_IOMBOX;
typedef struct { // Request Drive Parameters
UCHAR Command;
UCHAR Reserved1;
UCHAR Status;
UCHAR DriveType; // Also error
USHORT Reserved2;
USHORT Reserved3;
ULONG PhysAddr; // Address of DCE_DPT
ULONG Reserved4;
} DCE_DPMBOX;
typedef struct { // Change EOC IRQ
UCHAR Command;
UCHAR Reserved1;
UCHAR Status;
UCHAR IRQSelect; // 0:IRQ15,1:IRQ10 ; Also error
ULONG Unused1;
ULONG Unused2;
ULONG Unused3;
} DCE_EIMBOX;
typedef struct { // Recalibrate drive
UCHAR Command;
UCHAR Reserved1;
UCHAR Status; // also drive
UCHAR Error;
ULONG Unused1;
ULONG Unused2;
ULONG Unused3;
} DCE_RDMBOX;
typedef struct { // Transfer memory DCE <-> Host
UCHAR Command;
UCHAR Reserved1;
UCHAR Status;
UCHAR Error;
ULONG AdapterAddress;
ULONG HostAddress;
UCHAR Direction;
UCHAR Unused;
USHORT TransferCount;
} DCE_MTMBOX;
#define DCE_DCE2HOST 2
#define DCE_HOST2DCE 3
typedef struct { // Flush data
UCHAR Command;
UCHAR Reserved1;
UCHAR Status;
UCHAR Error;
ULONG Unused1;
ULONG Unused2;
ULONG Unused3;
} DCE_FLMBOX;
typedef struct { // Invalidate data
UCHAR Command;
UCHAR Reserved1;
UCHAR Status; // also drive
UCHAR Error;
ULONG Unused1;
ULONG Unused2;
ULONG Unused3;
} DCE_IVMBOX;
typedef struct { // Execute SCSI cmd
UCHAR Command;
UCHAR Reserved1;
UCHAR Status; // also drive
UCHAR Error; // also cdb length
ULONG CdbAddress; // Must be dword aligned
ULONG HostAddress; // data transfer
UCHAR Direction;
UCHAR Unused;
USHORT TransferCount;
} DCE_XSMBOX;
#define DCE_DEV2HOST 2
#define DCE_HOST2DEV 3
//
// The DCE Command codes
//
#define DCE_RECAL 0x0b
#define DCE_LREAD 0x11
#define DCE_LWRITE 0x12
#define DCE_DEVPARMS 0x09
#define DCE_EOCIRQ 0x0e
#define DCE_MEMXFER 0x13
#define DCE_FLUSH 0x06
#define DCE_INVALIDATE 0x0f
#define DCE_HOSTSCSI 0x0d
//
// These command codes are used to mark special states
// the device driver gets into, like flush-after-write
//
#define DCX_UNCACHEDREAD 0xf0
#define DCX_UNCACHEDWRITE 0xf1
typedef union {
DCE_IOMBOX iombox;
DCE_DPMBOX dpmbox;
DCE_EIMBOX eimbox;
DCE_RDMBOX rdmbox;
DCE_MTMBOX mtmbox;
DCE_FLMBOX flmbox;
DCE_IVMBOX ivmbox;
DCE_XSMBOX xsmbox;
} DCE_MBOX;
typedef DCE_MBOX *PDCE_MBOX;
/*
** Device parameters as returned from DCE firmware
*/
typedef struct {
USHORT DriveID;
USHORT Heads;
USHORT Cylinders;
USHORT SectorsPerTrack;
USHORT BytesPerSector;
USHORT Reserved[3];
} DCE_DPT;
typedef DCE_DPT *PDCE_DPT;
#define DPT_NUMENTS 10
/*
** SCSI stuff
*/
typedef struct {
UCHAR TargetID; // 0
UCHAR cdbSize; // 1
UCHAR cdb[12]; // 2-13
ULONG ppXferAddr; // 14
UCHAR Opcode; // 18
USHORT XferCount; // 19
UCHAR Reserved; // 21
UCHAR SenseLen; // 22
ULONG ppSenseBuf; // 23
UCHAR StuffIt; // 27
} DCE_SCSI_REQ, *PDCE_SCSI_REQ;
#define DCE_SCSIREQLEN 28
#define DCE_SCSI_NONE 0
#define DCE_SCSI_READ 2
#define DCE_SCSI_WRITE 3 // was 1
#define DCES_ERR_REG 0x1f6
#define DCES_MBOX_REG 0x1f2
#define DCES_KICK_REG 0x1f7
#define DCES_TSTAT_REG 0x1f7
#define DCES_TRIGGER 0x98
#define DCES_ACK 0x99
//
// 1f2 (err_reg) seems to hold the sense key
//
//
// Context structure for board scanning
//
typedef struct {
ULONG Slot;
ULONG AdapterCount;
} SCANCONTEXT, *PSCANCONTEXT;
//
// The following structure is allocated
// from noncached memory as data will be DMA'd to
// and from it.
//
typedef struct _NONCACHED_EXTENSION {
//
// Device Parameter Table for the
// Get Device Parameters request
//
DCE_DPT DevParms[DPT_NUMENTS];
ULONG PhysicalBufferAddress;
UCHAR Buffer[DCE_THUNK];
ULONG PhysicalScsiReqAddress;
UCHAR ScsiReq[DCE_SCSIREQLEN+10];
ULONG PhysicalReqSenseAddress;
UCHAR ReqSense[DCE_MAXRQS];
} NONCACHED_EXTENSION, *PNONCACHED_EXTENSION;
//
// Request Control Block (SRB Extension)
// All information required to break down and execute
// a disk request is stored here
//
typedef struct _RCB {
PUCHAR VirtualTransferAddress;
ULONG BlockAddress;
ULONG BytesToGo;
ULONG BytesThisReq;
UCHAR DceCommand;
UCHAR RcbFlags;
UCHAR WaitInt;
UCHAR DceStatus;
UCHAR DceErrcode;
} RCB, *PRCB;
#define RCB_NEEDCOPY 1
#define RCB_PREFLUSH 2
#define RCB_POSTFLUSH 4
//
// SCSI Command Control Block
// We use this block to break down a non-disk scsi request
//
typedef struct _SCCB {
PUCHAR VirtualTransferAddress;
ULONG DeviceAddress;
ULONG BytesPerBlock;
ULONG BlocksToGo;
ULONG BlocksThisReq;
ULONG BytesThisReq;
UCHAR Started;
UCHAR Opcode;
UCHAR DevType;
} SCCB, *PSCCB;
//
// Device extension
//
typedef struct _HW_DEVICE_EXTENSION {
//
// NonCached extension
//
PNONCACHED_EXTENSION NoncachedExtension;
//
// Adapter parameters and variables
//
PVOID EisaAddress; // base address for slot (X000h)
PUSHORT printAddr;
ULONG AdapterIndex; // 0:first DCE, 1:first DCE SCSI,
// 2:second DCE
UCHAR HostTargetId;
BOOLEAN ShutDown; // We received a shutdown request
// SCSI device management
UCHAR DiskDev[8]; // Flag: TRUE if disk, FLASE otherwise
UCHAR ScsiDevType[8]; // Device type: 1:tape, 5:cd-rom,...
ULONG Capacity[8]; // Device size if disk device
//
// Pending request.
// This request has not been sent to the adapter yet
// because the adapter was busy
//
PSCSI_REQUEST_BLOCK PendingSrb;
//
// Pointers to disk IO requests sent to adapter
// and their statuses
//
ULONG ActiveCmds;
PSCSI_REQUEST_BLOCK ActiveSrb[DCE_MAX_IOCMDS];
RCB ActiveRcb[DCE_MAX_IOCMDS];
//
// Pointer to non-disk SCSI requests sent to adapter
//
PSCSI_REQUEST_BLOCK ActiveScsiSrb;
SCCB Sccb;
ULONG Kicked;
ULONG ScsiInterruptCount;
} HW_DEVICE_EXTENSION, *PHW_DEVICE_EXTENSION;