                          Linux Kernel 2.6 series
                 SCSI mid_level - lower_level driver interface
                 =============================================

Introduction
============
This document outlines the interface between the Linux SCSI mid level and
SCSI lower level drivers. Lower level drivers (LLDs) are variously called 
host bus adapter (HBA) drivers and host drivers (HD). A "host" in this
context is a bridge between a computer IO bus (e.g. PCI or ISA) and a
single SCSI initiator port on a SCSI transport. An "initiator" port
(SCSI terminology, see SAM-3 at http://www.t10.org) sends SCSI commands
to "target" SCSI ports (e.g. disks). There can be many LLDs in a running
system, but only one per hardware type. Most LLDs can control one or more
SCSI HBAs. Some HBAs contain multiple hosts.

In some cases the SCSI transport is an external bus that already has
its own subsystem in Linux (e.g. USB and ieee1394). In such cases the
SCSI subsystem LLD is a software bridge to the other driver subsystem.
Examples are the usb-storage driver (found in the drivers/usb/storage
directory) and the ieee1394/sbp2 driver (found in the drivers/ieee1394
directory).

For example, the aic7xxx LLD controls Adaptec SCSI parallel interface
(SPI) controllers based on that company's 7xxx chip series. The aic7xxx
LLD can be built into the kernel or loaded as a module. There can only be
one aic7xxx LLD running in a Linux system but it may be controlling many 
HBAs. These HBAs might be either on PCI daughter-boards or built into 
the motherboard (or both). Some aic7xxx based HBAs are dual controllers
and thus represent two hosts. Like most modern HBAs, each aic7xxx host
has its own PCI device address. [The one-to-one correspondence between
a SCSI host and a PCI device is common but not required (e.g. with
ISA adapters).]

The SCSI mid level isolates an LLD from other layers such as the SCSI
upper layer drivers and the block layer.

This version of the document roughly matches linux kernel version 2.6.8 .

Documentation
=============
There is a SCSI documentation directory within the kernel source tree, 
typically Documentation/scsi . Most documents are in plain
(i.e. ASCII) text. This file is named scsi_mid_low_api.txt and can be 
found in that directory. A more recent copy of this document may be found
at http://web.archive.org/web/20070107183357rn_1/sg.torque.net/scsi/. 
Many LLDs are documented there (e.g. aic7xxx.txt). The SCSI mid-level is
briefly described in scsi.txt which contains a url to a document 
describing the SCSI subsystem in the lk 2.4 series. Two upper level 
drivers have documents in that directory: st.txt (SCSI tape driver) and 
scsi-generic.txt (for the sg driver).

Some documentation (or urls) for LLDs may be found in the C source code
or in the same directory as the C source code. For example to find a url
about the USB mass storage driver see the 
/usr/src/linux/drivers/usb/storage directory.

Driver structure
================
Traditionally an LLD for the SCSI subsystem has been at least two files in
the drivers/scsi directory. For example, a driver called "xyz" has a header
file "xyz.h" and a source file "xyz.c". [Actually there is no good reason
why this couldn't all be in one file; the header file is superfluous.] Some
drivers that have been ported to several operating systems have more than
two files. For example the aic7xxx driver has separate files for generic 
and OS-specific code (e.g. FreeBSD and Linux). Such drivers tend to have
their own directory under the drivers/scsi directory.

When a new LLD is being added to Linux, the following files (found in the
drivers/scsi directory) will need some attention: Makefile and Kconfig .
It is probably best to study how existing LLDs are organized.

As the 2.5 series development kernels evolve into the 2.6 series
production series, changes are being introduced into this interface. An
example of this is driver initialization code where there are now 2 models
available. The older one, similar to what was found in the lk 2.4 series,
is based on hosts that are detected at HBA driver load time. This will be
referred to the "passive" initialization model. The newer model allows HBAs
to be hot plugged (and unplugged) during the lifetime of the LLD and will
be referred to as the "hotplug" initialization model. The newer model is
preferred as it can handle both traditional SCSI equipment that is
permanently connected as well as modern "SCSI" devices (e.g. USB or
IEEE 1394 connected digital cameras) that are hotplugged. Both 
initialization models are discussed in the following sections.

An LLD interfaces to the SCSI subsystem several ways:
  a) directly invoking functions supplied by the mid level
  b) passing a set of function pointers to a registration function
     supplied by the mid level. The mid level will then invoke these
     functions at some point in the future. The LLD will supply
     implementations of these functions.
  c) direct access to instances of well known data structures maintained
     by the mid level

Those functions in group a) are listed in a section entitled "Mid level
supplied functions" below.

Those functions in group b) are listed in a section entitled "Interface
functions" below. Their function pointers are placed in the members of
"struct scsi_host_template", an instance of which is passed to
scsi_host_alloc() ** .  Those interface functions that the LLD does not 
wish to supply should have NULL placed in the corresponding member of 
struct scsi_host_template.  Defining an instance of struct 
scsi_host_template at file scope will cause NULL to be  placed in function
 pointer members not explicitly initialized.

Those usages in group c) should be handled with care, especially in a
"hotplug" environment. LLDs should be aware of the lifetime of instances
that are shared with the mid level and other layers.

All functions defined within an LLD and all data defined at file scope
should be static. For example the slave_alloc() function in an LLD
called "xxx" could be defined as 
"static int xxx_slave_alloc(struct scsi_device * sdev) { /* code */ }"

** the scsi_host_alloc() function is a replacement for the rather vaguely
named scsi_register() function in most situations. The scsi_register()
and scsi_unregister() functions remain to support legacy LLDs that use
the passive initialization model.


Hotplug initialization model
============================
In this model an LLD controls when SCSI hosts are introduced and removed
from the SCSI subsystem. Hosts can be introduced as early as driver
initialization and removed as late as driver shutdown. Typically a driver
will respond to a sysfs probe() callback that indicates an HBA has been
detected. After confirming that the new device is one that the LLD wants
to control, the LLD will initialize the HBA and then register a new host
with the SCSI mid level.

During LLD initialization the driver should register itself with the
appropriate IO bus on which it expects to find HBA(s) (e.g. the PCI bus).
This can probably be done via sysfs. Any driver parameters (especially
those that are writable after the driver is loaded) could also be
registered with sysfs at this point. The SCSI mid level first becomes
aware of an LLD when that LLD registers its first HBA.

At some later time, the LLD becomes aware of an HBA and what follows
is a typical sequence of calls between the LLD and the mid level.
This example shows the mid level scanning the newly introduced HBA for 3 
scsi devices of which only the first 2 respond:

     HBA PROBE: assume 2 SCSI devices found in scan
LLD                   mid level                    LLD
===-------------------=========--------------------===------
scsi_host_alloc()  -->
scsi_add_host()  ---->
scsi_scan_host()  -------+
                         |
                    slave_alloc()
                    slave_configure() -->  scsi_adjust_queue_depth()
                         |
                    slave_alloc()
                    slave_configure()
                         |
                    slave_alloc()   ***
                    slave_destroy() ***
------------------------------------------------------------

If the LLD wants to adjust the default queue settings, it can invoke
scsi_adjust_queue_depth() in its slave_configure() routine.

*** For scsi devices that the mid level tries to scan but do not
    respond, a slave_alloc(), slave_destroy() pair is called.

When an HBA is being removed it could be as part of an orderly shutdown
associated with the LLD module being unloaded (e.g. with the "rmmod"
command) or in response to a "hot unplug" indicated by sysfs()'s
remove() callback being invoked. In either case, the sequence is the
same:

        HBA REMOVE: assume 2 SCSI devices attached
LLD                      mid level                 LLD
===----------------------=========-----------------===------
scsi_remove_host() ---------+
                            |
                     slave_destroy()
                     slave_destroy()
scsi_host_put()
------------------------------------------------------------
                     
It may be useful for a LLD to keep track of struct Scsi_Host instances
(a pointer is returned by scsi_host_alloc()). Such instances are "owned"
by the mid-level.  struct Scsi_Host instances are freed from
scsi_host_put() when the reference count hits zero.

Hot unplugging an HBA that controls a disk which is processing SCSI
commands on a mounted file system is an interesting situation. Reference
counting logic is being introduced into the mid level to cope with many
of the issues involved. See the section on reference counting below.


The hotplug concept may be extended to SCSI devices. Currently, when an
HBA is added, the scsi_scan_host() function causes a scan for SCSI devices
attached to the HBA's SCSI transport. On newer SCSI transports the HBA
may become aware of a new SCSI device _after_ the scan has completed.
An LLD can use this sequence to make the mid level aware of a SCSI device:

                 SCSI DEVICE hotplug
LLD                   mid level                    LLD
===-------------------=========--------------------===------
scsi_add_device()  ------+
                         |
                    slave_alloc()
                    slave_configure()   [--> scsi_adjust_queue_depth()]
------------------------------------------------------------

In a similar fashion, an LLD may become aware that a SCSI device has been
removed (unplugged) or the connection to it has been interrupted. Some
existing SCSI transports (e.g. SPI) may not become aware that a SCSI
device has been removed until a subsequent SCSI command fails which will
probably cause that device to be set offline by the mid level. An LLD that
detects the removal of a SCSI device can instigate its removal from
upper layers with this sequence:

                  SCSI DEVICE hot unplug
LLD                      mid level                 LLD
===----------------------=========-----------------===------
scsi_remove_device() -------+
                            |
                     slave_destroy()
------------------------------------------------------------

It may be useful for an LLD to keep track of struct scsi_device instances
(a pointer is passed as the parameter to slave_alloc() and
slave_configure() callbacks). Such instances are "owned" by the mid-level.
struct scsi_device instances are freed after slave_destroy().


Passive initialization model
============================
These older LLDs include a file called "scsi_module.c" [yes the ".c" is a
little surprising] in their source code. For that file to work an
instance of struct scsi_host_template with the name "driver_template"
needs to be defined. Here is a typical code sequence used in this model:
    static struct scsi_host_template driver_template = {
        ...
    };
    #include "scsi_module.c"

The scsi_module.c file contains two functions:
  - init_this_scsi_driver() which is executed when the LLD is
    initialized (i.e. boot time or module load time)
  - exit_this_scsi_driver() which is executed when the LLD is shut
    down (i.e. module unload time)
Note: since these functions are tagged with __init and __exit qualifiers
an LLD should not call them explicitly (since the kernel does that).

Here is an example of an initialization sequence when two hosts are
detected (so detect() returns 2) and the SCSI bus scan on each host
finds 1 SCSI device (and a second device does not respond).

LLD                      mid level                 LLD
===----------------------=========-----------------===------
init_this_scsi_driver() ----+
                            |
                         detect()  -----------------+
                            |                       |
                            |                scsi_register()
                            |                scsi_register()
                            |
                      slave_alloc()
                      slave_configure()  -->  scsi_adjust_queue_depth()
                      slave_alloc()   ***
                      slave_destroy() ***
                            |
                      slave_alloc()
                      slave_configure()
                      slave_alloc()   ***
                      slave_destroy() ***
------------------------------------------------------------

The mid level invokes scsi_adjust_queue_depth() with tagged queuing off and
"cmd_per_lun" for that host as the queue length. These settings can be
overridden by a slave_configure() supplied by the LLD.

*** For scsi devices that the mid level tries to scan but do not
    respond, a slave_alloc(), slave_destroy() pair is called.

Here is an LLD shutdown sequence:

LLD                      mid level                 LLD
===----------------------=========-----------------===------
exit_this_scsi_driver() ----+
                            |
                     slave_destroy()
                        release()   -->   scsi_unregister()
                            |
                     slave_destroy()
                        release()   -->   scsi_unregister()
------------------------------------------------------------

An LLD need not define slave_destroy() (i.e. it is optional). 

The shortcoming of the "passive initialization model" is that host
registration and de-registration are (typically) tied to LLD initialization
and shutdown. Once the LLD is initialized then a new host that appears
(e.g. via hotplugging) cannot easily be added without a redundant
driver shutdown and re-initialization. It may be possible to write an LLD
that uses both initialization models.


Reference Counting
==================
The Scsi_Host structure has had reference counting infrastructure added.
This effectively spreads the ownership of struct Scsi_Host instances
across the various SCSI layers which use them. Previously such instances
were exclusively owned by the mid level. LLDs would not usually need to
directly manipulate these reference counts but there may be some cases
where they do.

There are 3 reference counting functions of interest associated with
struct Scsi_Host:
  - scsi_host_alloc(): returns a pointer to new instance of struct 
        Scsi_Host which has its reference count ^^ set to 1
  - scsi_host_get(): adds 1 to the reference count of the given instance
  - scsi_host_put(): decrements 1 from the reference count of the given
        instance. If the reference count reaches 0 then the given instance
        is freed

The Scsi_device structure has had reference counting infrastructure added.
This effectively spreads the ownership of struct Scsi_device instances
across the various SCSI layers which use them. Previously such instances
were exclusively owned by the mid level. See the access functions declared
towards the end of include/scsi/scsi_device.h . If an LLD wants to keep
a copy of a pointer to a Scsi_device instance it should use scsi_device_get()
to bump its reference count. When it is finished with the pointer it can
use scsi_device_put() to decrement its reference count (and potentially
delete it).

^^ struct Scsi_Host actually has 2 reference counts which are manipulated
in parallel by these functions.


Conventions
===========
First, Linus Torvalds's thoughts on C coding style can be found in the
Documentation/CodingStyle file. 

Next, there is a movement to "outlaw" typedefs introducing synonyms for 
struct tags. Both can be still found in the SCSI subsystem, but
the typedefs have been moved to a single file, scsi_typedefs.h to
make their future removal easier, for example: 
"typedef struct scsi_cmnd Scsi_Cmnd;"

Also, most C99 enhancements are encouraged to the extent they are supported
by the relevant gcc compilers. So C99 style structure and array
initializers are encouraged where appropriate. Don't go too far,
VLAs are not properly supported yet.  An exception to this is the use of
"//" style comments; /*...*/ comments are still preferred in Linux.

Well written, tested and documented code, need not be re-formatted to
comply with the above conventions. For example, the aic7xxx driver
comes to Linux from FreeBSD and Adaptec's own labs. No doubt FreeBSD
and Adaptec have their own coding conventions.


Mid level supplied functions
============================
These functions are supplied by the SCSI mid level for use by LLDs.
The names (i.e. entry points) of these functions are exported 
so an LLD that is a module can access them. The kernel will
arrange for the SCSI mid level to be loaded and initialized before any LLD
is initialized. The functions below are listed alphabetically and their
names all start with "scsi_".

Summary:
   scsi_activate_tcq - turn on tag command queueing
   scsi_add_device - creates new scsi device (lu) instance
   scsi_add_host - perform sysfs registration and set up transport class
   scsi_adjust_queue_depth - change the queue depth on a SCSI device
   scsi_bios_ptable - return copy of block device's partition table
   scsi_block_requests - prevent further commands being queued to given host
   scsi_deactivate_tcq - turn off tag command queueing
   scsi_host_alloc - return a new scsi_host instance whose refcount==1
   scsi_host_get - increments Scsi_Host instance's refcount
   scsi_host_put - decrements Scsi_Host instance's refcount (free if 0)
   scsi_partsize - parse partition table into cylinders, heads + sectors
   scsi_register - create and register a scsi host adapter instance.
   scsi_remove_device - detach and remove a SCSI device
   scsi_remove_host - detach and remove all SCSI devices owned by host
   scsi_report_bus_reset - report scsi _bus_ reset observed
   scsi_scan_host - scan SCSI bus
   scsi_track_queue_full - track successive QUEUE_FULL events 
   scsi_unblock_requests - allow further commands to be queued to given host
   scsi_unregister - [calls scsi_host_put()]


Details:

/**
 * scsi_activate_tcq - turn on tag command queueing ("ordered" task attribute)
 * @sdev:       device to turn on TCQ for
 * @depth:      queue depth
 *
 *      Returns nothing
 *
 *      Might block: no
 *
 *      Notes: Eventually, it is hoped depth would be the maximum depth
 *      the device could cope with and the real queue depth
 *      would be adjustable from 0 to depth.
 *
 *      Defined (inline) in: include/scsi/scsi_tcq.h
 **/
void scsi_activate_tcq(struct scsi_device *sdev, int depth)


/**
 * scsi_add_device - creates new scsi device (lu) instance
 * @shost:   pointer to scsi host instance
 * @channel: channel number (rarely other than 0)
 * @id:      target id number
 * @lun:     logical unit number
 *
 *      Returns pointer to new struct scsi_device instance or 
 *      ERR_PTR(-ENODEV) (or some other bent pointer) if something is
 *      wrong (e.g. no lu responds at given address)
 *
 *      Might block: yes
 *
 *      Notes: This call is usually performed internally during a scsi
 *      bus scan when an HBA is added (i.e. scsi_scan_host()). So it
 *      should only be called if the HBA becomes aware of a new scsi
 *      device (lu) after scsi_scan_host() has completed. If successful
 *      this call can lead to slave_alloc() and slave_configure() callbacks
 *      into the LLD.
 *
 *      Defined in: drivers/scsi/scsi_scan.c
 **/
struct scsi_device * scsi_add_device(struct Scsi_Host *shost, 
                                     unsigned int channel,
                                     unsigned int id, unsigned int lun)


/**
 * scsi_add_host - perform sysfs registration and set up transport class
 * @shost:   pointer to scsi host instance
 * @dev:     pointer to struct device of type scsi class
 *
 *      Returns 0 on success, negative errno of failure (e.g. -ENOMEM)
 *
 *      Might block: no
 *
 *      Notes: Only required in "hotplug initialization model" after a
 *      successful call to scsi_host_alloc().  This function does not
 *	scan the bus; this can be done by calling scsi_scan_host() or
 *	in some other transport-specific way.  The LLD must set up
 *	the transport template before calling this function and may only
 *	access the transport class data after this function has been called.
 *
 *      Defined in: drivers/scsi/hosts.c
 **/
int scsi_add_host(struct Scsi_Host *shost, struct device * dev)


/**
 * scsi_adjust_queue_depth - allow LLD to change queue depth on a SCSI device
 * @sdev:       pointer to SCSI device to change queue depth on
 * @tagged:     0 - no tagged queuing
 *              MSG_SIMPLE_TAG - simple tagged queuing
 *              MSG_ORDERED_TAG - ordered tagged queuing
 * @tags        Number of tags allowed if tagged queuing enabled,
 *              or number of commands the LLD can queue up
 *              in non-tagged mode (as per cmd_per_lun).
 *
 *      Returns nothing
 *
 *      Might block: no
 *
 *      Notes: Can be invoked any time on a SCSI device controlled by this
 *      LLD. [Specifically during and after slave_configure() and prior to
 *      slave_destroy().] Can safely be invoked from interrupt code. Actual
 *      queue depth change may be delayed until the next command is being
 *      processed. See also scsi_activate_tcq() and scsi_deactivate_tcq().
 *
 *      Defined in: drivers/scsi/scsi.c [see source code for more notes]
 *
 **/
void scsi_adjust_queue_depth(struct scsi_device * sdev, int tagged, 
                             int tags)


/**
 * scsi_bios_ptable - return copy of block device's partition table
 * @dev:        pointer to block device
 *
 *      Returns pointer to partition table, or NULL for failure
 *
 *      Might block: yes
 *
 *      Notes: Caller owns memory returned (free with kfree() )
 *
 *      Defined in: drivers/scsi/scsicam.c
 **/
unsigned char *scsi_bios_ptable(struct block_device *dev)


/**
 * scsi_block_requests - prevent further commands being queued to given host
 *
 * @shost: pointer to host to block commands on
 *
 *      Returns nothing
 *
 *      Might block: no
 *
 *      Notes: There is no timer nor any other means by which the requests
 *      get unblocked other than the LLD calling scsi_unblock_requests().
 *
 *      Defined in: drivers/scsi/scsi_lib.c
**/
void scsi_block_requests(struct Scsi_Host * shost)


/**
 * scsi_deactivate_tcq - turn off tag command queueing
 * @sdev:       device to turn off TCQ for
 * @depth:      queue depth (stored in sdev)
 *
 *      Returns nothing
 *
 *      Might block: no
 *
 *      Defined (inline) in: include/scsi/scsi_tcq.h
 **/
void scsi_deactivate_tcq(struct scsi_device *sdev, int depth)


/**
 * scsi_host_alloc - create a scsi host adapter instance and perform basic
 *                   initialization.
 * @sht:        pointer to scsi host template
 * @privsize:   extra bytes to allocate in hostdata array (which is the
 *              last member of the returned Scsi_Host instance)
 *
 *      Returns pointer to new Scsi_Host instance or NULL on failure
 *
 *      Might block: yes
 *
 *      Notes: When this call returns to the LLD, the SCSI bus scan on
 *      this host has _not_ yet been done.
 *      The hostdata array (by default zero length) is a per host scratch 
 *      area for the LLD's exclusive use.
 *      Both associated refcounting objects have their refcount set to 1.
 *      Full registration (in sysfs) and a bus scan are performed later when
 *      scsi_add_host() and scsi_scan_host() are called.
 *
 *      Defined in: drivers/scsi/hosts.c .
 **/
struct Scsi_Host * scsi_host_alloc(struct scsi_host_template * sht,
                                   int privsize)


/**
 * scsi_host_get - increment Scsi_Host instance refcount
 * @shost:   pointer to struct Scsi_Host instance
 *
 *      Returns nothing
 *
 *      Might block: currently may block but may be changed to not block
 *
 *      Notes: Actually increments the counts in two sub-objects
 *
 *      Defined in: drivers/scsi/hosts.c
 **/
void scsi_host_get(struct Scsi_Host *shost)


/**
 * scsi_host_put - decrement Scsi_Host instance refcount, free if 0
 * @shost:   pointer to struct Scsi_Host instance
 *
 *      Returns nothing
 *
 *      Might block: currently may block but may be changed to not block
 *
 *      Notes: Actually decrements the counts in two sub-objects. If the
 *      latter refcount reaches 0, the Scsi_Host instance is freed.
 *      The LLD need not worry exactly when the Scsi_Host instance is
 *      freed, it just shouldn't access the instance after it has balanced
 *      out its refcount usage.
 *
 *      Defined in: drivers/scsi/hosts.c
 **/
void scsi_host_put(struct Scsi_Host *shost)


/**
 * scsi_partsize - parse partition table into cylinders, heads + sectors
 * @buf: pointer to partition table
 * @capacity: size of (total) disk in 512 byte sectors
 * @cyls: outputs number of cylinders calculated via this pointer
 * @hds: outputs number of heads calculated via this pointer
 * @secs: outputs number of sectors calculated via this pointer
 *
 *      Returns 0 on success, -1 on failure
 *
 *      Might block: no
 *
 *      Notes: Caller owns memory returned (free with kfree() )
 *
 *      Defined in: drivers/scsi/scsicam.c
 **/
int scsi_partsize(unsigned char *buf, unsigned long capacity,
                  unsigned int *cyls, unsigned int *hds, unsigned int *secs)


/**
 * scsi_register - create and register a scsi host adapter instance.
 * @sht:        pointer to scsi host template
 * @privsize:   extra bytes to allocate in hostdata array (which is the
 *              last member of the returned Scsi_Host instance)
 *
 *      Returns pointer to new Scsi_Host instance or NULL on failure
 *
 *      Might block: yes
 *
 *      Notes: When this call returns to the LLD, the SCSI bus scan on
 *      this host has _not_ yet been done.
 *      The hostdata array (by default zero length) is a per host scratch 
 *      area for the LLD.
 *
 *      Defined in: drivers/scsi/hosts.c .
 **/
struct Scsi_Host * scsi_register(struct scsi_host_template * sht,
                                 int privsize)


/**
 * scsi_remove_device - detach and remove a SCSI device
 * @sdev:      a pointer to a scsi device instance
 *
 *      Returns value: 0 on success, -EINVAL if device not attached
 *
 *      Might block: yes
 *
 *      Notes: If an LLD becomes aware that a scsi device (lu) has
 *      been removed but its host is still present then it can request
 *      the removal of that scsi device. If successful this call will
 *      lead to the slave_destroy() callback being invoked. sdev is an 
 *      invalid pointer after this call.
 *
 *      Defined in: drivers/scsi/scsi_sysfs.c .
 **/
int scsi_remove_device(struct scsi_device *sdev)


/**
 * scsi_remove_host - detach and remove all SCSI devices owned by host
 * @shost:      a pointer to a scsi host instance
 *
 *      Returns value: 0 on success, 1 on failure (e.g. LLD busy ??)
 *
 *      Might block: yes
 *
 *      Notes: Should only be invoked if the "hotplug initialization
 *      model" is being used. It should be called _prior_ to  
 *      scsi_unregister().
 *
 *      Defined in: drivers/scsi/hosts.c .
 **/
int scsi_remove_host(struct Scsi_Host *shost)


/**
 * scsi_report_bus_reset - report scsi _bus_ reset observed
 * @shost: a pointer to a scsi host involved
 * @channel: channel (within) host on which scsi bus reset occurred
 *
 *      Returns nothing
 *
 *      Might block: no
 *
 *      Notes: This only needs to be called if the reset is one which
 *      originates from an unknown location.  Resets originated by the 
 *      mid level itself don't need to call this, but there should be 
 *      no harm.  The main purpose of this is to make sure that a
 *      CHECK_CONDITION is properly treated.
 *
 *      Defined in: drivers/scsi/scsi_error.c .
 **/
void scsi_report_bus_reset(struct Scsi_Host * shost, int channel)


/**
 * scsi_scan_host - scan SCSI bus
 * @shost: a pointer to a scsi host instance
 *
 *	Might block: yes
 *
 *	Notes: Should be called after scsi_add_host()
 *
 *	Defined in: drivers/scsi/scsi_scan.c
 **/
void scsi_scan_host(struct Scsi_Host *shost)


/**
 * scsi_track_queue_full - track successive QUEUE_FULL events on given
 *                      device to determine if and when there is a need
 *                      to adjust the queue depth on the device.
 * @sdev:  pointer to SCSI device instance
 * @depth: Current number of outstanding SCSI commands on this device,
 *         not counting the one returned as QUEUE_FULL.
 *
 *      Returns 0  - no change needed
 *              >0 - adjust queue depth to this new depth
 *              -1 - drop back to untagged operation using host->cmd_per_lun
 *                   as the untagged command depth
 *
 *      Might block: no
 *
 *      Notes: LLDs may call this at any time and we will do "The Right
 *              Thing"; interrupt context safe. 
 *
 *      Defined in: drivers/scsi/scsi.c .
 **/
int scsi_track_queue_full(struct scsi_device *sdev, int depth)


/**
 * scsi_unblock_requests - allow further commands to be queued to given host
 *
 * @shost: pointer to host to unblock commands on
 *
 *      Returns nothing
 *
 *      Might block: no
 *
 *      Defined in: drivers/scsi/scsi_lib.c .
**/
void scsi_unblock_requests(struct Scsi_Host * shost)


/**
 * scsi_unregister - unregister and free memory used by host instance
 * @shp:        pointer to scsi host instance to unregister.
 *
 *      Returns nothing
 *
 *      Might block: no
 *
 *      Notes: Should not be invoked if the "hotplug initialization
 *      model" is being used. Called internally by exit_this_scsi_driver()
 *      in the "passive initialization model". Hence a LLD has no need to
 *      call this function directly.
 *
 *      Defined in: drivers/scsi/hosts.c .
 **/
void scsi_unregister(struct Scsi_Host * shp)




Interface Functions
===================
Interface functions are supplied (defined) by LLDs and their function
pointers are placed in an instance of struct scsi_host_template which
is passed to scsi_host_alloc() [or scsi_register() / init_this_scsi_driver()].
Some are mandatory. Interface functions should be declared static. The
accepted convention is that driver "xyz" will declare its slave_configure() 
function as:
    static int xyz_slave_configure(struct scsi_device * sdev);
and so forth for all interface functions listed below.

A pointer to this function should be placed in the 'slave_configure' member
of a "struct scsi_host_template" instance. A pointer to such an instance
should be passed to the mid level's scsi_host_alloc() [or scsi_register() /
init_this_scsi_driver()].

The interface functions are also described in the include/scsi/scsi_host.h
file immediately above their definition point in "struct scsi_host_template".
In some cases more detail is given in scsi_host.h than below.

The interface functions are listed below in alphabetical order.

Summary:
   bios_param - fetch head, sector, cylinder info for a disk
   detect - detects HBAs this driver wants to control
   eh_timed_out - notify the host that a command timer expired
   eh_abort_handler - abort given command
   eh_bus_reset_handler - issue SCSI bus reset
   eh_device_reset_handler - issue SCSI device reset
   eh_host_reset_handler - reset host (host bus adapter)
   info - supply information about given host
   ioctl - driver can respond to ioctls
   proc_info - supports /proc/scsi/{driver_name}/{host_no}
   queuecommand - queue scsi command, invoke 'done' on completion
   release - release all resources associated with given host
   slave_alloc - prior to any commands being sent to a new device 
   slave_configure - driver fine tuning for given device after attach
   slave_destroy - given device is about to be shut down


Details:

/**
 *      bios_param - fetch head, sector, cylinder info for a disk
 *      @sdev: pointer to scsi device context (defined in 
 *             include/scsi/scsi_device.h)
 *      @bdev: pointer to block device context (defined in fs.h)
 *      @capacity:  device size (in 512 byte sectors)
 *      @params: three element array to place output:
 *              params[0] number of heads (max 255)
 *              params[1] number of sectors (max 63)
 *              params[2] number of cylinders 
 *
 *      Return value is ignored
 *
 *      Locks: none
 *
 *      Calling context: process (sd)
 *
 *      Notes: an arbitrary geometry (based on READ CAPACITY) is used
 *      if this function is not provided. The params array is
 *      pre-initialized with made up values just in case this function 
 *      doesn't output anything.
 *
 *      Optionally defined in: LLD
 **/
    int bios_param(struct scsi_device * sdev, struct block_device *bdev,
                   sector_t capacity, int params[3])


/**
 *      detect - detects HBAs this driver wants to control
 *      @shtp: host template for this driver.
 *
 *      Returns number of hosts this driver wants to control. 0 means no
 *      suitable hosts found.
 *
 *      Locks: none held
 *
 *      Calling context: process [invoked from init_this_scsi_driver()]
 *
 *      Notes: First function called from the SCSI mid level on this
 *      driver. Upper level drivers (e.g. sd) may not (yet) be present.
 *      For each host found, this method should call scsi_register() 
 *      [see hosts.c].
 *
 *      Defined in: LLD (required if "passive initialization mode" is used,
 *                       not invoked in "hotplug initialization mode")
 **/
    int detect(struct scsi_host_template * shtp)


/**
 *      eh_timed_out - The timer for the command has just fired
 *      @scp: identifies command timing out
 *
 *      Returns:
 *
 *      EH_HANDLED:             I fixed the error, please complete the command
 *      EH_RESET_TIMER:         I need more time, reset the timer and
 *                              begin counting again
 *      EH_NOT_HANDLED          Begin normal error recovery
 *
 *
 *      Locks: None held
 *
 *      Calling context: interrupt
 *
 *      Notes: This is to give the LLD an opportunity to do local recovery.
 *      This recovery is limited to determining if the outstanding command
 *      will ever complete.  You may not abort and restart the command from
 *      this callback.
 *
 *      Optionally defined in: LLD
 **/
     int eh_timed_out(struct scsi_cmnd * scp)


/**
 *      eh_abort_handler - abort command associated with scp
 *      @scp: identifies command to be aborted
 *
 *      Returns SUCCESS if command aborted else FAILED
 *
 *      Locks: None held
 *
 *      Calling context: kernel thread
 *
 *      Notes: Invoked from scsi_eh thread. No other commands will be
 *      queued on current host during eh.
 *
 *      Optionally defined in: LLD
 **/
     int eh_abort_handler(struct scsi_cmnd * scp)


/**
 *      eh_bus_reset_handler - issue SCSI bus reset
 *      @scp: SCSI bus that contains this device should be reset
 *
 *      Returns SUCCESS if command aborted else FAILED
 *
 *      Locks: None held
 *
 *      Calling context: kernel thread
 *
 *      Notes: Invoked from scsi_eh thread. No other commands will be
 *      queued on current host during eh.
 *
 *      Optionally defined in: LLD
 **/
     int eh_bus_reset_handler(struct scsi_cmnd * scp)


/**
 *      eh_device_reset_handler - issue SCSI device reset
 *      @scp: identifies SCSI device to be reset
 *
 *      Returns SUCCESS if command aborted else FAILED
 *
 *      Locks: None held
 *
 *      Calling context: kernel thread
 *
 *      Notes: Invoked from scsi_eh thread. No other commands will be
 *      queued on current host during eh.
 *
 *      Optionally defined in: LLD
 **/
     int eh_device_reset_handler(struct scsi_cmnd * scp)


/**
 *      eh_host_reset_handler - reset host (host bus adapter)
 *      @scp: SCSI host that contains this device should be reset
 *
 *      Returns SUCCESS if command aborted else FAILED
 *
 *      Locks: None held
 *
 *      Calling context: kernel thread
 *
 *      Notes: Invoked from scsi_eh thread. No other commands will be
 *      queued on current host during eh. 
 *      With the default eh_strategy in place, if none of the _abort_, 
 *      _device_reset_, _bus_reset_ or this eh handler function are 
 *      defined (or they all return FAILED) then the device in question 
 *      will be set offline whenever eh is invoked.
 *
 *      Optionally defined in: LLD
 **/
     int eh_host_reset_handler(struct scsi_cmnd * scp)


/**
 *      info - supply information about given host: driver name plus data
 *             to distinguish given host
 *      @shp: host to supply information about
 *
 *      Return ASCII null terminated string. [This driver is assumed to
 *      manage the memory pointed to and maintain it, typically for the
 *      lifetime of this host.]
 *
 *      Locks: none
 *
 *      Calling context: process
 *
 *      Notes: Often supplies PCI or ISA information such as IO addresses
 *      and interrupt numbers. If not supplied struct Scsi_Host::name used
 *      instead. It is assumed the returned information fits on one line 
 *      (i.e. does not included embedded newlines).
 *      The SCSI_IOCTL_PROBE_HOST ioctl yields the string returned by this
 *      function (or struct Scsi_Host::name if this function is not
 *      available).
 *      In a similar manner, init_this_scsi_driver() outputs to the console
 *      each host's "info" (or name) for the driver it is registering.
 *      Also if proc_info() is not supplied, the output of this function
 *      is used instead.
 *
 *      Optionally defined in: LLD
 **/
    const char * info(struct Scsi_Host * shp)


/**
 *      ioctl - driver can respond to ioctls
 *      @sdp: device that ioctl was issued for
 *      @cmd: ioctl number
 *      @arg: pointer to read or write data from. Since it points to
 *            user space, should use appropriate kernel functions
 *            (e.g. copy_from_user() ). In the Unix style this argument
 *            can also be viewed as an unsigned long.
 *
 *      Returns negative "errno" value when there is a problem. 0 or a
 *      positive value indicates success and is returned to the user space.
 *
 *      Locks: none
 *
 *      Calling context: process
 *
 *      Notes: The SCSI subsystem uses a "trickle down" ioctl model.
 *      The user issues an ioctl() against an upper level driver
 *      (e.g. /dev/sdc) and if the upper level driver doesn't recognize
 *      the 'cmd' then it is passed to the SCSI mid level. If the SCSI
 *      mid level does not recognize it, then the LLD that controls
 *      the device receives the ioctl. According to recent Unix standards
 *      unsupported ioctl() 'cmd' numbers should return -ENOTTY.
 *
 *      Optionally defined in: LLD
 **/
    int ioctl(struct scsi_device *sdp, int cmd, void *arg)


/**
 *      proc_info - supports /proc/scsi/{driver_name}/{host_no}
 *      @buffer: anchor point to output to (0==writeto1_read0) or fetch from
 *               (1==writeto1_read0).
 *      @start: where "interesting" data is written to. Ignored when
 *              1==writeto1_read0.
 *      @offset: offset within buffer 0==writeto1_read0 is actually
 *               interested in. Ignored when 1==writeto1_read0 .
 *      @length: maximum (or actual) extent of buffer
 *      @host_no: host number of interest (struct Scsi_Host::host_no)
 *      @writeto1_read0: 1 -> data coming from user space towards driver
 *                            (e.g. "echo some_string > /proc/scsi/xyz/2")
 *                       0 -> user what data from this driver
 *                            (e.g. "cat /proc/scsi/xyz/2")
 *
 *      Returns length when 1==writeto1_read0. Otherwise number of chars
 *      output to buffer past offset.
 *
 *      Locks: none held
 *
 *      Calling context: process
 *
 *      Notes: Driven from scsi_proc.c which interfaces to proc_fs. proc_fs
 *      support can now be configured out of the scsi subsystem.
 *
 *      Optionally defined in: LLD
 **/
    int proc_info(char * buffer, char ** start, off_t offset, 
                  int length, int host_no, int writeto1_read0)


/**
 *      queuecommand - queue scsi command, invoke scp->scsi_done on completion
 *      @shost: pointer to the scsi host object
 *      @scp: pointer to scsi command object
 *
 *      Returns 0 on success.
 *
 *      If there's a failure, return either:
 *
 *      SCSI_MLQUEUE_DEVICE_BUSY if the device queue is full, or
 *      SCSI_MLQUEUE_HOST_BUSY if the entire host queue is full
 *
 *      On both of these returns, the mid-layer will requeue the I/O
 *
 *      - if the return is SCSI_MLQUEUE_DEVICE_BUSY, only that particular
 *      device will be paused, and it will be unpaused when a command to
 *      the device returns (or after a brief delay if there are no more
 *      outstanding commands to it).  Commands to other devices continue
 *      to be processed normally.
 *
 *      - if the return is SCSI_MLQUEUE_HOST_BUSY, all I/O to the host
 *      is paused and will be unpaused when any command returns from
 *      the host (or after a brief delay if there are no outstanding
 *      commands to the host).
 *
 *      For compatibility with earlier versions of queuecommand, any
 *      other return value is treated the same as
 *      SCSI_MLQUEUE_HOST_BUSY.
 *
 *      Other types of errors that are detected immediately may be
 *      flagged by setting scp->result to an appropriate value,
 *      invoking the scp->scsi_done callback, and then returning 0
 *      from this function. If the command is not performed
 *      immediately (and the LLD is starting (or will start) the given
 *      command) then this function should place 0 in scp->result and
 *      return 0.
 *
 *      Command ownership.  If the driver returns zero, it owns the
 *      command and must take responsibility for ensuring the
 *      scp->scsi_done callback is executed.  Note: the driver may
 *      call scp->scsi_done before returning zero, but after it has
 *      called scp->scsi_done, it may not return any value other than
 *      zero.  If the driver makes a non-zero return, it must not
 *      execute the command's scsi_done callback at any time.
 *
 *      Locks: up to and including 2.6.36, struct Scsi_Host::host_lock
 *             held on entry (with "irqsave") and is expected to be
 *             held on return. From 2.6.37 onwards, queuecommand is
 *             called without any locks held.
 *
 *      Calling context: in interrupt (soft irq) or process context
 *
 *      Notes: This function should be relatively fast. Normally it
 *      will not wait for IO to complete. Hence the scp->scsi_done
 *      callback is invoked (often directly from an interrupt service
 *      routine) some time after this function has returned. In some
 *      cases (e.g. pseudo adapter drivers that manufacture the
 *      response to a SCSI INQUIRY) the scp->scsi_done callback may be
 *      invoked before this function returns.  If the scp->scsi_done
 *      callback is not invoked within a certain period the SCSI mid
 *      level will commence error processing.  If a status of CHECK
 *      CONDITION is placed in "result" when the scp->scsi_done
 *      callback is invoked, then the LLD driver should perform
 *      autosense and fill in the struct scsi_cmnd::sense_buffer
 *      array. The scsi_cmnd::sense_buffer array is zeroed prior to
 *      the mid level queuing a command to an LLD.
 *
 *      Defined in: LLD
 **/
    int queuecommand(struct Scsi_Host *shost, struct scsi_cmnd * scp)


/**
 *      release - release all resources associated with given host
 *      @shp: host to be released.
 *
 *      Return value ignored (could soon be a function returning void).
 *
 *      Locks: none held
 *
 *      Calling context: process
 *
 *      Notes: Invoked from scsi_module.c's exit_this_scsi_driver().
 *      LLD's implementation of this function should call 
 *      scsi_unregister(shp) prior to returning.
 *      Only needed for old-style host templates.
 *
 *      Defined in: LLD (required in "passive initialization model",
 *                       should not be defined in hotplug model)
 **/
    int release(struct Scsi_Host * shp)


/**
 *      slave_alloc -   prior to any commands being sent to a new device 
 *                      (i.e. just prior to scan) this call is made
 *      @sdp: pointer to new device (about to be scanned)
 *
 *      Returns 0 if ok. Any other return is assumed to be an error and
 *      the device is ignored.
 *
 *      Locks: none
 *
 *      Calling context: process
 *
 *      Notes: Allows the driver to allocate any resources for a device
 *      prior to its initial scan. The corresponding scsi device may not
 *      exist but the mid level is just about to scan for it (i.e. send
 *      and INQUIRY command plus ...). If a device is found then
 *      slave_configure() will be called while if a device is not found
 *      slave_destroy() is called.
 *      For more details see the include/scsi/scsi_host.h file.
 *
 *      Optionally defined in: LLD
 **/
    int slave_alloc(struct scsi_device *sdp)


/**
 *      slave_configure - driver fine tuning for given device just after it
 *                     has been first scanned (i.e. it responded to an
 *                     INQUIRY)
 *      @sdp: device that has just been attached
 *
 *      Returns 0 if ok. Any other return is assumed to be an error and
 *      the device is taken offline. [offline devices will _not_ have
 *      slave_destroy() called on them so clean up resources.]
 *
 *      Locks: none
 *
 *      Calling context: process
 *
 *      Notes: Allows the driver to inspect the response to the initial
 *      INQUIRY done by the scanning code and take appropriate action.
 *      For more details see the include/scsi/scsi_host.h file.
 *
 *      Optionally defined in: LLD
 **/
    int slave_configure(struct scsi_device *sdp)


/**
 *      slave_destroy - given device is about to be shut down. All
 *                      activity has ceased on this device.
 *      @sdp: device that is about to be shut down
 *
 *      Returns nothing
 *
 *      Locks: none
 *
 *      Calling context: process
 *
 *      Notes: Mid level structures for given device are still in place
 *      but are about to be torn down. Any per device resources allocated
 *      by this driver for given device should be freed now. No further
 *      commands will be sent for this sdp instance. [However the device
 *      could be re-attached in the future in which case a new instance
 *      of struct scsi_device would be supplied by future slave_alloc()
 *      and slave_configure() calls.]
 *
 *      Optionally defined in: LLD
 **/
    void slave_destroy(struct scsi_device *sdp)



Data Structures
===============
struct scsi_host_template
-------------------------
There is one "struct scsi_host_template" instance per LLD ***. It is
typically initialized as a file scope static in a driver's header file. That
way members that are not explicitly initialized will be set to 0 or NULL.
Member of interest:
    name         - name of driver (may contain spaces, please limit to
                   less than 80 characters)
    proc_name    - name used in "/proc/scsi/<proc_name>/<host_no>" and
                   by sysfs in one of its "drivers" directories. Hence
                   "proc_name" should only contain characters acceptable
                   to a Unix file name.
   (*queuecommand)() - primary callback that the mid level uses to inject
                   SCSI commands into an LLD.
The structure is defined and commented in include/scsi/scsi_host.h

*** In extreme situations a single driver may have several instances
    if it controls several different classes of hardware (e.g. an LLD
    that handles both ISA and PCI cards and has a separate instance of
    struct scsi_host_template for each class).

struct Scsi_Host
----------------
There is one struct Scsi_Host instance per host (HBA) that an LLD
controls. The struct Scsi_Host structure has many members in common
with "struct scsi_host_template". When a new struct Scsi_Host instance
is created (in scsi_host_alloc() in hosts.c) those common members are
initialized from the driver's struct scsi_host_template instance. Members
of interest:
    host_no      - system wide unique number that is used for identifying
                   this host. Issued in ascending order from 0.
    can_queue    - must be greater than 0; do not send more than can_queue
                   commands to the adapter.
    this_id      - scsi id of host (scsi initiator) or -1 if not known
    sg_tablesize - maximum scatter gather elements allowed by host.
                   0 implies scatter gather not supported by host
    max_sectors  - maximum number of sectors (usually 512 bytes) allowed
                   in a single SCSI command. The default value of 0 leads
                   to a setting of SCSI_DEFAULT_MAX_SECTORS (defined in
                   scsi_host.h) which is currently set to 1024. So for a
                   disk the maximum transfer size is 512 KB when max_sectors
                   is not defined. Note that this size may not be sufficient
                   for disk firmware uploads.
    cmd_per_lun  - maximum number of commands that can be queued on devices
                   controlled by the host. Overridden by LLD calls to
                   scsi_adjust_queue_depth().
    unchecked_isa_dma - 1=>only use bottom 16 MB of ram (ISA DMA addressing
                   restriction), 0=>can use full 32 bit (or better) DMA
                   address space
    use_clustering - 1=>SCSI commands in mid level's queue can be merged,
                     0=>disallow SCSI command merging
    hostt        - pointer to driver's struct scsi_host_template from which
                   this struct Scsi_Host instance was spawned
    hostt->proc_name  - name of LLD. This is the driver name that sysfs uses
    transportt   - pointer to driver's struct scsi_transport_template instance
                   (if any). FC and SPI transports currently supported.
    sh_list      - a double linked list of pointers to all struct Scsi_Host
                   instances (currently ordered by ascending host_no)
    my_devices   - a double linked list of pointers to struct scsi_device 
                   instances that belong to this host.
    hostdata[0]  - area reserved for LLD at end of struct Scsi_Host. Size
                   is set by the second argument (named 'xtr_bytes') to
                   scsi_host_alloc() or scsi_register().
    vendor_id    - a unique value that identifies the vendor supplying
                   the LLD for the Scsi_Host.  Used most often in validating
                   vendor-specific message requests.  Value consists of an
                   identifier type and a vendor-specific value.
                   See scsi_netlink.h for a description of valid formats.

The scsi_host structure is defined in include/scsi/scsi_host.h

struct scsi_device
------------------
Generally, there is one instance of this structure for each SCSI logical unit
on a host. Scsi devices connected to a host are uniquely identified by a
channel number, target id and logical unit number (lun).
The structure is defined in include/scsi/scsi_device.h

struct scsi_cmnd
----------------
Instances of this structure convey SCSI commands to the LLD and responses
back to the mid level. The SCSI mid level will ensure that no more SCSI
commands become queued against the LLD than are indicated by
scsi_adjust_queue_depth() (or struct Scsi_Host::cmd_per_lun). There will
be at least one instance of struct scsi_cmnd available for each SCSI device.
Members of interest:
    cmnd         - array containing SCSI command
    cmnd_len     - length (in bytes) of SCSI command
    sc_data_direction - direction of data transfer in data phase. See
                "enum dma_data_direction" in include/linux/dma-mapping.h
    request_bufflen - number of data bytes to transfer (0 if no data phase)
    use_sg       - ==0 -> no scatter gather list, hence transfer data
                          to/from request_buffer
                 - >0 ->  scatter gather list (actually an array) in
                          request_buffer with use_sg elements
    request_buffer - either contains data buffer or scatter gather list
                     depending on the setting of use_sg. Scatter gather
                     elements are defined by 'struct scatterlist' found
                     in include/asm/scatterlist.h .
    done         - function pointer that should be invoked by LLD when the
                   SCSI command is completed (successfully or otherwise).
                   Should only be called by an LLD if the LLD has accepted
                   the command (i.e. queuecommand() returned or will return
                   0). The LLD may invoke 'done'  prior to queuecommand()
                   finishing.
    result       - should be set by LLD prior to calling 'done'. A value
                   of 0 implies a successfully completed command (and all
                   data (if any) has been transferred to or from the SCSI
                   target device). 'result' is a 32 bit unsigned integer that
                   can be viewed as 4 related bytes. The SCSI status value is
                   in the LSB. See include/scsi/scsi.h status_byte(),
                   msg_byte(), host_byte() and driver_byte() macros and
                   related constants.
    sense_buffer - an array (maximum size: SCSI_SENSE_BUFFERSIZE bytes) that
                   should be written when the SCSI status (LSB of 'result')
                   is set to CHECK_CONDITION (2). When CHECK_CONDITION is
                   set, if the top nibble of sense_buffer[0] has the value 7
                   then the mid level will assume the sense_buffer array
                   contains a valid SCSI sense buffer; otherwise the mid
                   level will issue a REQUEST_SENSE SCSI command to
                   retrieve the sense buffer. The latter strategy is error
                   prone in the presence of command queuing so the LLD should
                   always "auto-sense".
    device       - pointer to scsi_device object that this command is
                   associated with.
    resid        - an LLD should set this signed integer to the requested
                   transfer length (i.e. 'request_bufflen') less the number
                   of bytes that are actually transferred. 'resid' is
                   preset to 0 so an LLD can ignore it if it cannot detect
                   underruns (overruns should be rare). If possible an LLD
                   should set 'resid' prior to invoking 'done'. The most
                   interesting case is data transfers from a SCSI target
                   device (e.g. READs) that underrun.
    underflow    - LLD should place (DID_ERROR << 16) in 'result' if
                   actual number of bytes transferred is less than this
                   figure. Not many LLDs implement this check and some that
                   do just output an error message to the log rather than
                   report a DID_ERROR. Better for an LLD to implement
                   'resid'.

It is recommended that a LLD set 'resid' on data transfers from a SCSI
target device (e.g. READs). It is especially important that 'resid' is set
when such data transfers have sense keys of MEDIUM ERROR and HARDWARE ERROR
(and possibly RECOVERED ERROR). In these cases if a LLD is in doubt how much
data has been received then the safest approach is to indicate no bytes have
been received. For example: to indicate that no valid data has been received
a LLD might use these helpers:
    scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
where 'SCpnt' is a pointer to a scsi_cmnd object. To indicate only three 512
bytes blocks has been received 'resid' could be set like this:
    scsi_set_resid(SCpnt, scsi_bufflen(SCpnt) - (3 * 512));

The scsi_cmnd structure is defined in include/scsi/scsi_cmnd.h


Locks
=====
Each struct Scsi_Host instance has a spin_lock called struct 
Scsi_Host::default_lock which is initialized in scsi_host_alloc() [found in 
hosts.c]. Within the same function the struct Scsi_Host::host_lock pointer
is initialized to point at default_lock.  Thereafter lock and unlock
operations performed by the mid level use the struct Scsi_Host::host_lock
pointer.  Previously drivers could override the host_lock pointer but
this is not allowed anymore.


Autosense
=========
Autosense (or auto-sense) is defined in the SAM-2 document as "the
automatic return of sense data to the application client coincident
with the completion of a SCSI command" when a status of CHECK CONDITION
occurs. LLDs should perform autosense. This should be done when the LLD
detects a CHECK CONDITION status by either: 
    a) instructing the SCSI protocol (e.g. SCSI Parallel Interface (SPI))
       to perform an extra data in phase on such responses
    b) or, the LLD issuing a REQUEST SENSE command itself

Either way, when a status of CHECK CONDITION is detected, the mid level
decides whether the LLD has performed autosense by checking struct 
scsi_cmnd::sense_buffer[0] . If this byte has an upper nibble of 7 (or 0xf)
then autosense is assumed to have taken place. If it has another value (and
this byte is initialized to 0 before each command) then the mid level will
issue a REQUEST SENSE command.

In the presence of queued commands the "nexus" that maintains sense
buffer data from the command that failed until a following REQUEST SENSE
may get out of synchronization. This is why it is best for the LLD
to perform autosense.


Changes since lk 2.4 series
===========================
io_request_lock has been replaced by several finer grained locks. The lock 
relevant to LLDs is struct Scsi_Host::host_lock and there is
one per SCSI host.

The older error handling mechanism has been removed. This means the
LLD interface functions abort() and reset() have been removed.
The struct scsi_host_template::use_new_eh_code flag has been removed.

In the 2.4 series the SCSI subsystem configuration descriptions were 
aggregated with the configuration descriptions from all other Linux 
subsystems in the Documentation/Configure.help file. In the 2.6 series, 
the SCSI subsystem now has its own (much smaller) drivers/scsi/Kconfig
file that contains both configuration and help information.

struct SHT has been renamed to struct scsi_host_template.

Addition of the "hotplug initialization model" and many extra functions
to support it.


Credits
=======
The following people have contributed to this document:
        Mike Anderson <andmike at us dot ibm dot com>
        James Bottomley <James dot Bottomley at hansenpartnership dot com>
        Patrick Mansfield <patmans at us dot ibm dot com> 
        Christoph Hellwig <hch at infradead dot org>
        Doug Ledford <dledford at redhat dot com>
        Andries Brouwer <Andries dot Brouwer at cwi dot nl>
        Randy Dunlap <rdunlap at xenotime dot net>
        Alan Stern <stern at rowland dot harvard dot edu>


Douglas Gilbert
dgilbert at interlog dot com
21st September 2004
