58217f5900
WOO HOO!
246 lines
7.3 KiB
C
246 lines
7.3 KiB
C
/*
|
|
* hosts.h Copyright (C) 1992 Drew Eckhardt
|
|
* mid to low-level SCSI driver interface header by
|
|
* Drew Eckhardt
|
|
*
|
|
* <drew@colorado.edu>
|
|
*
|
|
* Modified by Eric Youngdale eric@tantalus.nrl.navy.mil to
|
|
* add scatter-gather, multiple outstanding request, and other
|
|
* enhancements.
|
|
*
|
|
* Further modified by Eric Youngdale to support multiple host adapters
|
|
* of the same type.
|
|
*/
|
|
|
|
#ifndef _HOSTS_H
|
|
#define _HOSTS_H
|
|
|
|
/*
|
|
$Header: /usr/src/linux/kernel/blk_drv/scsi/RCS/hosts.h,v 1.3 1993/09/24 12:21:00 drew Exp drew $
|
|
*/
|
|
|
|
|
|
/* A jumpstart is often required when the reset() function is called -
|
|
many host adapters cannot do this cleanly, so they do nothing at all.
|
|
To get the command going again, these routines set this bit in the flags
|
|
so that a scsi_request_sense() is executed, and the command starts running
|
|
again */
|
|
|
|
#define NEEDS_JUMPSTART 0x20
|
|
|
|
#define SG_NONE 0
|
|
#define SG_ALL 0xff
|
|
|
|
/* The various choices mean:
|
|
NONE: Self evident. Host adapter is not capable of scatter-gather.
|
|
ALL: Means that the host adapter module can do scatter-gather,
|
|
and that there is no limit to the size of the table to which
|
|
we scatter/gather data.
|
|
Anything else: Indicates the maximum number of chains that can be
|
|
used in one scatter-gather request.
|
|
*/
|
|
|
|
/*
|
|
The Scsi_Host_Template type has all that is needed to interface with a SCSI
|
|
host in a device independant matter. There is one entry for each different
|
|
type of host adapter that is supported on the system.
|
|
*/
|
|
|
|
typedef struct
|
|
{
|
|
/*
|
|
The name pointer is a pointer to the name of the SCSI
|
|
device detected.
|
|
*/
|
|
|
|
char *name;
|
|
|
|
/*
|
|
The detect function shall return non zero on detection,
|
|
indicating the number of host adapters of this particular
|
|
type were found. It should also
|
|
initialize all data necessary for this particular
|
|
SCSI driver. It is passed the host number, so this host
|
|
knows where the first entry is in the scsi_hosts[] array.
|
|
|
|
Note that the detect routine MUST not call any of the mid level
|
|
functions to queue commands because things are not guaranteed
|
|
to be set up yet. The detect routine can send commands to
|
|
the host adapter as long as the program control will not be
|
|
passed to scsi.c in the processesing of the command. Note
|
|
especially that scsi_malloc/scsi_free must not be called.
|
|
*/
|
|
|
|
int (* detect)(int);
|
|
|
|
/*
|
|
The info function will return whatever useful
|
|
information the developer sees fit.
|
|
*/
|
|
|
|
const char *(* info)(void);
|
|
|
|
/*
|
|
The command function takes a target, a command (this is a SCSI
|
|
command formatted as per the SCSI spec, nothing strange), a
|
|
data buffer pointer, and data buffer length pointer. The return
|
|
is a status int, bit fielded as follows :
|
|
Byte What
|
|
0 SCSI status code
|
|
1 SCSI 1 byte message
|
|
2 host error return.
|
|
3 mid level error return
|
|
*/
|
|
|
|
int (* command)(Scsi_Cmnd *);
|
|
|
|
/*
|
|
The QueueCommand function works in a similar manner
|
|
to the command function. It takes an additional parameter,
|
|
void (* done)(int host, int code) which is passed the host
|
|
# and exit result when the command is complete.
|
|
Host number is the POSITION IN THE hosts array of THIS
|
|
host adapter.
|
|
*/
|
|
|
|
int (* queuecommand)(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
|
|
|
|
/*
|
|
Since the mid level driver handles time outs, etc, we want to
|
|
be able to abort the current command. Abort returns 0 if the
|
|
abortion was successful. If non-zero, the code passed to it
|
|
will be used as the return code, otherwise
|
|
DID_ABORT should be returned.
|
|
|
|
Note that the scsi driver should "clean up" after itself,
|
|
resetting the bus, etc. if necessary.
|
|
*/
|
|
|
|
int (* abort)(Scsi_Cmnd *, int);
|
|
|
|
/*
|
|
The reset function will reset the SCSI bus. Any executing
|
|
commands should fail with a DID_RESET in the host byte.
|
|
The Scsi_Cmnd is passed so that the reset routine can figure
|
|
out which host adapter should be reset, and also which command
|
|
within the command block was responsible for the reset in
|
|
the first place. Some hosts do not implement a reset function,
|
|
and these hosts must call scsi_request_sense(SCpnt) to keep
|
|
the command alive.
|
|
*/
|
|
|
|
int (* reset)(Scsi_Cmnd *);
|
|
/*
|
|
This function is used to select synchronous communications,
|
|
which will result in a higher data throughput. Not implemented
|
|
yet.
|
|
*/
|
|
|
|
int (* slave_attach)(int, int);
|
|
/*
|
|
This function determines the bios parameters for a given
|
|
harddisk. These tend to be numbers that are made up by
|
|
the host adapter. Parameters:
|
|
size, device number, list (heads, sectors, cylinders)
|
|
*/
|
|
|
|
int (* bios_param)(int, int, int []);
|
|
|
|
/*
|
|
This determines if we will use a non-interrupt driven
|
|
or an interrupt driven scheme, It is set to the maximum number
|
|
of simulataneous commands a given host adapter will accept.
|
|
*/
|
|
int can_queue;
|
|
|
|
/*
|
|
In many instances, especially where disconnect / reconnect are
|
|
supported, our host also has an ID on the SCSI bus. If this is
|
|
the case, then it must be reserved. Please set this_id to -1 if
|
|
your settup is in single initiator mode, and the host lacks an
|
|
ID.
|
|
*/
|
|
|
|
int this_id;
|
|
|
|
/*
|
|
This determines the degree to which the host adapter is capable
|
|
of scatter-gather.
|
|
*/
|
|
|
|
short unsigned int sg_tablesize;
|
|
|
|
/*
|
|
True if this host adapter can make good use of linked commands.
|
|
This will allow more than one command to be queued to a given
|
|
unit on a given host. Set this to the maximum number of command
|
|
blocks to be provided for each device. Set this to 1 for one
|
|
command block per lun, 2 for two, etc. Do not set this to 0.
|
|
You should make sure that the host adapter will do the right thing
|
|
before you try setting this above 1.
|
|
*/
|
|
|
|
short cmd_per_lun;
|
|
/*
|
|
present contains counter indicating how many boards of this
|
|
type were found when we did the scan.
|
|
*/
|
|
|
|
unsigned char present;
|
|
/*
|
|
true if this host adapter uses unchecked DMA onto an ISA bus.
|
|
*/
|
|
unsigned unchecked_isa_dma:1;
|
|
} Scsi_Host_Template;
|
|
|
|
/*
|
|
The scsi_hosts array is the array containing the data for all
|
|
possible <supported> scsi hosts. This is similar to the
|
|
Scsi_Host_Template, except that we have one entry for each
|
|
actual physical host adapter on the system, stored as a linked
|
|
list. Note that if there are 2 aha1542 boards, then there will
|
|
be two Scsi_Host entries, but only 1 Scsi_Host_Template entries.
|
|
*/
|
|
|
|
struct Scsi_Host
|
|
{
|
|
struct Scsi_Host * next;
|
|
volatile unsigned char host_busy;
|
|
char host_no; /* Used for IOCTL_GET_IDLUN */
|
|
int last_reset;
|
|
struct wait_queue *host_wait;
|
|
Scsi_Cmnd *host_queue;
|
|
Scsi_Host_Template * hostt;
|
|
|
|
/* These parameters should be set by the detect routine */
|
|
unsigned char *base;
|
|
short unsigned int io_port;
|
|
unsigned char irq;
|
|
unsigned char dma_channel;
|
|
/*
|
|
The rest can be copied from the template, or specifically
|
|
initialized, as required.
|
|
*/
|
|
|
|
int this_id;
|
|
short unsigned int sg_tablesize;
|
|
unsigned unchecked_isa_dma:1;
|
|
int hostdata[0]; /* Used for storage of host specific stuff */
|
|
};
|
|
|
|
extern struct Scsi_Host * scsi_hostlist;
|
|
|
|
extern Scsi_Host_Template scsi_hosts[];
|
|
|
|
/*
|
|
scsi_init initializes the scsi hosts.
|
|
*/
|
|
|
|
|
|
unsigned int scsi_init(unsigned long memory_start,unsigned long memory_end);
|
|
extern struct Scsi_Host * scsi_register(int i, int j);
|
|
extern void scsi_unregister(struct Scsi_Host * i, int j);
|
|
|
|
#define BLANK_HOST {"", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
|
#endif
|