/*
 *	buslogic.h	Copyright (C) 1993, 1994 David B. Gentzel
 *	See buslogic.c for more information.
 */

#ifndef _BUSLOGIC_H

int buslogic_detect(Scsi_Host_Template *);
int buslogic_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int buslogic_abort(Scsi_Cmnd *);
const char *buslogic_info(struct Scsi_Host *);
int buslogic_reset(Scsi_Cmnd *);
int buslogic_biosparam(Disk *, int, int *);

extern int generic_proc_info(char *, char **, off_t, int, int, int);

#define BUSLOGIC { NULL, NULL,			\
		   generic_proc_info,           \
		   "buslogic",                  \
		   PROC_SCSI_BUSLOGIC,          \
		   "BusLogic",			\
		   buslogic_detect,		\
		   0,	/* no release func */	\
		   buslogic_info,		\
		   0,	/* no command func */	\
		   buslogic_queuecommand,	\
		   buslogic_abort,		\
		   buslogic_reset,		\
		   0,	/* slave_attach NYI */	\
		   buslogic_biosparam,		\
		   0,	/* set by driver */	\
		   0,	/* set by driver */	\
		   0,	/* set by driver */	\
		   0,	/* set by driver */	\
		   0,				\
		   0,	/* set by driver */	\
		   ENABLE_CLUSTERING		\
		 }

#ifdef BUSLOGIC_PRIVATE_H

/* ??? These don't really belong here */
#ifndef TRUE
# define TRUE 1
#endif
#ifndef FALSE
# define FALSE 0
#endif

#define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr)[0])

#define PACKED __attribute__((packed))

#define BD_ABORT	0x0001
#define BD_COMMAND	0x0002
#define BD_DETECT	0x0004
#define BD_ERRORS	0x0008
#define BD_INTERRUPT	0x0010
#define BD_IO		0x0020
#define BD_RESET	0x0040
#define BD_UNDOCUMENTED	0x0080

/* I/O Port interface */
/* READ */
#define STATUS(base) (base)
#define DACT 0x80		/* Diagnostic Active */
#define DFAIL 0x40		/* Diagnostic Failure */
#define INREQ 0x20		/* Initialization Required */
#define HARDY 0x10		/* Host Adapter Ready */
#define CPRBSY 0x08		/* Command/Parameter Register Busy */
#define DIRRDY 0x04		/* Data In Register Ready */
				/* 0x02 is reserved */
#define CMDINV 0x01		/* Command Invalid */

#define DATA_IN(base) (STATUS(base) + 1)

#define INTERRUPT(base) (STATUS(base) + 2)
#define INTV 0x80		/* Interrupt Valid */
				/* 0x70 are reserved */
#define RSTS 0x08		/* SCSI Reset State */
#define CMDC 0x04		/* Command Complete */
#define MBOR 0x02		/* Mailbox Out Ready */
#define IMBL 0x01		/* Incoming Mailbox Loaded */
#define INTRMASK 0x8F

/* This undocumented port returns a bitmask indicating geometry translation. */
#define GEOMETRY(base) (STATUS(base) + 3)
#define GEO_GT_1GB 0x80		/* > 1GB under DOS geometry mapping */
				/* 0x70 are unknown */
#define GEO_XLATION_S_D1 0x0C	/* Disk 1 geometry ("S" models only) */
#define GEO_XLATION_S_D0 0x03	/* Disk 0 geometry ("S" models only) */


/* WRITE */
#define CONTROL(base) STATUS(base)
#define RHARD 0x80		/* Hard Reset */
#define RSOFT 0x40		/* Soft Reset */
#define RINT 0x20		/* Interrupt Reset */
#define RSBUS 0x10		/* SCSI Bus Reset */
				/* 0x0F are reserved */

#define COMMAND_PARAMETER(base) (STATUS(base) + 1)
#define CMD_TSTCMDCINT 0x00	/* Test CMDC Interrupt */
#define CMD_INITMB 0x01		/* Initialize Mailbox */
#define CMD_START_SCSI 0x02	/* Start Mailbox */
#define CMD_START_BIOS 0x03	/* Start BIOS */
#define CMD_INQUIRY 0x04	/* Inquire Board ID */
#define CMD_ENBOMBRINT 0x05	/* Enable OMBR Interrupt */
#define CMD_SETSELTIMOUT 0x06	/* Set SCSI Selection Time-Out */
#define CMD_BUSON_TIME 0x07	/* Set Bus-On Time */
#define CMD_BUSOFF_TIME 0x08	/* Set Bus-Off Time */
#define CMD_BUSXFR_RATE 0x09	/* Set Bus Transfer Rate */
#define CMD_INQ_DEVICES 0x0A	/* Inquire Installed Devices */
#define CMD_RETCONF 0x0B	/* Return Configuration */
#define CMD_TARGET_MODE 0x0C	/* Set Target Mode */
#define CMD_INQ_SETUP_INFO 0x0D	/* Inquire Set-up Information */
#define CMD_WRITE_LCL_RAM 0x1A	/* Write Adapter Local RAM */
#define CMD_READ_LCL_RAM 0x1B	/* Read Adapter Local RAM */
#define CMD_WRITE_BM_FIFO 0x1C	/* Write Bus Master Chip FIFO */
#define CMD_READ_BM_FIFO 0x1D	/* Read Bus Master Chip FIFO */
#define CMD_ECHO 0x1F		/* Echo Data Byte */
#define CMD_HA_DIAG 0x20	/* Host Adapter Diagnostic */
#define CMD_HA_OPTIONS 0x21	/* Host Adapter Options */
#define CMD_INITEXTMB 0x81	/* Initialize Extended Mailbox */
#define CMD_VER_NO_LAST 0x84	/* Version Number Last Byte (undocumented) */
#define CMD_VER_NO_LETTER 0x85	/* Version Number One Letter (undocumented) */
#define CMD_RET_MODEL_NO 0x8B	/* Return Model Number (undocumented) */
#define CMD_INQEXTSETUP 0x8D	/* Inquire Extended Set-up Information */
#define CMD_ROUND_ROBIN 0x8F	/* Enable strict vs. half-assed round-robin
				   mailbox filling (undocumented) */
#define CMD_READ_FW_LCL_RAM 0x91/* Read Firmware Local RAM (undocumented) */
#define CMD_WRITE_INQ_BUF 0x9A	/* Write Inquiry Data Buffer
				   (Target Mode Only) */
#define CMD_READ_INQ_BUF 0x9B	/* Read Inquiry Data Buffer
				   (Target Mode Only) */

#define MBX_NOT_IN_USE 0x00
#define MBX_ACTION_START 0x01
#define MBX_ACTION_ABORT 0x02
#define MBX_COMPLETION_OK 0x01
#define MBX_COMPLETION_ABORTED 0x02
#define MBX_COMPLETION_NOT_FOUND 0x03
#define MBX_COMPLETION_ERROR 0x04

/* Mailbox Definition */
struct mailbox {
    void *ccbptr;		/* lsb, ..., msb */
    unsigned char btstat;
    unsigned char sdstat;
    unsigned char reserved;
    unsigned char status;	/* Command/Status */
};

/* This is used with scatter-gather */
struct chain {
    unsigned long datalen;	/* Size of this part of chain */
    void *dataptr;		/* Location of data */
};

#define MAX_CDB 12

struct ccb {			/* Command Control Block */
    unsigned char op;		/* Command Control Block Operation Code */
    unsigned char dir;
    unsigned char cdblen;	/* SCSI Command Length */
    unsigned char rsalen;	/* Request Sense Allocation Length/Disable */
    unsigned long datalen;	/* Data Length (msb, ..., lsb) */
    void *dataptr;		/* Data Pointer */
    unsigned char reserved[2];
    unsigned char hastat;	/* Host Adapter Status (HASTAT) */
    unsigned char tarstat;	/* Target Device Status */
    unsigned char id;
    unsigned char lun;
    unsigned char cdb[MAX_CDB];
    unsigned char ccbcontrol;
    unsigned char commlinkid;	/* Command Linking Identifier */
    void *linkptr;		/* Link Pointer */
    void *senseptr;
};

#define CCB_OP_INIT 0x00	/* Initiator CCB */
#define CCB_OP_TARG 0x01	/* Target CCB */
#define CCB_OP_INIT_SG 0x02	/* Initiator CCB with scatter-gather */
#define CCB_OP_INIT_R 0x03	/* Initiator CCB with residual data length
				   returned */
#define CCB_OP_INIT_SG_R 0x04	/* Initiator CCB with scatter-gather and
				   residual data length returned */
#define CCB_OP_BUS_RESET 0x81	/* SCSI bus device reset */

#endif

#endif
