patch-1.3.5 linux/drivers/scsi/hosts.h
Next file: linux/drivers/scsi/in2000.c
Previous file: linux/drivers/scsi/hosts.c
Back to the patch index
Back to the overall index
- Lines: 651
- Date:
Thu Jun 29 11:19:13 1995
- Orig file:
v1.3.4/linux/drivers/scsi/hosts.h
- Orig date:
Sun Feb 19 11:42:34 1995
diff -u --recursive --new-file v1.3.4/linux/drivers/scsi/hosts.h linux/drivers/scsi/hosts.h
@@ -1,28 +1,29 @@
/*
- * hosts.h Copyright (C) 1992 Drew Eckhardt
- * mid to low-level SCSI driver interface header by
- * Drew Eckhardt
+ * hosts.h Copyright (C) 1992 Drew Eckhardt
+ * mid to low-level SCSI driver interface header by
+ * Drew Eckhardt
*
- * <drew@colorado.edu>
+ * <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.
+ * 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 $
+ $Header: /usr/src/linux/kernel/blk_drv/scsi/RCS/hosts.h,v 1.3 1993/09/24 12:21:00 drew Exp drew $
*/
/* It is senseless to set SG_ALL any higher than this - the performance
- does not get any better, and it wastes memory */
+ * does not get any better, and it wastes memory
+ */
#define SG_NONE 0
#define SG_ALL 0xff
@@ -30,253 +31,274 @@
#define ENABLE_CLUSTERING 1
/* 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.
-*/
+ * 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 independent matter. There is one entry for each different
- type of host adapter that is supported on the system.
-*/
+ * The Scsi_Host_Template type has all that is needed to interface with a SCSI
+ * host in a device independent matter. There is one entry for each different
+ * type of host adapter that is supported on the system.
+ */
typedef struct scsi_disk Disk;
typedef struct SHT
- {
-
- /* Used with loadable modules so we can construct a linked list. */
- struct SHT * next;
-
- /* Used with loadable modules so that we know when it is safe to unload */
- int * usage_count;
+{
+
+ /* Used with loadable modules so we can construct a linked list. */
+ struct SHT * next;
+
+ /* Used with loadable modules so that we know when it is safe to unload */
+ int * usage_count;
+
+ /* proc-fs info function.
+ * Can be used to export driver statistics and other infos to the world
+ * outside the kernel ie. userspace and it also provides an interface
+ * to feed the driver with information. Check eata_dma_proc.c for reference.
+ */
+ int (*proc_info)(char *, char **, off_t, int, int, int);
+
+ /* driver name that will appear in the /proc/scsi directory */
+ char *procname;
+
+ /* low_ino of the drivers /proc/scsi entry. Defined in proc_fs.h */
+ unsigned short low_ino;
+
+ /*
+ * 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 processing of the command. Note
+ * especially that scsi_malloc/scsi_free must not be called.
+ */
+ int (* detect)(struct SHT *);
+
+ /* Used with loadable modules to unload the host structures. Note:
+ * there is a default action built into the modules code which may
+ * be sufficient for most host adapters. Thus you may not have to supply
+ * this at all.
+ */
+ int (*release)(struct Scsi_Host *);
+
+ /*
+ * The info function will return whatever useful
+ * information the developer sees fit. If not provided, then
+ * the name field will be used instead.
+ */
+ const char *(* info)(struct Scsi_Host *);
+
+ /*
+ * 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. The field SCpnt->abort reason
+ * can be filled in with the appropriate reason why we wanted
+ * the abort in the first place, and this will be used
+ * in the mid-level code instead of the host_byte().
+ * 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 *);
+
+ /*
+ * 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)(Disk *, 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 simultaneous 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 setup 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;
+
+ /*
+ * true if this host adapter can make good use of clustering.
+ * I originally thought that if the tablesize was large that it
+ * was a waste of CPU cycles to prepare a cluster list, but
+ * it works out that the Buslogic is faster if you use a smaller
+ * number of segments (i.e. use clustering). I guess it is
+ * inefficient.
+ */
+ unsigned use_clustering:1;
- /*
- 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 processing of the command. Note
- especially that scsi_malloc/scsi_free must not be called.
- */
-
- int (* detect)(struct SHT *);
-
- /* Used with loadable modules to unload the host structures. Note:
- there is a default action built into the modules code which may
- be sufficient for most host adapters. Thus you may not have to supply
- this at all. */
- int (*release)(struct Scsi_Host *);
- /*
- The info function will return whatever useful
- information the developer sees fit. If not provided, then
- the name field will be used instead.
- */
-
- const char *(* info)(struct Scsi_Host *);
-
- /*
- 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. The field SCpnt->abort reason
- can be filled in with the appropriate reason why we wanted
- the abort in the first place, and this will be used
- in the mid-level code instead of the host_byte().
- 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 *);
-
- /*
- 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)(Disk *, 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 simultaneous 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 setup 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;
- /*
- true if this host adapter can make good use of clustering.
- I originally thought that if the tablesize was large that it
- was a waste of CPU cycles to prepare a cluster list, but
- it works out that the Buslogic is faster if you use a smaller
- number of segments (i.e. use clustering). I guess it is
- inefficient.
- */
- unsigned use_clustering:1;
- } Scsi_Host_Template;
+} 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.
-*/
+ * 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;
- unsigned short extra_bytes;
- 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;
-
- /* Pointer to a circularly linked list - this indicates the hosts
- that should be locked out of performing I/O while we have an active
- command on this host. */
- struct Scsi_Host * block;
- unsigned wish_block:1;
-
- /* These parameters should be set by the detect routine */
- unsigned char *base;
- unsigned int io_port;
- unsigned char n_io_port;
- unsigned char irq;
- unsigned char dma_channel;
-
- /*
- Set these if there are conflicts between memory
- in the < 1mb region and regions at 16mb multiples.
- The address must be on a page boundary.
- */
- unsigned long forbidden_addr;
- unsigned long forbidden_size;
-
- /*
- The rest can be copied from the template, or specifically
- initialized, as required.
- */
-
- int this_id;
- int can_queue;
- short cmd_per_lun;
- short unsigned int sg_tablesize;
- unsigned unchecked_isa_dma:1;
- /*
- True if this host was loaded as a loadable module
- */
- unsigned loaded_as_module:1;
-
- int hostdata[0]; /* Used for storage of host specific stuff */
- };
+{
+ struct Scsi_Host * next;
+ unsigned short extra_bytes;
+ volatile unsigned char host_busy;
+ char host_no; /* Used for IOCTL_GET_IDLUN, /proc/scsi et al. */
+ int last_reset;
+ struct wait_queue *host_wait;
+ Scsi_Cmnd *host_queue;
+ Scsi_Host_Template * hostt;
+
+ /*
+ * These three parameters can be used to allow for wide scsi,
+ * and for host adapters that support multiple busses
+ * The first two should be set to 1 more than the actual max id
+ * or lun (i.e. 8 for normal systems).
+ */
+ unsigned int max_id;
+ unsigned int max_lun;
+ unsigned int max_channel;
+
+ /*
+ * Pointer to a circularly linked list - this indicates the hosts
+ * that should be locked out of performing I/O while we have an active
+ * command on this host.
+ */
+ struct Scsi_Host * block;
+ unsigned wish_block:1;
+
+ /* These parameters should be set by the detect routine */
+ unsigned char *base;
+ unsigned int io_port;
+ unsigned char n_io_port;
+ unsigned char irq;
+ unsigned char dma_channel;
+
+ /*
+ * Set these if there are conflicts between memory
+ * in the < 1mb region and regions at 16mb multiples.
+ * The address must be on a page boundary.
+ */
+ unsigned long forbidden_addr;
+ unsigned long forbidden_size;
+
+ /*
+ * The rest can be copied from the template, or specifically
+ * initialized, as required.
+ */
+
+ int this_id;
+ int can_queue;
+ short cmd_per_lun;
+ short unsigned int sg_tablesize;
+ unsigned unchecked_isa_dma:1;
+ unsigned use_clustering:1;
+ /*
+ * True if this host was loaded as a loadable module
+ */
+ unsigned loaded_as_module:1;
+
+ int hostdata[0]; /* Used for storage of host specific stuff */
+};
extern struct Scsi_Host * scsi_hostlist;
extern struct Scsi_Device_Template * scsi_devicelist;
@@ -284,19 +306,21 @@
extern Scsi_Host_Template * scsi_hosts;
/*
- scsi_init initializes the scsi hosts.
-*/
-
+ * scsi_init initializes the scsi hosts.
+ */
-/* We use these goofy things because the MM is not set up when we init
- the scsi subsystem. By using these functions we can write code that
- looks normal. Also, it makes it possible to use the same code for a
- loadable module. */
+/*
+ * We use these goofy things because the MM is not set up when we init
+ * the scsi subsystem. By using these functions we can write code that
+ * looks normal. Also, it makes it possible to use the same code for a
+ * loadable module.
+ */
extern void * scsi_init_malloc(unsigned int size, int priority);
extern void scsi_init_free(char * ptr, unsigned int size);
-void scan_scsis (struct Scsi_Host * shpnt);
+void scan_scsis (struct Scsi_Host * shpnt, unchar hardcoded,
+ unchar hchannel, unchar hid, unchar hlun);
extern int next_scsi_host;
@@ -310,20 +334,22 @@
struct Scsi_Device_Template
{
- struct Scsi_Device_Template * next;
- char * name;
- char * tag;
- unsigned char scsi_type;
- unsigned char major;
- unsigned char nr_dev; /* Number currently attached */
- unsigned char dev_noticed; /* Number of devices detected. */
- unsigned char dev_max; /* Current size of arrays */
- unsigned blk:1; /* 0 if character device */
- int (*detect)(Scsi_Device *); /* Returns 1 if we can attach this device */
- void (*init)(void); /* Sizes arrays based upon number of devices detected */
- void (*finish)(void); /* Perform initialization after attachment */
- int (*attach)(Scsi_Device *); /* Attach devices to arrays */
- void (*detach)(Scsi_Device *);
+ struct Scsi_Device_Template * next;
+ char * name;
+ char * tag;
+ int * usage_count; /* Used for loadable modules */
+ unsigned char scsi_type;
+ unsigned char major;
+ unsigned char nr_dev; /* Number currently attached */
+ unsigned char dev_noticed; /* Number of devices detected. */
+ unsigned char dev_max; /* Current size of arrays */
+ unsigned blk:1; /* 0 if character device */
+ int (*detect)(Scsi_Device *); /* Returns 1 if we can attach this device */
+ void (*init)(void); /* Sizes arrays based upon number of devices
+ * detected */
+ void (*finish)(void); /* Perform initialization after attachment */
+ int (*attach)(Scsi_Device *); /* Attach devices to arrays */
+ void (*detach)(Scsi_Device *);
};
extern struct Scsi_Device_Template sd_template;
@@ -345,10 +371,10 @@
/*
- * This is an ugly hack. If we expect to be able to load devices at run time, we need
- * to leave extra room in some of the data structures. Doing a realloc to enlarge
- * the structures would be riddled with race conditions, so until a better solution
- * is discovered, we use this crude approach
+ * This is an ugly hack. If we expect to be able to load devices at run time,
+ * we need to leave extra room in some of the data structures. Doing a
+ * realloc to enlarge the structures would be riddled with race conditions,
+ * so until a better solution is discovered, we use this crude approach
*/
#define SD_EXTRA_DEVS 2
#define ST_EXTRA_DEVS 2
@@ -363,12 +389,14 @@
* of the file.
* ---------------------------------------------------------------------------
* Local variables:
- * c-indent-level: 8
+ * c-indent-level: 4
* c-brace-imaginary-offset: 0
- * c-brace-offset: -8
- * c-argdecl-indent: 8
- * c-label-offset: -8
- * c-continued-statement-offset: 8
+ * c-brace-offset: -4
+ * c-argdecl-indent: 4
+ * c-label-offset: -4
+ * c-continued-statement-offset: 4
* c-continued-brace-offset: 0
+ * indent-tabs-mode: nil
+ * tab-width: 4
* End:
*/
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov
with Sam's (original) version of this