/* AM53/79C974 (PCscsi) driver release 0.5

 * The architecture and much of the code of this device
 * driver was originally developed by Drew Eckhardt for
 * the NCR5380. The following copyrights apply:
 *  For the architecture and all parts similar to the NCR5380:
 *    Copyright 1993, Drew Eckhardt
 *      Visionary Computing 
 *      (Unix and Linux consulting and custom programming)
 *      drew@colorado.edu
 *      +1 (303) 666-5836
 *
 *  The AM53C974_nobios_detect code was originally developed by
 *   Robin Cutshaw (robin@xfree86.org) and is used here in a 
 *   modified form.
 *
 *  For the other parts:
 *    Copyright 1994, D. Frieauff
 *    EMail: fri@rsx42sun0.dofn.de
 *    Phone: x49-7545-8-2256 , x49-7541-42305
 */

/*
 * $Log: AM53C974.h,v $
 */

#ifndef AM53C974_H
#define AM53C974_H

#include <scsi/scsicam.h>

struct AM53C974_hostdata {
	volatile unsigned in_reset:1;	/* flag, says bus reset pending */
	volatile unsigned aborted:1;	/* flag, says aborted */
	volatile unsigned selecting:1;	/* selection started, but not yet finished */
	volatile unsigned disconnecting: 1;	/* disconnection started, but not yet finished */
	volatile unsigned dma_busy:1;	/* dma busy when service request for info transfer received */
	volatile unsigned char msgout[10];	/* message to output in MSGOUT_PHASE */
	volatile unsigned char last_message[10];	/* last message OUT */
	volatile Scsi_Cmnd *issue_queue;	/* waiting to be issued */
	volatile Scsi_Cmnd *disconnected_queue;		/* waiting for reconnect */
	volatile Scsi_Cmnd *sel_cmd;	/* command for selection */
	volatile Scsi_Cmnd *connected;	/* currently connected command */
	volatile unsigned char busy[8];		/* index = target, bit = lun */
	unsigned char sync_per[8];	/* synchronous transfer period (in effect) */
	unsigned char sync_off[8];	/* synchronous offset (in effect) */
	unsigned char sync_neg[8];	/* sync. negotiation performed (in effect) */
	unsigned char sync_en[8];	/* sync. negotiation performed (in effect) */
	unsigned char max_rate[8];	/* max. transfer rate (setup) */
	unsigned char max_offset[8];	/* max. sync. offset (setup), only valid if corresponding sync_en is nonzero */
};

#define AM53C974 {				  \
    .proc_name      = "am53c974",    	          \
    .name           = "AM53C974",        		  \
    .detect         = AM53C974_pci_detect,	  \
    .release        = AM53C974_release,		  \
    .info           = AM53C974_info,     		  \
    .command        = AM53C974_command,  		  \
    .queuecommand   = AM53C974_queue_command,	  \
    .abort          = AM53C974_abort,    		  \
    .reset          = AM53C974_reset,    		  \
    .can_queue      = 12,                 	  \
    .this_id        = -1,                           \
    .sg_tablesize   = SG_ALL,            		  \
    .cmd_per_lun    = 1,                 		  \
    .use_clustering = DISABLE_CLUSTERING 		  \
    }

static int AM53C974_pci_detect(Scsi_Host_Template * tpnt);
static int AM53C974_release(struct Scsi_Host *shp);
static const char *AM53C974_info(struct Scsi_Host *);
static int AM53C974_command(Scsi_Cmnd * SCpnt);
static int AM53C974_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *));
static int AM53C974_abort(Scsi_Cmnd * cmd);
static int AM53C974_reset(Scsi_Cmnd * cmd, unsigned int);

#endif				/* AM53C974_H */
