1ce5c5d65SMauro Carvalho Chehab.. SPDX-License-Identifier: GPL-2.0
2ce5c5d65SMauro Carvalho Chehab
3ce5c5d65SMauro Carvalho Chehab=============================================
4ce5c5d65SMauro Carvalho ChehabSCSI mid_level - lower_level driver interface
5ce5c5d65SMauro Carvalho Chehab=============================================
6ce5c5d65SMauro Carvalho Chehab
7ce5c5d65SMauro Carvalho ChehabIntroduction
8ce5c5d65SMauro Carvalho Chehab============
9ce5c5d65SMauro Carvalho ChehabThis document outlines the interface between the Linux SCSI mid level and
10ce5c5d65SMauro Carvalho ChehabSCSI lower level drivers. Lower level drivers (LLDs) are variously called
11ce5c5d65SMauro Carvalho Chehabhost bus adapter (HBA) drivers and host drivers (HD). A "host" in this
12ce5c5d65SMauro Carvalho Chehabcontext is a bridge between a computer IO bus (e.g. PCI or ISA) and a
13ce5c5d65SMauro Carvalho Chehabsingle SCSI initiator port on a SCSI transport. An "initiator" port
14ce5c5d65SMauro Carvalho Chehab(SCSI terminology, see SAM-3 at http://www.t10.org) sends SCSI commands
15ce5c5d65SMauro Carvalho Chehabto "target" SCSI ports (e.g. disks). There can be many LLDs in a running
16ce5c5d65SMauro Carvalho Chehabsystem, but only one per hardware type. Most LLDs can control one or more
17ce5c5d65SMauro Carvalho ChehabSCSI HBAs. Some HBAs contain multiple hosts.
18ce5c5d65SMauro Carvalho Chehab
19ce5c5d65SMauro Carvalho ChehabIn some cases the SCSI transport is an external bus that already has
20ce5c5d65SMauro Carvalho Chehabits own subsystem in Linux (e.g. USB and ieee1394). In such cases the
21ce5c5d65SMauro Carvalho ChehabSCSI subsystem LLD is a software bridge to the other driver subsystem.
22ce5c5d65SMauro Carvalho ChehabExamples are the usb-storage driver (found in the drivers/usb/storage
23ce5c5d65SMauro Carvalho Chehabdirectory) and the ieee1394/sbp2 driver (found in the drivers/ieee1394
24ce5c5d65SMauro Carvalho Chehabdirectory).
25ce5c5d65SMauro Carvalho Chehab
26ce5c5d65SMauro Carvalho ChehabFor example, the aic7xxx LLD controls Adaptec SCSI parallel interface
27ce5c5d65SMauro Carvalho Chehab(SPI) controllers based on that company's 7xxx chip series. The aic7xxx
28ce5c5d65SMauro Carvalho ChehabLLD can be built into the kernel or loaded as a module. There can only be
29ce5c5d65SMauro Carvalho Chehabone aic7xxx LLD running in a Linux system but it may be controlling many
30ce5c5d65SMauro Carvalho ChehabHBAs. These HBAs might be either on PCI daughter-boards or built into
31ce5c5d65SMauro Carvalho Chehabthe motherboard (or both). Some aic7xxx based HBAs are dual controllers
32ce5c5d65SMauro Carvalho Chehaband thus represent two hosts. Like most modern HBAs, each aic7xxx host
33ce5c5d65SMauro Carvalho Chehabhas its own PCI device address. [The one-to-one correspondence between
34ce5c5d65SMauro Carvalho Chehaba SCSI host and a PCI device is common but not required (e.g. with
35ce5c5d65SMauro Carvalho ChehabISA adapters).]
36ce5c5d65SMauro Carvalho Chehab
37ce5c5d65SMauro Carvalho ChehabThe SCSI mid level isolates an LLD from other layers such as the SCSI
38ce5c5d65SMauro Carvalho Chehabupper layer drivers and the block layer.
39ce5c5d65SMauro Carvalho Chehab
40ce5c5d65SMauro Carvalho ChehabThis version of the document roughly matches linux kernel version 2.6.8 .
41ce5c5d65SMauro Carvalho Chehab
42ce5c5d65SMauro Carvalho ChehabDocumentation
43ce5c5d65SMauro Carvalho Chehab=============
44ce5c5d65SMauro Carvalho ChehabThere is a SCSI documentation directory within the kernel source tree,
45ce5c5d65SMauro Carvalho Chehabtypically Documentation/scsi . Most documents are in plain
46ce5c5d65SMauro Carvalho Chehab(i.e. ASCII) text. This file is named scsi_mid_low_api.txt and can be
47ce5c5d65SMauro Carvalho Chehabfound in that directory. A more recent copy of this document may be found
48ce5c5d65SMauro Carvalho Chehabat http://web.archive.org/web/20070107183357rn_1/sg.torque.net/scsi/.
49ce5c5d65SMauro Carvalho ChehabMany LLDs are documented there (e.g. aic7xxx.txt). The SCSI mid-level is
50ce5c5d65SMauro Carvalho Chehabbriefly described in scsi.txt which contains a url to a document
51ce5c5d65SMauro Carvalho Chehabdescribing the SCSI subsystem in the lk 2.4 series. Two upper level
52ce5c5d65SMauro Carvalho Chehabdrivers have documents in that directory: st.txt (SCSI tape driver) and
53ce5c5d65SMauro Carvalho Chehabscsi-generic.txt (for the sg driver).
54ce5c5d65SMauro Carvalho Chehab
55ce5c5d65SMauro Carvalho ChehabSome documentation (or urls) for LLDs may be found in the C source code
56ce5c5d65SMauro Carvalho Chehabor in the same directory as the C source code. For example to find a url
57ce5c5d65SMauro Carvalho Chehababout the USB mass storage driver see the
58ce5c5d65SMauro Carvalho Chehab/usr/src/linux/drivers/usb/storage directory.
59ce5c5d65SMauro Carvalho Chehab
60ce5c5d65SMauro Carvalho ChehabDriver structure
61ce5c5d65SMauro Carvalho Chehab================
62ce5c5d65SMauro Carvalho ChehabTraditionally an LLD for the SCSI subsystem has been at least two files in
63ce5c5d65SMauro Carvalho Chehabthe drivers/scsi directory. For example, a driver called "xyz" has a header
64ce5c5d65SMauro Carvalho Chehabfile "xyz.h" and a source file "xyz.c". [Actually there is no good reason
65ce5c5d65SMauro Carvalho Chehabwhy this couldn't all be in one file; the header file is superfluous.] Some
66ce5c5d65SMauro Carvalho Chehabdrivers that have been ported to several operating systems have more than
67ce5c5d65SMauro Carvalho Chehabtwo files. For example the aic7xxx driver has separate files for generic
68ce5c5d65SMauro Carvalho Chehaband OS-specific code (e.g. FreeBSD and Linux). Such drivers tend to have
69ce5c5d65SMauro Carvalho Chehabtheir own directory under the drivers/scsi directory.
70ce5c5d65SMauro Carvalho Chehab
71ce5c5d65SMauro Carvalho ChehabWhen a new LLD is being added to Linux, the following files (found in the
72ce5c5d65SMauro Carvalho Chehabdrivers/scsi directory) will need some attention: Makefile and Kconfig .
73ce5c5d65SMauro Carvalho ChehabIt is probably best to study how existing LLDs are organized.
74ce5c5d65SMauro Carvalho Chehab
75ce5c5d65SMauro Carvalho ChehabAs the 2.5 series development kernels evolve into the 2.6 series
76ce5c5d65SMauro Carvalho Chehabproduction series, changes are being introduced into this interface. An
77ce5c5d65SMauro Carvalho Chehabexample of this is driver initialization code where there are now 2 models
78ce5c5d65SMauro Carvalho Chehabavailable. The older one, similar to what was found in the lk 2.4 series,
79ce5c5d65SMauro Carvalho Chehabis based on hosts that are detected at HBA driver load time. This will be
80ce5c5d65SMauro Carvalho Chehabreferred to the "passive" initialization model. The newer model allows HBAs
81ce5c5d65SMauro Carvalho Chehabto be hot plugged (and unplugged) during the lifetime of the LLD and will
82ce5c5d65SMauro Carvalho Chehabbe referred to as the "hotplug" initialization model. The newer model is
83ce5c5d65SMauro Carvalho Chehabpreferred as it can handle both traditional SCSI equipment that is
84ce5c5d65SMauro Carvalho Chehabpermanently connected as well as modern "SCSI" devices (e.g. USB or
85ce5c5d65SMauro Carvalho ChehabIEEE 1394 connected digital cameras) that are hotplugged. Both
86ce5c5d65SMauro Carvalho Chehabinitialization models are discussed in the following sections.
87ce5c5d65SMauro Carvalho Chehab
88ce5c5d65SMauro Carvalho ChehabAn LLD interfaces to the SCSI subsystem several ways:
89ce5c5d65SMauro Carvalho Chehab
90ce5c5d65SMauro Carvalho Chehab  a) directly invoking functions supplied by the mid level
91ce5c5d65SMauro Carvalho Chehab  b) passing a set of function pointers to a registration function
92ce5c5d65SMauro Carvalho Chehab     supplied by the mid level. The mid level will then invoke these
93ce5c5d65SMauro Carvalho Chehab     functions at some point in the future. The LLD will supply
94ce5c5d65SMauro Carvalho Chehab     implementations of these functions.
95ce5c5d65SMauro Carvalho Chehab  c) direct access to instances of well known data structures maintained
96ce5c5d65SMauro Carvalho Chehab     by the mid level
97ce5c5d65SMauro Carvalho Chehab
98ce5c5d65SMauro Carvalho ChehabThose functions in group a) are listed in a section entitled "Mid level
99ce5c5d65SMauro Carvalho Chehabsupplied functions" below.
100ce5c5d65SMauro Carvalho Chehab
101ce5c5d65SMauro Carvalho ChehabThose functions in group b) are listed in a section entitled "Interface
102ce5c5d65SMauro Carvalho Chehabfunctions" below. Their function pointers are placed in the members of
103ce5c5d65SMauro Carvalho Chehab"struct scsi_host_template", an instance of which is passed to
104ce5c5d65SMauro Carvalho Chehabscsi_host_alloc() [#]_.  Those interface functions that the LLD does not
105ce5c5d65SMauro Carvalho Chehabwish to supply should have NULL placed in the corresponding member of
106ce5c5d65SMauro Carvalho Chehabstruct scsi_host_template.  Defining an instance of struct
107ce5c5d65SMauro Carvalho Chehabscsi_host_template at file scope will cause NULL to be  placed in function
108ce5c5d65SMauro Carvalho Chehabpointer members not explicitly initialized.
109ce5c5d65SMauro Carvalho Chehab
110ce5c5d65SMauro Carvalho ChehabThose usages in group c) should be handled with care, especially in a
111ce5c5d65SMauro Carvalho Chehab"hotplug" environment. LLDs should be aware of the lifetime of instances
112ce5c5d65SMauro Carvalho Chehabthat are shared with the mid level and other layers.
113ce5c5d65SMauro Carvalho Chehab
114ce5c5d65SMauro Carvalho ChehabAll functions defined within an LLD and all data defined at file scope
115ce5c5d65SMauro Carvalho Chehabshould be static. For example the slave_alloc() function in an LLD
116ce5c5d65SMauro Carvalho Chehabcalled "xxx" could be defined as
117ce5c5d65SMauro Carvalho Chehab``static int xxx_slave_alloc(struct scsi_device * sdev) { /* code */ }``
118ce5c5d65SMauro Carvalho Chehab
119ce5c5d65SMauro Carvalho Chehab.. [#] the scsi_host_alloc() function is a replacement for the rather vaguely
120ce5c5d65SMauro Carvalho Chehab       named scsi_register() function in most situations.
121ce5c5d65SMauro Carvalho Chehab
122ce5c5d65SMauro Carvalho Chehab
123ce5c5d65SMauro Carvalho ChehabHotplug initialization model
124ce5c5d65SMauro Carvalho Chehab============================
125ce5c5d65SMauro Carvalho ChehabIn this model an LLD controls when SCSI hosts are introduced and removed
126ce5c5d65SMauro Carvalho Chehabfrom the SCSI subsystem. Hosts can be introduced as early as driver
127ce5c5d65SMauro Carvalho Chehabinitialization and removed as late as driver shutdown. Typically a driver
128ce5c5d65SMauro Carvalho Chehabwill respond to a sysfs probe() callback that indicates an HBA has been
129ce5c5d65SMauro Carvalho Chehabdetected. After confirming that the new device is one that the LLD wants
130ce5c5d65SMauro Carvalho Chehabto control, the LLD will initialize the HBA and then register a new host
131ce5c5d65SMauro Carvalho Chehabwith the SCSI mid level.
132ce5c5d65SMauro Carvalho Chehab
133ce5c5d65SMauro Carvalho ChehabDuring LLD initialization the driver should register itself with the
134ce5c5d65SMauro Carvalho Chehabappropriate IO bus on which it expects to find HBA(s) (e.g. the PCI bus).
135ce5c5d65SMauro Carvalho ChehabThis can probably be done via sysfs. Any driver parameters (especially
136ce5c5d65SMauro Carvalho Chehabthose that are writable after the driver is loaded) could also be
137ce5c5d65SMauro Carvalho Chehabregistered with sysfs at this point. The SCSI mid level first becomes
138ce5c5d65SMauro Carvalho Chehabaware of an LLD when that LLD registers its first HBA.
139ce5c5d65SMauro Carvalho Chehab
140ce5c5d65SMauro Carvalho ChehabAt some later time, the LLD becomes aware of an HBA and what follows
141ce5c5d65SMauro Carvalho Chehabis a typical sequence of calls between the LLD and the mid level.
142ce5c5d65SMauro Carvalho ChehabThis example shows the mid level scanning the newly introduced HBA for 3
143ce5c5d65SMauro Carvalho Chehabscsi devices of which only the first 2 respond::
144ce5c5d65SMauro Carvalho Chehab
145ce5c5d65SMauro Carvalho Chehab	HBA PROBE: assume 2 SCSI devices found in scan
146ce5c5d65SMauro Carvalho Chehab    LLD                   mid level                    LLD
147ce5c5d65SMauro Carvalho Chehab    ===-------------------=========--------------------===------
148ce5c5d65SMauro Carvalho Chehab    scsi_host_alloc()  -->
149ce5c5d65SMauro Carvalho Chehab    scsi_add_host()  ---->
150ce5c5d65SMauro Carvalho Chehab    scsi_scan_host()  -------+
151ce5c5d65SMauro Carvalho Chehab			    |
152ce5c5d65SMauro Carvalho Chehab			slave_alloc()
153ce5c5d65SMauro Carvalho Chehab			slave_configure() -->  scsi_change_queue_depth()
154ce5c5d65SMauro Carvalho Chehab			    |
155ce5c5d65SMauro Carvalho Chehab			slave_alloc()
156ce5c5d65SMauro Carvalho Chehab			slave_configure()
157ce5c5d65SMauro Carvalho Chehab			    |
158ce5c5d65SMauro Carvalho Chehab			slave_alloc()   ***
159ce5c5d65SMauro Carvalho Chehab			slave_destroy() ***
160ce5c5d65SMauro Carvalho Chehab
161ce5c5d65SMauro Carvalho Chehab
162ce5c5d65SMauro Carvalho Chehab    *** For scsi devices that the mid level tries to scan but do not
163ce5c5d65SMauro Carvalho Chehab	respond, a slave_alloc(), slave_destroy() pair is called.
164ce5c5d65SMauro Carvalho Chehab
165ce5c5d65SMauro Carvalho ChehabIf the LLD wants to adjust the default queue settings, it can invoke
166ce5c5d65SMauro Carvalho Chehabscsi_change_queue_depth() in its slave_configure() routine.
167ce5c5d65SMauro Carvalho Chehab
168ce5c5d65SMauro Carvalho ChehabWhen an HBA is being removed it could be as part of an orderly shutdown
169ce5c5d65SMauro Carvalho Chehabassociated with the LLD module being unloaded (e.g. with the "rmmod"
170ce5c5d65SMauro Carvalho Chehabcommand) or in response to a "hot unplug" indicated by sysfs()'s
171ce5c5d65SMauro Carvalho Chehabremove() callback being invoked. In either case, the sequence is the
172ce5c5d65SMauro Carvalho Chehabsame::
173ce5c5d65SMauro Carvalho Chehab
174ce5c5d65SMauro Carvalho Chehab	    HBA REMOVE: assume 2 SCSI devices attached
175ce5c5d65SMauro Carvalho Chehab    LLD                      mid level                 LLD
176ce5c5d65SMauro Carvalho Chehab    ===----------------------=========-----------------===------
177ce5c5d65SMauro Carvalho Chehab    scsi_remove_host() ---------+
178ce5c5d65SMauro Carvalho Chehab				|
179ce5c5d65SMauro Carvalho Chehab			slave_destroy()
180ce5c5d65SMauro Carvalho Chehab			slave_destroy()
181ce5c5d65SMauro Carvalho Chehab    scsi_host_put()
182ce5c5d65SMauro Carvalho Chehab
183ce5c5d65SMauro Carvalho ChehabIt may be useful for a LLD to keep track of struct Scsi_Host instances
184ce5c5d65SMauro Carvalho Chehab(a pointer is returned by scsi_host_alloc()). Such instances are "owned"
185ce5c5d65SMauro Carvalho Chehabby the mid-level.  struct Scsi_Host instances are freed from
186ce5c5d65SMauro Carvalho Chehabscsi_host_put() when the reference count hits zero.
187ce5c5d65SMauro Carvalho Chehab
188ce5c5d65SMauro Carvalho ChehabHot unplugging an HBA that controls a disk which is processing SCSI
189ce5c5d65SMauro Carvalho Chehabcommands on a mounted file system is an interesting situation. Reference
190ce5c5d65SMauro Carvalho Chehabcounting logic is being introduced into the mid level to cope with many
191ce5c5d65SMauro Carvalho Chehabof the issues involved. See the section on reference counting below.
192ce5c5d65SMauro Carvalho Chehab
193ce5c5d65SMauro Carvalho Chehab
194ce5c5d65SMauro Carvalho ChehabThe hotplug concept may be extended to SCSI devices. Currently, when an
195ce5c5d65SMauro Carvalho ChehabHBA is added, the scsi_scan_host() function causes a scan for SCSI devices
196ce5c5d65SMauro Carvalho Chehabattached to the HBA's SCSI transport. On newer SCSI transports the HBA
197ce5c5d65SMauro Carvalho Chehabmay become aware of a new SCSI device _after_ the scan has completed.
198ce5c5d65SMauro Carvalho ChehabAn LLD can use this sequence to make the mid level aware of a SCSI device::
199ce5c5d65SMauro Carvalho Chehab
200ce5c5d65SMauro Carvalho Chehab		    SCSI DEVICE hotplug
201ce5c5d65SMauro Carvalho Chehab    LLD                   mid level                    LLD
202ce5c5d65SMauro Carvalho Chehab    ===-------------------=========--------------------===------
203ce5c5d65SMauro Carvalho Chehab    scsi_add_device()  ------+
204ce5c5d65SMauro Carvalho Chehab			    |
205ce5c5d65SMauro Carvalho Chehab			slave_alloc()
206ce5c5d65SMauro Carvalho Chehab			slave_configure()   [--> scsi_change_queue_depth()]
207ce5c5d65SMauro Carvalho Chehab
208ce5c5d65SMauro Carvalho ChehabIn a similar fashion, an LLD may become aware that a SCSI device has been
209ce5c5d65SMauro Carvalho Chehabremoved (unplugged) or the connection to it has been interrupted. Some
210ce5c5d65SMauro Carvalho Chehabexisting SCSI transports (e.g. SPI) may not become aware that a SCSI
211ce5c5d65SMauro Carvalho Chehabdevice has been removed until a subsequent SCSI command fails which will
212ce5c5d65SMauro Carvalho Chehabprobably cause that device to be set offline by the mid level. An LLD that
213ce5c5d65SMauro Carvalho Chehabdetects the removal of a SCSI device can instigate its removal from
214ce5c5d65SMauro Carvalho Chehabupper layers with this sequence::
215ce5c5d65SMauro Carvalho Chehab
216ce5c5d65SMauro Carvalho Chehab		    SCSI DEVICE hot unplug
217ce5c5d65SMauro Carvalho Chehab    LLD                      mid level                 LLD
218ce5c5d65SMauro Carvalho Chehab    ===----------------------=========-----------------===------
219ce5c5d65SMauro Carvalho Chehab    scsi_remove_device() -------+
220ce5c5d65SMauro Carvalho Chehab				|
221ce5c5d65SMauro Carvalho Chehab			slave_destroy()
222ce5c5d65SMauro Carvalho Chehab
223ce5c5d65SMauro Carvalho ChehabIt may be useful for an LLD to keep track of struct scsi_device instances
224ce5c5d65SMauro Carvalho Chehab(a pointer is passed as the parameter to slave_alloc() and
225ce5c5d65SMauro Carvalho Chehabslave_configure() callbacks). Such instances are "owned" by the mid-level.
226ce5c5d65SMauro Carvalho Chehabstruct scsi_device instances are freed after slave_destroy().
227ce5c5d65SMauro Carvalho Chehab
228ce5c5d65SMauro Carvalho Chehab
229ce5c5d65SMauro Carvalho ChehabReference Counting
230ce5c5d65SMauro Carvalho Chehab==================
231ce5c5d65SMauro Carvalho ChehabThe Scsi_Host structure has had reference counting infrastructure added.
232ce5c5d65SMauro Carvalho ChehabThis effectively spreads the ownership of struct Scsi_Host instances
233ce5c5d65SMauro Carvalho Chehabacross the various SCSI layers which use them. Previously such instances
234ce5c5d65SMauro Carvalho Chehabwere exclusively owned by the mid level. LLDs would not usually need to
235ce5c5d65SMauro Carvalho Chehabdirectly manipulate these reference counts but there may be some cases
236ce5c5d65SMauro Carvalho Chehabwhere they do.
237ce5c5d65SMauro Carvalho Chehab
238ce5c5d65SMauro Carvalho ChehabThere are 3 reference counting functions of interest associated with
239ce5c5d65SMauro Carvalho Chehabstruct Scsi_Host:
240ce5c5d65SMauro Carvalho Chehab
241ce5c5d65SMauro Carvalho Chehab  - scsi_host_alloc():
242ce5c5d65SMauro Carvalho Chehab	returns a pointer to new instance of struct
243ce5c5d65SMauro Carvalho Chehab        Scsi_Host which has its reference count ^^ set to 1
244ce5c5d65SMauro Carvalho Chehab
245ce5c5d65SMauro Carvalho Chehab  - scsi_host_get():
246ce5c5d65SMauro Carvalho Chehab	adds 1 to the reference count of the given instance
247ce5c5d65SMauro Carvalho Chehab
248ce5c5d65SMauro Carvalho Chehab  - scsi_host_put():
249ce5c5d65SMauro Carvalho Chehab	decrements 1 from the reference count of the given
250ce5c5d65SMauro Carvalho Chehab        instance. If the reference count reaches 0 then the given instance
251ce5c5d65SMauro Carvalho Chehab        is freed
252ce5c5d65SMauro Carvalho Chehab
253ce5c5d65SMauro Carvalho ChehabThe scsi_device structure has had reference counting infrastructure added.
254ce5c5d65SMauro Carvalho ChehabThis effectively spreads the ownership of struct scsi_device instances
255ce5c5d65SMauro Carvalho Chehabacross the various SCSI layers which use them. Previously such instances
256ce5c5d65SMauro Carvalho Chehabwere exclusively owned by the mid level. See the access functions declared
257ce5c5d65SMauro Carvalho Chehabtowards the end of include/scsi/scsi_device.h . If an LLD wants to keep
258ce5c5d65SMauro Carvalho Chehaba copy of a pointer to a scsi_device instance it should use scsi_device_get()
259ce5c5d65SMauro Carvalho Chehabto bump its reference count. When it is finished with the pointer it can
260ce5c5d65SMauro Carvalho Chehabuse scsi_device_put() to decrement its reference count (and potentially
261ce5c5d65SMauro Carvalho Chehabdelete it).
262ce5c5d65SMauro Carvalho Chehab
263ce5c5d65SMauro Carvalho Chehab.. Note::
264ce5c5d65SMauro Carvalho Chehab
265ce5c5d65SMauro Carvalho Chehab   struct Scsi_Host actually has 2 reference counts which are manipulated
266ce5c5d65SMauro Carvalho Chehab   in parallel by these functions.
267ce5c5d65SMauro Carvalho Chehab
268ce5c5d65SMauro Carvalho Chehab
269ce5c5d65SMauro Carvalho ChehabConventions
270ce5c5d65SMauro Carvalho Chehab===========
271ce5c5d65SMauro Carvalho ChehabFirst, Linus Torvalds's thoughts on C coding style can be found in the
272ce5c5d65SMauro Carvalho ChehabDocumentation/process/coding-style.rst file.
273ce5c5d65SMauro Carvalho Chehab
274ce5c5d65SMauro Carvalho ChehabNext, there is a movement to "outlaw" typedefs introducing synonyms for
275ce5c5d65SMauro Carvalho Chehabstruct tags. Both can be still found in the SCSI subsystem, but
276ce5c5d65SMauro Carvalho Chehabthe typedefs have been moved to a single file, scsi_typedefs.h to
277ce5c5d65SMauro Carvalho Chehabmake their future removal easier, for example:
278ce5c5d65SMauro Carvalho Chehab"typedef struct scsi_cmnd Scsi_Cmnd;"
279ce5c5d65SMauro Carvalho Chehab
280ce5c5d65SMauro Carvalho ChehabAlso, most C99 enhancements are encouraged to the extent they are supported
281ce5c5d65SMauro Carvalho Chehabby the relevant gcc compilers. So C99 style structure and array
282ce5c5d65SMauro Carvalho Chehabinitializers are encouraged where appropriate. Don't go too far,
283ce5c5d65SMauro Carvalho ChehabVLAs are not properly supported yet.  An exception to this is the use of
284ce5c5d65SMauro Carvalho Chehab``//`` style comments; ``/*...*/`` comments are still preferred in Linux.
285ce5c5d65SMauro Carvalho Chehab
286ce5c5d65SMauro Carvalho ChehabWell written, tested and documented code, need not be re-formatted to
287ce5c5d65SMauro Carvalho Chehabcomply with the above conventions. For example, the aic7xxx driver
288ce5c5d65SMauro Carvalho Chehabcomes to Linux from FreeBSD and Adaptec's own labs. No doubt FreeBSD
289ce5c5d65SMauro Carvalho Chehaband Adaptec have their own coding conventions.
290ce5c5d65SMauro Carvalho Chehab
291ce5c5d65SMauro Carvalho Chehab
292ce5c5d65SMauro Carvalho ChehabMid level supplied functions
293ce5c5d65SMauro Carvalho Chehab============================
294ce5c5d65SMauro Carvalho ChehabThese functions are supplied by the SCSI mid level for use by LLDs.
295ce5c5d65SMauro Carvalho ChehabThe names (i.e. entry points) of these functions are exported
296ce5c5d65SMauro Carvalho Chehabso an LLD that is a module can access them. The kernel will
297ce5c5d65SMauro Carvalho Chehabarrange for the SCSI mid level to be loaded and initialized before any LLD
298ce5c5d65SMauro Carvalho Chehabis initialized. The functions below are listed alphabetically and their
299ce5c5d65SMauro Carvalho Chehabnames all start with ``scsi_``.
300ce5c5d65SMauro Carvalho Chehab
301ce5c5d65SMauro Carvalho ChehabSummary:
302ce5c5d65SMauro Carvalho Chehab
303ce5c5d65SMauro Carvalho Chehab  - scsi_add_device - creates new scsi device (lu) instance
304ce5c5d65SMauro Carvalho Chehab  - scsi_add_host - perform sysfs registration and set up transport class
305ce5c5d65SMauro Carvalho Chehab  - scsi_change_queue_depth - change the queue depth on a SCSI device
306ce5c5d65SMauro Carvalho Chehab  - scsi_bios_ptable - return copy of block device's partition table
307ce5c5d65SMauro Carvalho Chehab  - scsi_block_requests - prevent further commands being queued to given host
308ce5c5d65SMauro Carvalho Chehab  - scsi_host_alloc - return a new scsi_host instance whose refcount==1
309ce5c5d65SMauro Carvalho Chehab  - scsi_host_get - increments Scsi_Host instance's refcount
310ce5c5d65SMauro Carvalho Chehab  - scsi_host_put - decrements Scsi_Host instance's refcount (free if 0)
311ce5c5d65SMauro Carvalho Chehab  - scsi_partsize - parse partition table into cylinders, heads + sectors
312ce5c5d65SMauro Carvalho Chehab  - scsi_register - create and register a scsi host adapter instance.
313ce5c5d65SMauro Carvalho Chehab  - scsi_remove_device - detach and remove a SCSI device
314ce5c5d65SMauro Carvalho Chehab  - scsi_remove_host - detach and remove all SCSI devices owned by host
315ce5c5d65SMauro Carvalho Chehab  - scsi_report_bus_reset - report scsi _bus_ reset observed
316ce5c5d65SMauro Carvalho Chehab  - scsi_scan_host - scan SCSI bus
317ce5c5d65SMauro Carvalho Chehab  - scsi_track_queue_full - track successive QUEUE_FULL events
318ce5c5d65SMauro Carvalho Chehab  - scsi_unblock_requests - allow further commands to be queued to given host
319ce5c5d65SMauro Carvalho Chehab  - scsi_unregister - [calls scsi_host_put()]
320ce5c5d65SMauro Carvalho Chehab
321ce5c5d65SMauro Carvalho Chehab
322ce5c5d65SMauro Carvalho ChehabDetails::
323ce5c5d65SMauro Carvalho Chehab
324ce5c5d65SMauro Carvalho Chehab    /**
325ce5c5d65SMauro Carvalho Chehab    * scsi_add_device - creates new scsi device (lu) instance
326ce5c5d65SMauro Carvalho Chehab    * @shost:   pointer to scsi host instance
327ce5c5d65SMauro Carvalho Chehab    * @channel: channel number (rarely other than 0)
328ce5c5d65SMauro Carvalho Chehab    * @id:      target id number
329ce5c5d65SMauro Carvalho Chehab    * @lun:     logical unit number
330ce5c5d65SMauro Carvalho Chehab    *
331ce5c5d65SMauro Carvalho Chehab    *      Returns pointer to new struct scsi_device instance or
332ce5c5d65SMauro Carvalho Chehab    *      ERR_PTR(-ENODEV) (or some other bent pointer) if something is
333ce5c5d65SMauro Carvalho Chehab    *      wrong (e.g. no lu responds at given address)
334ce5c5d65SMauro Carvalho Chehab    *
335ce5c5d65SMauro Carvalho Chehab    *      Might block: yes
336ce5c5d65SMauro Carvalho Chehab    *
337ce5c5d65SMauro Carvalho Chehab    *      Notes: This call is usually performed internally during a scsi
338ce5c5d65SMauro Carvalho Chehab    *      bus scan when an HBA is added (i.e. scsi_scan_host()). So it
339ce5c5d65SMauro Carvalho Chehab    *      should only be called if the HBA becomes aware of a new scsi
340ce5c5d65SMauro Carvalho Chehab    *      device (lu) after scsi_scan_host() has completed. If successful
341ce5c5d65SMauro Carvalho Chehab    *      this call can lead to slave_alloc() and slave_configure() callbacks
342ce5c5d65SMauro Carvalho Chehab    *      into the LLD.
343ce5c5d65SMauro Carvalho Chehab    *
344ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/scsi_scan.c
345ce5c5d65SMauro Carvalho Chehab    **/
346ce5c5d65SMauro Carvalho Chehab    struct scsi_device * scsi_add_device(struct Scsi_Host *shost,
347ce5c5d65SMauro Carvalho Chehab					unsigned int channel,
348ce5c5d65SMauro Carvalho Chehab					unsigned int id, unsigned int lun)
349ce5c5d65SMauro Carvalho Chehab
350ce5c5d65SMauro Carvalho Chehab
351ce5c5d65SMauro Carvalho Chehab    /**
352ce5c5d65SMauro Carvalho Chehab    * scsi_add_host - perform sysfs registration and set up transport class
353ce5c5d65SMauro Carvalho Chehab    * @shost:   pointer to scsi host instance
354ce5c5d65SMauro Carvalho Chehab    * @dev:     pointer to struct device of type scsi class
355ce5c5d65SMauro Carvalho Chehab    *
356ce5c5d65SMauro Carvalho Chehab    *      Returns 0 on success, negative errno of failure (e.g. -ENOMEM)
357ce5c5d65SMauro Carvalho Chehab    *
358ce5c5d65SMauro Carvalho Chehab    *      Might block: no
359ce5c5d65SMauro Carvalho Chehab    *
360ce5c5d65SMauro Carvalho Chehab    *      Notes: Only required in "hotplug initialization model" after a
361ce5c5d65SMauro Carvalho Chehab    *      successful call to scsi_host_alloc().  This function does not
362ce5c5d65SMauro Carvalho Chehab    *	scan the bus; this can be done by calling scsi_scan_host() or
363ce5c5d65SMauro Carvalho Chehab    *	in some other transport-specific way.  The LLD must set up
364ce5c5d65SMauro Carvalho Chehab    *	the transport template before calling this function and may only
365ce5c5d65SMauro Carvalho Chehab    *	access the transport class data after this function has been called.
366ce5c5d65SMauro Carvalho Chehab    *
367ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/hosts.c
368ce5c5d65SMauro Carvalho Chehab    **/
369ce5c5d65SMauro Carvalho Chehab    int scsi_add_host(struct Scsi_Host *shost, struct device * dev)
370ce5c5d65SMauro Carvalho Chehab
371ce5c5d65SMauro Carvalho Chehab
372ce5c5d65SMauro Carvalho Chehab    /**
373ce5c5d65SMauro Carvalho Chehab    * scsi_change_queue_depth - allow LLD to change queue depth on a SCSI device
374ce5c5d65SMauro Carvalho Chehab    * @sdev:       pointer to SCSI device to change queue depth on
375ce5c5d65SMauro Carvalho Chehab    * @tags        Number of tags allowed if tagged queuing enabled,
376ce5c5d65SMauro Carvalho Chehab    *              or number of commands the LLD can queue up
377ce5c5d65SMauro Carvalho Chehab    *              in non-tagged mode (as per cmd_per_lun).
378ce5c5d65SMauro Carvalho Chehab    *
379ce5c5d65SMauro Carvalho Chehab    *      Returns nothing
380ce5c5d65SMauro Carvalho Chehab    *
381ce5c5d65SMauro Carvalho Chehab    *      Might block: no
382ce5c5d65SMauro Carvalho Chehab    *
383ce5c5d65SMauro Carvalho Chehab    *      Notes: Can be invoked any time on a SCSI device controlled by this
384ce5c5d65SMauro Carvalho Chehab    *      LLD. [Specifically during and after slave_configure() and prior to
385ce5c5d65SMauro Carvalho Chehab    *      slave_destroy().] Can safely be invoked from interrupt code.
386ce5c5d65SMauro Carvalho Chehab    *
387ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/scsi.c [see source code for more notes]
388ce5c5d65SMauro Carvalho Chehab    *
389ce5c5d65SMauro Carvalho Chehab    **/
390ce5c5d65SMauro Carvalho Chehab    int scsi_change_queue_depth(struct scsi_device *sdev, int tags)
391ce5c5d65SMauro Carvalho Chehab
392ce5c5d65SMauro Carvalho Chehab
393ce5c5d65SMauro Carvalho Chehab    /**
394ce5c5d65SMauro Carvalho Chehab    * scsi_bios_ptable - return copy of block device's partition table
395ce5c5d65SMauro Carvalho Chehab    * @dev:        pointer to block device
396ce5c5d65SMauro Carvalho Chehab    *
397ce5c5d65SMauro Carvalho Chehab    *      Returns pointer to partition table, or NULL for failure
398ce5c5d65SMauro Carvalho Chehab    *
399ce5c5d65SMauro Carvalho Chehab    *      Might block: yes
400ce5c5d65SMauro Carvalho Chehab    *
401ce5c5d65SMauro Carvalho Chehab    *      Notes: Caller owns memory returned (free with kfree() )
402ce5c5d65SMauro Carvalho Chehab    *
403ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/scsicam.c
404ce5c5d65SMauro Carvalho Chehab    **/
405ce5c5d65SMauro Carvalho Chehab    unsigned char *scsi_bios_ptable(struct block_device *dev)
406ce5c5d65SMauro Carvalho Chehab
407ce5c5d65SMauro Carvalho Chehab
408ce5c5d65SMauro Carvalho Chehab    /**
409ce5c5d65SMauro Carvalho Chehab    * scsi_block_requests - prevent further commands being queued to given host
410ce5c5d65SMauro Carvalho Chehab    *
411ce5c5d65SMauro Carvalho Chehab    * @shost: pointer to host to block commands on
412ce5c5d65SMauro Carvalho Chehab    *
413ce5c5d65SMauro Carvalho Chehab    *      Returns nothing
414ce5c5d65SMauro Carvalho Chehab    *
415ce5c5d65SMauro Carvalho Chehab    *      Might block: no
416ce5c5d65SMauro Carvalho Chehab    *
417ce5c5d65SMauro Carvalho Chehab    *      Notes: There is no timer nor any other means by which the requests
418ce5c5d65SMauro Carvalho Chehab    *      get unblocked other than the LLD calling scsi_unblock_requests().
419ce5c5d65SMauro Carvalho Chehab    *
420ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/scsi_lib.c
421ce5c5d65SMauro Carvalho Chehab    **/
422ce5c5d65SMauro Carvalho Chehab    void scsi_block_requests(struct Scsi_Host * shost)
423ce5c5d65SMauro Carvalho Chehab
424ce5c5d65SMauro Carvalho Chehab
425ce5c5d65SMauro Carvalho Chehab    /**
426ce5c5d65SMauro Carvalho Chehab    * scsi_host_alloc - create a scsi host adapter instance and perform basic
427ce5c5d65SMauro Carvalho Chehab    *                   initialization.
428ce5c5d65SMauro Carvalho Chehab    * @sht:        pointer to scsi host template
429ce5c5d65SMauro Carvalho Chehab    * @privsize:   extra bytes to allocate in hostdata array (which is the
430ce5c5d65SMauro Carvalho Chehab    *              last member of the returned Scsi_Host instance)
431ce5c5d65SMauro Carvalho Chehab    *
432ce5c5d65SMauro Carvalho Chehab    *      Returns pointer to new Scsi_Host instance or NULL on failure
433ce5c5d65SMauro Carvalho Chehab    *
434ce5c5d65SMauro Carvalho Chehab    *      Might block: yes
435ce5c5d65SMauro Carvalho Chehab    *
436ce5c5d65SMauro Carvalho Chehab    *      Notes: When this call returns to the LLD, the SCSI bus scan on
437ce5c5d65SMauro Carvalho Chehab    *      this host has _not_ yet been done.
438ce5c5d65SMauro Carvalho Chehab    *      The hostdata array (by default zero length) is a per host scratch
439ce5c5d65SMauro Carvalho Chehab    *      area for the LLD's exclusive use.
440ce5c5d65SMauro Carvalho Chehab    *      Both associated refcounting objects have their refcount set to 1.
441ce5c5d65SMauro Carvalho Chehab    *      Full registration (in sysfs) and a bus scan are performed later when
442ce5c5d65SMauro Carvalho Chehab    *      scsi_add_host() and scsi_scan_host() are called.
443ce5c5d65SMauro Carvalho Chehab    *
444ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/hosts.c .
445ce5c5d65SMauro Carvalho Chehab    **/
446ce5c5d65SMauro Carvalho Chehab    struct Scsi_Host * scsi_host_alloc(struct scsi_host_template * sht,
447ce5c5d65SMauro Carvalho Chehab				    int privsize)
448ce5c5d65SMauro Carvalho Chehab
449ce5c5d65SMauro Carvalho Chehab
450ce5c5d65SMauro Carvalho Chehab    /**
451ce5c5d65SMauro Carvalho Chehab    * scsi_host_get - increment Scsi_Host instance refcount
452ce5c5d65SMauro Carvalho Chehab    * @shost:   pointer to struct Scsi_Host instance
453ce5c5d65SMauro Carvalho Chehab    *
454ce5c5d65SMauro Carvalho Chehab    *      Returns nothing
455ce5c5d65SMauro Carvalho Chehab    *
456ce5c5d65SMauro Carvalho Chehab    *      Might block: currently may block but may be changed to not block
457ce5c5d65SMauro Carvalho Chehab    *
458ce5c5d65SMauro Carvalho Chehab    *      Notes: Actually increments the counts in two sub-objects
459ce5c5d65SMauro Carvalho Chehab    *
460ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/hosts.c
461ce5c5d65SMauro Carvalho Chehab    **/
462ce5c5d65SMauro Carvalho Chehab    void scsi_host_get(struct Scsi_Host *shost)
463ce5c5d65SMauro Carvalho Chehab
464ce5c5d65SMauro Carvalho Chehab
465ce5c5d65SMauro Carvalho Chehab    /**
466ce5c5d65SMauro Carvalho Chehab    * scsi_host_put - decrement Scsi_Host instance refcount, free if 0
467ce5c5d65SMauro Carvalho Chehab    * @shost:   pointer to struct Scsi_Host instance
468ce5c5d65SMauro Carvalho Chehab    *
469ce5c5d65SMauro Carvalho Chehab    *      Returns nothing
470ce5c5d65SMauro Carvalho Chehab    *
471ce5c5d65SMauro Carvalho Chehab    *      Might block: currently may block but may be changed to not block
472ce5c5d65SMauro Carvalho Chehab    *
473ce5c5d65SMauro Carvalho Chehab    *      Notes: Actually decrements the counts in two sub-objects. If the
474ce5c5d65SMauro Carvalho Chehab    *      latter refcount reaches 0, the Scsi_Host instance is freed.
475ce5c5d65SMauro Carvalho Chehab    *      The LLD need not worry exactly when the Scsi_Host instance is
476ce5c5d65SMauro Carvalho Chehab    *      freed, it just shouldn't access the instance after it has balanced
477ce5c5d65SMauro Carvalho Chehab    *      out its refcount usage.
478ce5c5d65SMauro Carvalho Chehab    *
479ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/hosts.c
480ce5c5d65SMauro Carvalho Chehab    **/
481ce5c5d65SMauro Carvalho Chehab    void scsi_host_put(struct Scsi_Host *shost)
482ce5c5d65SMauro Carvalho Chehab
483ce5c5d65SMauro Carvalho Chehab
484ce5c5d65SMauro Carvalho Chehab    /**
485ce5c5d65SMauro Carvalho Chehab    * scsi_partsize - parse partition table into cylinders, heads + sectors
486ce5c5d65SMauro Carvalho Chehab    * @buf: pointer to partition table
487ce5c5d65SMauro Carvalho Chehab    * @capacity: size of (total) disk in 512 byte sectors
488ce5c5d65SMauro Carvalho Chehab    * @cyls: outputs number of cylinders calculated via this pointer
489ce5c5d65SMauro Carvalho Chehab    * @hds: outputs number of heads calculated via this pointer
490ce5c5d65SMauro Carvalho Chehab    * @secs: outputs number of sectors calculated via this pointer
491ce5c5d65SMauro Carvalho Chehab    *
492ce5c5d65SMauro Carvalho Chehab    *      Returns 0 on success, -1 on failure
493ce5c5d65SMauro Carvalho Chehab    *
494ce5c5d65SMauro Carvalho Chehab    *      Might block: no
495ce5c5d65SMauro Carvalho Chehab    *
496ce5c5d65SMauro Carvalho Chehab    *      Notes: Caller owns memory returned (free with kfree() )
497ce5c5d65SMauro Carvalho Chehab    *
498ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/scsicam.c
499ce5c5d65SMauro Carvalho Chehab    **/
500ce5c5d65SMauro Carvalho Chehab    int scsi_partsize(unsigned char *buf, unsigned long capacity,
501ce5c5d65SMauro Carvalho Chehab		    unsigned int *cyls, unsigned int *hds, unsigned int *secs)
502ce5c5d65SMauro Carvalho Chehab
503ce5c5d65SMauro Carvalho Chehab
504ce5c5d65SMauro Carvalho Chehab    /**
505ce5c5d65SMauro Carvalho Chehab    * scsi_register - create and register a scsi host adapter instance.
506ce5c5d65SMauro Carvalho Chehab    * @sht:        pointer to scsi host template
507ce5c5d65SMauro Carvalho Chehab    * @privsize:   extra bytes to allocate in hostdata array (which is the
508ce5c5d65SMauro Carvalho Chehab    *              last member of the returned Scsi_Host instance)
509ce5c5d65SMauro Carvalho Chehab    *
510ce5c5d65SMauro Carvalho Chehab    *      Returns pointer to new Scsi_Host instance or NULL on failure
511ce5c5d65SMauro Carvalho Chehab    *
512ce5c5d65SMauro Carvalho Chehab    *      Might block: yes
513ce5c5d65SMauro Carvalho Chehab    *
514ce5c5d65SMauro Carvalho Chehab    *      Notes: When this call returns to the LLD, the SCSI bus scan on
515ce5c5d65SMauro Carvalho Chehab    *      this host has _not_ yet been done.
516ce5c5d65SMauro Carvalho Chehab    *      The hostdata array (by default zero length) is a per host scratch
517ce5c5d65SMauro Carvalho Chehab    *      area for the LLD.
518ce5c5d65SMauro Carvalho Chehab    *
519ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/hosts.c .
520ce5c5d65SMauro Carvalho Chehab    **/
521ce5c5d65SMauro Carvalho Chehab    struct Scsi_Host * scsi_register(struct scsi_host_template * sht,
522ce5c5d65SMauro Carvalho Chehab				    int privsize)
523ce5c5d65SMauro Carvalho Chehab
524ce5c5d65SMauro Carvalho Chehab
525ce5c5d65SMauro Carvalho Chehab    /**
526ce5c5d65SMauro Carvalho Chehab    * scsi_remove_device - detach and remove a SCSI device
527ce5c5d65SMauro Carvalho Chehab    * @sdev:      a pointer to a scsi device instance
528ce5c5d65SMauro Carvalho Chehab    *
529ce5c5d65SMauro Carvalho Chehab    *      Returns value: 0 on success, -EINVAL if device not attached
530ce5c5d65SMauro Carvalho Chehab    *
531ce5c5d65SMauro Carvalho Chehab    *      Might block: yes
532ce5c5d65SMauro Carvalho Chehab    *
533ce5c5d65SMauro Carvalho Chehab    *      Notes: If an LLD becomes aware that a scsi device (lu) has
534ce5c5d65SMauro Carvalho Chehab    *      been removed but its host is still present then it can request
535ce5c5d65SMauro Carvalho Chehab    *      the removal of that scsi device. If successful this call will
536ce5c5d65SMauro Carvalho Chehab    *      lead to the slave_destroy() callback being invoked. sdev is an
537ce5c5d65SMauro Carvalho Chehab    *      invalid pointer after this call.
538ce5c5d65SMauro Carvalho Chehab    *
539ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/scsi_sysfs.c .
540ce5c5d65SMauro Carvalho Chehab    **/
541ce5c5d65SMauro Carvalho Chehab    int scsi_remove_device(struct scsi_device *sdev)
542ce5c5d65SMauro Carvalho Chehab
543ce5c5d65SMauro Carvalho Chehab
544ce5c5d65SMauro Carvalho Chehab    /**
545ce5c5d65SMauro Carvalho Chehab    * scsi_remove_host - detach and remove all SCSI devices owned by host
546ce5c5d65SMauro Carvalho Chehab    * @shost:      a pointer to a scsi host instance
547ce5c5d65SMauro Carvalho Chehab    *
548ce5c5d65SMauro Carvalho Chehab    *      Returns value: 0 on success, 1 on failure (e.g. LLD busy ??)
549ce5c5d65SMauro Carvalho Chehab    *
550ce5c5d65SMauro Carvalho Chehab    *      Might block: yes
551ce5c5d65SMauro Carvalho Chehab    *
552ce5c5d65SMauro Carvalho Chehab    *      Notes: Should only be invoked if the "hotplug initialization
553ce5c5d65SMauro Carvalho Chehab    *      model" is being used. It should be called _prior_ to
554ce5c5d65SMauro Carvalho Chehab    *      scsi_unregister().
555ce5c5d65SMauro Carvalho Chehab    *
556ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/hosts.c .
557ce5c5d65SMauro Carvalho Chehab    **/
558ce5c5d65SMauro Carvalho Chehab    int scsi_remove_host(struct Scsi_Host *shost)
559ce5c5d65SMauro Carvalho Chehab
560ce5c5d65SMauro Carvalho Chehab
561ce5c5d65SMauro Carvalho Chehab    /**
562ce5c5d65SMauro Carvalho Chehab    * scsi_report_bus_reset - report scsi _bus_ reset observed
563ce5c5d65SMauro Carvalho Chehab    * @shost: a pointer to a scsi host involved
564ce5c5d65SMauro Carvalho Chehab    * @channel: channel (within) host on which scsi bus reset occurred
565ce5c5d65SMauro Carvalho Chehab    *
566ce5c5d65SMauro Carvalho Chehab    *      Returns nothing
567ce5c5d65SMauro Carvalho Chehab    *
568ce5c5d65SMauro Carvalho Chehab    *      Might block: no
569ce5c5d65SMauro Carvalho Chehab    *
570ce5c5d65SMauro Carvalho Chehab    *      Notes: This only needs to be called if the reset is one which
571ce5c5d65SMauro Carvalho Chehab    *      originates from an unknown location.  Resets originated by the
572ce5c5d65SMauro Carvalho Chehab    *      mid level itself don't need to call this, but there should be
573ce5c5d65SMauro Carvalho Chehab    *      no harm.  The main purpose of this is to make sure that a
574ce5c5d65SMauro Carvalho Chehab    *      CHECK_CONDITION is properly treated.
575ce5c5d65SMauro Carvalho Chehab    *
576ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/scsi_error.c .
577ce5c5d65SMauro Carvalho Chehab    **/
578ce5c5d65SMauro Carvalho Chehab    void scsi_report_bus_reset(struct Scsi_Host * shost, int channel)
579ce5c5d65SMauro Carvalho Chehab
580ce5c5d65SMauro Carvalho Chehab
581ce5c5d65SMauro Carvalho Chehab    /**
582ce5c5d65SMauro Carvalho Chehab    * scsi_scan_host - scan SCSI bus
583ce5c5d65SMauro Carvalho Chehab    * @shost: a pointer to a scsi host instance
584ce5c5d65SMauro Carvalho Chehab    *
585ce5c5d65SMauro Carvalho Chehab    *	Might block: yes
586ce5c5d65SMauro Carvalho Chehab    *
587ce5c5d65SMauro Carvalho Chehab    *	Notes: Should be called after scsi_add_host()
588ce5c5d65SMauro Carvalho Chehab    *
589ce5c5d65SMauro Carvalho Chehab    *	Defined in: drivers/scsi/scsi_scan.c
590ce5c5d65SMauro Carvalho Chehab    **/
591ce5c5d65SMauro Carvalho Chehab    void scsi_scan_host(struct Scsi_Host *shost)
592ce5c5d65SMauro Carvalho Chehab
593ce5c5d65SMauro Carvalho Chehab
594ce5c5d65SMauro Carvalho Chehab    /**
595ce5c5d65SMauro Carvalho Chehab    * scsi_track_queue_full - track successive QUEUE_FULL events on given
596ce5c5d65SMauro Carvalho Chehab    *                      device to determine if and when there is a need
597ce5c5d65SMauro Carvalho Chehab    *                      to adjust the queue depth on the device.
598ce5c5d65SMauro Carvalho Chehab    * @sdev:  pointer to SCSI device instance
599ce5c5d65SMauro Carvalho Chehab    * @depth: Current number of outstanding SCSI commands on this device,
600ce5c5d65SMauro Carvalho Chehab    *         not counting the one returned as QUEUE_FULL.
601ce5c5d65SMauro Carvalho Chehab    *
602ce5c5d65SMauro Carvalho Chehab    *      Returns 0  - no change needed
603ce5c5d65SMauro Carvalho Chehab    *              >0 - adjust queue depth to this new depth
604ce5c5d65SMauro Carvalho Chehab    *              -1 - drop back to untagged operation using host->cmd_per_lun
605ce5c5d65SMauro Carvalho Chehab    *                   as the untagged command depth
606ce5c5d65SMauro Carvalho Chehab    *
607ce5c5d65SMauro Carvalho Chehab    *      Might block: no
608ce5c5d65SMauro Carvalho Chehab    *
609ce5c5d65SMauro Carvalho Chehab    *      Notes: LLDs may call this at any time and we will do "The Right
610ce5c5d65SMauro Carvalho Chehab    *              Thing"; interrupt context safe.
611ce5c5d65SMauro Carvalho Chehab    *
612ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/scsi.c .
613ce5c5d65SMauro Carvalho Chehab    **/
614ce5c5d65SMauro Carvalho Chehab    int scsi_track_queue_full(struct scsi_device *sdev, int depth)
615ce5c5d65SMauro Carvalho Chehab
616ce5c5d65SMauro Carvalho Chehab
617ce5c5d65SMauro Carvalho Chehab    /**
618ce5c5d65SMauro Carvalho Chehab    * scsi_unblock_requests - allow further commands to be queued to given host
619ce5c5d65SMauro Carvalho Chehab    *
620ce5c5d65SMauro Carvalho Chehab    * @shost: pointer to host to unblock commands on
621ce5c5d65SMauro Carvalho Chehab    *
622ce5c5d65SMauro Carvalho Chehab    *      Returns nothing
623ce5c5d65SMauro Carvalho Chehab    *
624ce5c5d65SMauro Carvalho Chehab    *      Might block: no
625ce5c5d65SMauro Carvalho Chehab    *
626ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/scsi_lib.c .
627ce5c5d65SMauro Carvalho Chehab    **/
628ce5c5d65SMauro Carvalho Chehab    void scsi_unblock_requests(struct Scsi_Host * shost)
629ce5c5d65SMauro Carvalho Chehab
630ce5c5d65SMauro Carvalho Chehab
631ce5c5d65SMauro Carvalho Chehab    /**
632ce5c5d65SMauro Carvalho Chehab    * scsi_unregister - unregister and free memory used by host instance
633ce5c5d65SMauro Carvalho Chehab    * @shp:        pointer to scsi host instance to unregister.
634ce5c5d65SMauro Carvalho Chehab    *
635ce5c5d65SMauro Carvalho Chehab    *      Returns nothing
636ce5c5d65SMauro Carvalho Chehab    *
637ce5c5d65SMauro Carvalho Chehab    *      Might block: no
638ce5c5d65SMauro Carvalho Chehab    *
639ce5c5d65SMauro Carvalho Chehab    *      Notes: Should not be invoked if the "hotplug initialization
640ce5c5d65SMauro Carvalho Chehab    *      model" is being used. Called internally by exit_this_scsi_driver()
641ce5c5d65SMauro Carvalho Chehab    *      in the "passive initialization model". Hence a LLD has no need to
642ce5c5d65SMauro Carvalho Chehab    *      call this function directly.
643ce5c5d65SMauro Carvalho Chehab    *
644ce5c5d65SMauro Carvalho Chehab    *      Defined in: drivers/scsi/hosts.c .
645ce5c5d65SMauro Carvalho Chehab    **/
646ce5c5d65SMauro Carvalho Chehab    void scsi_unregister(struct Scsi_Host * shp)
647ce5c5d65SMauro Carvalho Chehab
648ce5c5d65SMauro Carvalho Chehab
649ce5c5d65SMauro Carvalho Chehab
650ce5c5d65SMauro Carvalho Chehab
651ce5c5d65SMauro Carvalho ChehabInterface Functions
652ce5c5d65SMauro Carvalho Chehab===================
653ce5c5d65SMauro Carvalho ChehabInterface functions are supplied (defined) by LLDs and their function
654ce5c5d65SMauro Carvalho Chehabpointers are placed in an instance of struct scsi_host_template which
655ce5c5d65SMauro Carvalho Chehabis passed to scsi_host_alloc() [or scsi_register() / init_this_scsi_driver()].
656ce5c5d65SMauro Carvalho ChehabSome are mandatory. Interface functions should be declared static. The
657ce5c5d65SMauro Carvalho Chehabaccepted convention is that driver "xyz" will declare its slave_configure()
658ce5c5d65SMauro Carvalho Chehabfunction as::
659ce5c5d65SMauro Carvalho Chehab
660ce5c5d65SMauro Carvalho Chehab    static int xyz_slave_configure(struct scsi_device * sdev);
661ce5c5d65SMauro Carvalho Chehab
662ce5c5d65SMauro Carvalho Chehaband so forth for all interface functions listed below.
663ce5c5d65SMauro Carvalho Chehab
664ce5c5d65SMauro Carvalho ChehabA pointer to this function should be placed in the 'slave_configure' member
665ce5c5d65SMauro Carvalho Chehabof a "struct scsi_host_template" instance. A pointer to such an instance
666ce5c5d65SMauro Carvalho Chehabshould be passed to the mid level's scsi_host_alloc() [or scsi_register() /
667ce5c5d65SMauro Carvalho Chehabinit_this_scsi_driver()].
668ce5c5d65SMauro Carvalho Chehab
669ce5c5d65SMauro Carvalho ChehabThe interface functions are also described in the include/scsi/scsi_host.h
670ce5c5d65SMauro Carvalho Chehabfile immediately above their definition point in "struct scsi_host_template".
671ce5c5d65SMauro Carvalho ChehabIn some cases more detail is given in scsi_host.h than below.
672ce5c5d65SMauro Carvalho Chehab
673ce5c5d65SMauro Carvalho ChehabThe interface functions are listed below in alphabetical order.
674ce5c5d65SMauro Carvalho Chehab
675ce5c5d65SMauro Carvalho ChehabSummary:
676ce5c5d65SMauro Carvalho Chehab
677ce5c5d65SMauro Carvalho Chehab  - bios_param - fetch head, sector, cylinder info for a disk
678ce5c5d65SMauro Carvalho Chehab  - eh_timed_out - notify the host that a command timer expired
679ce5c5d65SMauro Carvalho Chehab  - eh_abort_handler - abort given command
680ce5c5d65SMauro Carvalho Chehab  - eh_bus_reset_handler - issue SCSI bus reset
681ce5c5d65SMauro Carvalho Chehab  - eh_device_reset_handler - issue SCSI device reset
682ce5c5d65SMauro Carvalho Chehab  - eh_host_reset_handler - reset host (host bus adapter)
683ce5c5d65SMauro Carvalho Chehab  - info - supply information about given host
684ce5c5d65SMauro Carvalho Chehab  - ioctl - driver can respond to ioctls
685ce5c5d65SMauro Carvalho Chehab  - proc_info - supports /proc/scsi/{driver_name}/{host_no}
686ce5c5d65SMauro Carvalho Chehab  - queuecommand - queue scsi command, invoke 'done' on completion
687ce5c5d65SMauro Carvalho Chehab  - slave_alloc - prior to any commands being sent to a new device
688ce5c5d65SMauro Carvalho Chehab  - slave_configure - driver fine tuning for given device after attach
689ce5c5d65SMauro Carvalho Chehab  - slave_destroy - given device is about to be shut down
690ce5c5d65SMauro Carvalho Chehab
691ce5c5d65SMauro Carvalho Chehab
692ce5c5d65SMauro Carvalho ChehabDetails::
693ce5c5d65SMauro Carvalho Chehab
694ce5c5d65SMauro Carvalho Chehab    /**
695ce5c5d65SMauro Carvalho Chehab    *      bios_param - fetch head, sector, cylinder info for a disk
696ce5c5d65SMauro Carvalho Chehab    *      @sdev: pointer to scsi device context (defined in
697ce5c5d65SMauro Carvalho Chehab    *             include/scsi/scsi_device.h)
698ce5c5d65SMauro Carvalho Chehab    *      @bdev: pointer to block device context (defined in fs.h)
699ce5c5d65SMauro Carvalho Chehab    *      @capacity:  device size (in 512 byte sectors)
700ce5c5d65SMauro Carvalho Chehab    *      @params: three element array to place output:
701ce5c5d65SMauro Carvalho Chehab    *              params[0] number of heads (max 255)
702ce5c5d65SMauro Carvalho Chehab    *              params[1] number of sectors (max 63)
703ce5c5d65SMauro Carvalho Chehab    *              params[2] number of cylinders
704ce5c5d65SMauro Carvalho Chehab    *
705ce5c5d65SMauro Carvalho Chehab    *      Return value is ignored
706ce5c5d65SMauro Carvalho Chehab    *
707ce5c5d65SMauro Carvalho Chehab    *      Locks: none
708ce5c5d65SMauro Carvalho Chehab    *
709ce5c5d65SMauro Carvalho Chehab    *      Calling context: process (sd)
710ce5c5d65SMauro Carvalho Chehab    *
711ce5c5d65SMauro Carvalho Chehab    *      Notes: an arbitrary geometry (based on READ CAPACITY) is used
712ce5c5d65SMauro Carvalho Chehab    *      if this function is not provided. The params array is
713ce5c5d65SMauro Carvalho Chehab    *      pre-initialized with made up values just in case this function
714ce5c5d65SMauro Carvalho Chehab    *      doesn't output anything.
715ce5c5d65SMauro Carvalho Chehab    *
716ce5c5d65SMauro Carvalho Chehab    *      Optionally defined in: LLD
717ce5c5d65SMauro Carvalho Chehab    **/
718ce5c5d65SMauro Carvalho Chehab	int bios_param(struct scsi_device * sdev, struct block_device *bdev,
719ce5c5d65SMauro Carvalho Chehab		    sector_t capacity, int params[3])
720ce5c5d65SMauro Carvalho Chehab
721ce5c5d65SMauro Carvalho Chehab
722ce5c5d65SMauro Carvalho Chehab    /**
723ce5c5d65SMauro Carvalho Chehab    *      eh_timed_out - The timer for the command has just fired
724ce5c5d65SMauro Carvalho Chehab    *      @scp: identifies command timing out
725ce5c5d65SMauro Carvalho Chehab    *
726ce5c5d65SMauro Carvalho Chehab    *      Returns:
727ce5c5d65SMauro Carvalho Chehab    *
728ce5c5d65SMauro Carvalho Chehab    *      EH_HANDLED:             I fixed the error, please complete the command
729ce5c5d65SMauro Carvalho Chehab    *      EH_RESET_TIMER:         I need more time, reset the timer and
730ce5c5d65SMauro Carvalho Chehab    *                              begin counting again
731ce5c5d65SMauro Carvalho Chehab    *      EH_NOT_HANDLED          Begin normal error recovery
732ce5c5d65SMauro Carvalho Chehab    *
733ce5c5d65SMauro Carvalho Chehab    *
734ce5c5d65SMauro Carvalho Chehab    *      Locks: None held
735ce5c5d65SMauro Carvalho Chehab    *
736ce5c5d65SMauro Carvalho Chehab    *      Calling context: interrupt
737ce5c5d65SMauro Carvalho Chehab    *
738ce5c5d65SMauro Carvalho Chehab    *      Notes: This is to give the LLD an opportunity to do local recovery.
739ce5c5d65SMauro Carvalho Chehab    *      This recovery is limited to determining if the outstanding command
740ce5c5d65SMauro Carvalho Chehab    *      will ever complete.  You may not abort and restart the command from
741ce5c5d65SMauro Carvalho Chehab    *      this callback.
742ce5c5d65SMauro Carvalho Chehab    *
743ce5c5d65SMauro Carvalho Chehab    *      Optionally defined in: LLD
744ce5c5d65SMauro Carvalho Chehab    **/
745ce5c5d65SMauro Carvalho Chehab	int eh_timed_out(struct scsi_cmnd * scp)
746ce5c5d65SMauro Carvalho Chehab
747ce5c5d65SMauro Carvalho Chehab
748ce5c5d65SMauro Carvalho Chehab    /**
749ce5c5d65SMauro Carvalho Chehab    *      eh_abort_handler - abort command associated with scp
750ce5c5d65SMauro Carvalho Chehab    *      @scp: identifies command to be aborted
751ce5c5d65SMauro Carvalho Chehab    *
752ce5c5d65SMauro Carvalho Chehab    *      Returns SUCCESS if command aborted else FAILED
753ce5c5d65SMauro Carvalho Chehab    *
754ce5c5d65SMauro Carvalho Chehab    *      Locks: None held
755ce5c5d65SMauro Carvalho Chehab    *
756ce5c5d65SMauro Carvalho Chehab    *      Calling context: kernel thread
757ce5c5d65SMauro Carvalho Chehab    *
758ce5c5d65SMauro Carvalho Chehab    *      Notes: If 'no_async_abort' is defined this callback
759ce5c5d65SMauro Carvalho Chehab    *  	will be invoked from scsi_eh thread. No other commands
760ce5c5d65SMauro Carvalho Chehab    *	will then be queued on current host during eh.
761ce5c5d65SMauro Carvalho Chehab    *	Otherwise it will be called whenever scsi_times_out()
762ce5c5d65SMauro Carvalho Chehab    *      is called due to a command timeout.
763ce5c5d65SMauro Carvalho Chehab    *
764ce5c5d65SMauro Carvalho Chehab    *      Optionally defined in: LLD
765ce5c5d65SMauro Carvalho Chehab    **/
766ce5c5d65SMauro Carvalho Chehab	int eh_abort_handler(struct scsi_cmnd * scp)
767ce5c5d65SMauro Carvalho Chehab
768ce5c5d65SMauro Carvalho Chehab
769ce5c5d65SMauro Carvalho Chehab    /**
770ce5c5d65SMauro Carvalho Chehab    *      eh_bus_reset_handler - issue SCSI bus reset
771ce5c5d65SMauro Carvalho Chehab    *      @scp: SCSI bus that contains this device should be reset
772ce5c5d65SMauro Carvalho Chehab    *
773ce5c5d65SMauro Carvalho Chehab    *      Returns SUCCESS if command aborted else FAILED
774ce5c5d65SMauro Carvalho Chehab    *
775ce5c5d65SMauro Carvalho Chehab    *      Locks: None held
776ce5c5d65SMauro Carvalho Chehab    *
777ce5c5d65SMauro Carvalho Chehab    *      Calling context: kernel thread
778ce5c5d65SMauro Carvalho Chehab    *
779ce5c5d65SMauro Carvalho Chehab    *      Notes: Invoked from scsi_eh thread. No other commands will be
780ce5c5d65SMauro Carvalho Chehab    *      queued on current host during eh.
781ce5c5d65SMauro Carvalho Chehab    *
782ce5c5d65SMauro Carvalho Chehab    *      Optionally defined in: LLD
783ce5c5d65SMauro Carvalho Chehab    **/
784ce5c5d65SMauro Carvalho Chehab	int eh_bus_reset_handler(struct scsi_cmnd * scp)
785ce5c5d65SMauro Carvalho Chehab
786ce5c5d65SMauro Carvalho Chehab
787ce5c5d65SMauro Carvalho Chehab    /**
788ce5c5d65SMauro Carvalho Chehab    *      eh_device_reset_handler - issue SCSI device reset
789ce5c5d65SMauro Carvalho Chehab    *      @scp: identifies SCSI device to be reset
790ce5c5d65SMauro Carvalho Chehab    *
791ce5c5d65SMauro Carvalho Chehab    *      Returns SUCCESS if command aborted else FAILED
792ce5c5d65SMauro Carvalho Chehab    *
793ce5c5d65SMauro Carvalho Chehab    *      Locks: None held
794ce5c5d65SMauro Carvalho Chehab    *
795ce5c5d65SMauro Carvalho Chehab    *      Calling context: kernel thread
796ce5c5d65SMauro Carvalho Chehab    *
797ce5c5d65SMauro Carvalho Chehab    *      Notes: Invoked from scsi_eh thread. No other commands will be
798ce5c5d65SMauro Carvalho Chehab    *      queued on current host during eh.
799ce5c5d65SMauro Carvalho Chehab    *
800ce5c5d65SMauro Carvalho Chehab    *      Optionally defined in: LLD
801ce5c5d65SMauro Carvalho Chehab    **/
802ce5c5d65SMauro Carvalho Chehab	int eh_device_reset_handler(struct scsi_cmnd * scp)
803ce5c5d65SMauro Carvalho Chehab
804ce5c5d65SMauro Carvalho Chehab
805ce5c5d65SMauro Carvalho Chehab    /**
806ce5c5d65SMauro Carvalho Chehab    *      eh_host_reset_handler - reset host (host bus adapter)
807ce5c5d65SMauro Carvalho Chehab    *      @scp: SCSI host that contains this device should be reset
808ce5c5d65SMauro Carvalho Chehab    *
809ce5c5d65SMauro Carvalho Chehab    *      Returns SUCCESS if command aborted else FAILED
810ce5c5d65SMauro Carvalho Chehab    *
811ce5c5d65SMauro Carvalho Chehab    *      Locks: None held
812ce5c5d65SMauro Carvalho Chehab    *
813ce5c5d65SMauro Carvalho Chehab    *      Calling context: kernel thread
814ce5c5d65SMauro Carvalho Chehab    *
815ce5c5d65SMauro Carvalho Chehab    *      Notes: Invoked from scsi_eh thread. No other commands will be
816ce5c5d65SMauro Carvalho Chehab    *      queued on current host during eh.
817ce5c5d65SMauro Carvalho Chehab    *      With the default eh_strategy in place, if none of the _abort_,
818ce5c5d65SMauro Carvalho Chehab    *      _device_reset_, _bus_reset_ or this eh handler function are
819ce5c5d65SMauro Carvalho Chehab    *      defined (or they all return FAILED) then the device in question
820ce5c5d65SMauro Carvalho Chehab    *      will be set offline whenever eh is invoked.
821ce5c5d65SMauro Carvalho Chehab    *
822ce5c5d65SMauro Carvalho Chehab    *      Optionally defined in: LLD
823ce5c5d65SMauro Carvalho Chehab    **/
824ce5c5d65SMauro Carvalho Chehab	int eh_host_reset_handler(struct scsi_cmnd * scp)
825ce5c5d65SMauro Carvalho Chehab
826ce5c5d65SMauro Carvalho Chehab
827ce5c5d65SMauro Carvalho Chehab    /**
828ce5c5d65SMauro Carvalho Chehab    *      info - supply information about given host: driver name plus data
829ce5c5d65SMauro Carvalho Chehab    *             to distinguish given host
830ce5c5d65SMauro Carvalho Chehab    *      @shp: host to supply information about
831ce5c5d65SMauro Carvalho Chehab    *
832ce5c5d65SMauro Carvalho Chehab    *      Return ASCII null terminated string. [This driver is assumed to
833ce5c5d65SMauro Carvalho Chehab    *      manage the memory pointed to and maintain it, typically for the
834ce5c5d65SMauro Carvalho Chehab    *      lifetime of this host.]
835ce5c5d65SMauro Carvalho Chehab    *
836ce5c5d65SMauro Carvalho Chehab    *      Locks: none
837ce5c5d65SMauro Carvalho Chehab    *
838ce5c5d65SMauro Carvalho Chehab    *      Calling context: process
839ce5c5d65SMauro Carvalho Chehab    *
840ce5c5d65SMauro Carvalho Chehab    *      Notes: Often supplies PCI or ISA information such as IO addresses
841ce5c5d65SMauro Carvalho Chehab    *      and interrupt numbers. If not supplied struct Scsi_Host::name used
842ce5c5d65SMauro Carvalho Chehab    *      instead. It is assumed the returned information fits on one line
843ce5c5d65SMauro Carvalho Chehab    *      (i.e. does not included embedded newlines).
844ce5c5d65SMauro Carvalho Chehab    *      The SCSI_IOCTL_PROBE_HOST ioctl yields the string returned by this
845ce5c5d65SMauro Carvalho Chehab    *      function (or struct Scsi_Host::name if this function is not
846ce5c5d65SMauro Carvalho Chehab    *      available).
847ce5c5d65SMauro Carvalho Chehab    *      In a similar manner, init_this_scsi_driver() outputs to the console
848ce5c5d65SMauro Carvalho Chehab    *      each host's "info" (or name) for the driver it is registering.
849ce5c5d65SMauro Carvalho Chehab    *      Also if proc_info() is not supplied, the output of this function
850ce5c5d65SMauro Carvalho Chehab    *      is used instead.
851ce5c5d65SMauro Carvalho Chehab    *
852ce5c5d65SMauro Carvalho Chehab    *      Optionally defined in: LLD
853ce5c5d65SMauro Carvalho Chehab    **/
854ce5c5d65SMauro Carvalho Chehab	const char * info(struct Scsi_Host * shp)
855ce5c5d65SMauro Carvalho Chehab
856ce5c5d65SMauro Carvalho Chehab
857ce5c5d65SMauro Carvalho Chehab    /**
858ce5c5d65SMauro Carvalho Chehab    *      ioctl - driver can respond to ioctls
859ce5c5d65SMauro Carvalho Chehab    *      @sdp: device that ioctl was issued for
860ce5c5d65SMauro Carvalho Chehab    *      @cmd: ioctl number
861ce5c5d65SMauro Carvalho Chehab    *      @arg: pointer to read or write data from. Since it points to
862ce5c5d65SMauro Carvalho Chehab    *            user space, should use appropriate kernel functions
863ce5c5d65SMauro Carvalho Chehab    *            (e.g. copy_from_user() ). In the Unix style this argument
864ce5c5d65SMauro Carvalho Chehab    *            can also be viewed as an unsigned long.
865ce5c5d65SMauro Carvalho Chehab    *
866ce5c5d65SMauro Carvalho Chehab    *      Returns negative "errno" value when there is a problem. 0 or a
867ce5c5d65SMauro Carvalho Chehab    *      positive value indicates success and is returned to the user space.
868ce5c5d65SMauro Carvalho Chehab    *
869ce5c5d65SMauro Carvalho Chehab    *      Locks: none
870ce5c5d65SMauro Carvalho Chehab    *
871ce5c5d65SMauro Carvalho Chehab    *      Calling context: process
872ce5c5d65SMauro Carvalho Chehab    *
873ce5c5d65SMauro Carvalho Chehab    *      Notes: The SCSI subsystem uses a "trickle down" ioctl model.
874ce5c5d65SMauro Carvalho Chehab    *      The user issues an ioctl() against an upper level driver
875ce5c5d65SMauro Carvalho Chehab    *      (e.g. /dev/sdc) and if the upper level driver doesn't recognize
876ce5c5d65SMauro Carvalho Chehab    *      the 'cmd' then it is passed to the SCSI mid level. If the SCSI
877ce5c5d65SMauro Carvalho Chehab    *      mid level does not recognize it, then the LLD that controls
878ce5c5d65SMauro Carvalho Chehab    *      the device receives the ioctl. According to recent Unix standards
879ce5c5d65SMauro Carvalho Chehab    *      unsupported ioctl() 'cmd' numbers should return -ENOTTY.
880ce5c5d65SMauro Carvalho Chehab    *
881ce5c5d65SMauro Carvalho Chehab    *      Optionally defined in: LLD
882ce5c5d65SMauro Carvalho Chehab    **/
883ce5c5d65SMauro Carvalho Chehab	int ioctl(struct scsi_device *sdp, int cmd, void *arg)
884ce5c5d65SMauro Carvalho Chehab
885ce5c5d65SMauro Carvalho Chehab
886ce5c5d65SMauro Carvalho Chehab    /**
887ce5c5d65SMauro Carvalho Chehab    *      proc_info - supports /proc/scsi/{driver_name}/{host_no}
888ce5c5d65SMauro Carvalho Chehab    *      @buffer: anchor point to output to (0==writeto1_read0) or fetch from
889ce5c5d65SMauro Carvalho Chehab    *               (1==writeto1_read0).
890ce5c5d65SMauro Carvalho Chehab    *      @start: where "interesting" data is written to. Ignored when
891ce5c5d65SMauro Carvalho Chehab    *              1==writeto1_read0.
892ce5c5d65SMauro Carvalho Chehab    *      @offset: offset within buffer 0==writeto1_read0 is actually
893ce5c5d65SMauro Carvalho Chehab    *               interested in. Ignored when 1==writeto1_read0 .
894ce5c5d65SMauro Carvalho Chehab    *      @length: maximum (or actual) extent of buffer
895ce5c5d65SMauro Carvalho Chehab    *      @host_no: host number of interest (struct Scsi_Host::host_no)
896ce5c5d65SMauro Carvalho Chehab    *      @writeto1_read0: 1 -> data coming from user space towards driver
897ce5c5d65SMauro Carvalho Chehab    *                            (e.g. "echo some_string > /proc/scsi/xyz/2")
898ce5c5d65SMauro Carvalho Chehab    *                       0 -> user what data from this driver
899ce5c5d65SMauro Carvalho Chehab    *                            (e.g. "cat /proc/scsi/xyz/2")
900ce5c5d65SMauro Carvalho Chehab    *
901ce5c5d65SMauro Carvalho Chehab    *      Returns length when 1==writeto1_read0. Otherwise number of chars
902ce5c5d65SMauro Carvalho Chehab    *      output to buffer past offset.
903ce5c5d65SMauro Carvalho Chehab    *
904ce5c5d65SMauro Carvalho Chehab    *      Locks: none held
905ce5c5d65SMauro Carvalho Chehab    *
906ce5c5d65SMauro Carvalho Chehab    *      Calling context: process
907ce5c5d65SMauro Carvalho Chehab    *
908ce5c5d65SMauro Carvalho Chehab    *      Notes: Driven from scsi_proc.c which interfaces to proc_fs. proc_fs
909ce5c5d65SMauro Carvalho Chehab    *      support can now be configured out of the scsi subsystem.
910ce5c5d65SMauro Carvalho Chehab    *
911ce5c5d65SMauro Carvalho Chehab    *      Optionally defined in: LLD
912ce5c5d65SMauro Carvalho Chehab    **/
913ce5c5d65SMauro Carvalho Chehab	int proc_info(char * buffer, char ** start, off_t offset,
914ce5c5d65SMauro Carvalho Chehab		    int length, int host_no, int writeto1_read0)
915ce5c5d65SMauro Carvalho Chehab
916ce5c5d65SMauro Carvalho Chehab
917ce5c5d65SMauro Carvalho Chehab    /**
918ce5c5d65SMauro Carvalho Chehab    *      queuecommand - queue scsi command, invoke scp->scsi_done on completion
919ce5c5d65SMauro Carvalho Chehab    *      @shost: pointer to the scsi host object
920ce5c5d65SMauro Carvalho Chehab    *      @scp: pointer to scsi command object
921ce5c5d65SMauro Carvalho Chehab    *
922ce5c5d65SMauro Carvalho Chehab    *      Returns 0 on success.
923ce5c5d65SMauro Carvalho Chehab    *
924ce5c5d65SMauro Carvalho Chehab    *      If there's a failure, return either:
925ce5c5d65SMauro Carvalho Chehab    *
926ce5c5d65SMauro Carvalho Chehab    *      SCSI_MLQUEUE_DEVICE_BUSY if the device queue is full, or
927ce5c5d65SMauro Carvalho Chehab    *      SCSI_MLQUEUE_HOST_BUSY if the entire host queue is full
928ce5c5d65SMauro Carvalho Chehab    *
929ce5c5d65SMauro Carvalho Chehab    *      On both of these returns, the mid-layer will requeue the I/O
930ce5c5d65SMauro Carvalho Chehab    *
931ce5c5d65SMauro Carvalho Chehab    *      - if the return is SCSI_MLQUEUE_DEVICE_BUSY, only that particular
932ce5c5d65SMauro Carvalho Chehab    *      device will be paused, and it will be unpaused when a command to
933ce5c5d65SMauro Carvalho Chehab    *      the device returns (or after a brief delay if there are no more
934ce5c5d65SMauro Carvalho Chehab    *      outstanding commands to it).  Commands to other devices continue
935ce5c5d65SMauro Carvalho Chehab    *      to be processed normally.
936ce5c5d65SMauro Carvalho Chehab    *
937ce5c5d65SMauro Carvalho Chehab    *      - if the return is SCSI_MLQUEUE_HOST_BUSY, all I/O to the host
938ce5c5d65SMauro Carvalho Chehab    *      is paused and will be unpaused when any command returns from
939ce5c5d65SMauro Carvalho Chehab    *      the host (or after a brief delay if there are no outstanding
940ce5c5d65SMauro Carvalho Chehab    *      commands to the host).
941ce5c5d65SMauro Carvalho Chehab    *
942ce5c5d65SMauro Carvalho Chehab    *      For compatibility with earlier versions of queuecommand, any
943ce5c5d65SMauro Carvalho Chehab    *      other return value is treated the same as
944ce5c5d65SMauro Carvalho Chehab    *      SCSI_MLQUEUE_HOST_BUSY.
945ce5c5d65SMauro Carvalho Chehab    *
946ce5c5d65SMauro Carvalho Chehab    *      Other types of errors that are detected immediately may be
947ce5c5d65SMauro Carvalho Chehab    *      flagged by setting scp->result to an appropriate value,
948ce5c5d65SMauro Carvalho Chehab    *      invoking the scp->scsi_done callback, and then returning 0
949ce5c5d65SMauro Carvalho Chehab    *      from this function. If the command is not performed
950ce5c5d65SMauro Carvalho Chehab    *      immediately (and the LLD is starting (or will start) the given
951ce5c5d65SMauro Carvalho Chehab    *      command) then this function should place 0 in scp->result and
952ce5c5d65SMauro Carvalho Chehab    *      return 0.
953ce5c5d65SMauro Carvalho Chehab    *
954ce5c5d65SMauro Carvalho Chehab    *      Command ownership.  If the driver returns zero, it owns the
955ce5c5d65SMauro Carvalho Chehab    *      command and must take responsibility for ensuring the
956ce5c5d65SMauro Carvalho Chehab    *      scp->scsi_done callback is executed.  Note: the driver may
957ce5c5d65SMauro Carvalho Chehab    *      call scp->scsi_done before returning zero, but after it has
958ce5c5d65SMauro Carvalho Chehab    *      called scp->scsi_done, it may not return any value other than
959ce5c5d65SMauro Carvalho Chehab    *      zero.  If the driver makes a non-zero return, it must not
960ce5c5d65SMauro Carvalho Chehab    *      execute the command's scsi_done callback at any time.
961ce5c5d65SMauro Carvalho Chehab    *
962ce5c5d65SMauro Carvalho Chehab    *      Locks: up to and including 2.6.36, struct Scsi_Host::host_lock
963ce5c5d65SMauro Carvalho Chehab    *             held on entry (with "irqsave") and is expected to be
964ce5c5d65SMauro Carvalho Chehab    *             held on return. From 2.6.37 onwards, queuecommand is
965ce5c5d65SMauro Carvalho Chehab    *             called without any locks held.
966ce5c5d65SMauro Carvalho Chehab    *
967ce5c5d65SMauro Carvalho Chehab    *      Calling context: in interrupt (soft irq) or process context
968ce5c5d65SMauro Carvalho Chehab    *
969ce5c5d65SMauro Carvalho Chehab    *      Notes: This function should be relatively fast. Normally it
970ce5c5d65SMauro Carvalho Chehab    *      will not wait for IO to complete. Hence the scp->scsi_done
971ce5c5d65SMauro Carvalho Chehab    *      callback is invoked (often directly from an interrupt service
972ce5c5d65SMauro Carvalho Chehab    *      routine) some time after this function has returned. In some
973ce5c5d65SMauro Carvalho Chehab    *      cases (e.g. pseudo adapter drivers that manufacture the
974ce5c5d65SMauro Carvalho Chehab    *      response to a SCSI INQUIRY) the scp->scsi_done callback may be
975ce5c5d65SMauro Carvalho Chehab    *      invoked before this function returns.  If the scp->scsi_done
976ce5c5d65SMauro Carvalho Chehab    *      callback is not invoked within a certain period the SCSI mid
977ce5c5d65SMauro Carvalho Chehab    *      level will commence error processing.  If a status of CHECK
978ce5c5d65SMauro Carvalho Chehab    *      CONDITION is placed in "result" when the scp->scsi_done
979ce5c5d65SMauro Carvalho Chehab    *      callback is invoked, then the LLD driver should perform
980ce5c5d65SMauro Carvalho Chehab    *      autosense and fill in the struct scsi_cmnd::sense_buffer
981ce5c5d65SMauro Carvalho Chehab    *      array. The scsi_cmnd::sense_buffer array is zeroed prior to
982ce5c5d65SMauro Carvalho Chehab    *      the mid level queuing a command to an LLD.
983ce5c5d65SMauro Carvalho Chehab    *
984ce5c5d65SMauro Carvalho Chehab    *      Defined in: LLD
985ce5c5d65SMauro Carvalho Chehab    **/
986ce5c5d65SMauro Carvalho Chehab	int queuecommand(struct Scsi_Host *shost, struct scsi_cmnd * scp)
987ce5c5d65SMauro Carvalho Chehab
988ce5c5d65SMauro Carvalho Chehab
989ce5c5d65SMauro Carvalho Chehab    /**
990ce5c5d65SMauro Carvalho Chehab    *      slave_alloc -   prior to any commands being sent to a new device
991ce5c5d65SMauro Carvalho Chehab    *                      (i.e. just prior to scan) this call is made
992ce5c5d65SMauro Carvalho Chehab    *      @sdp: pointer to new device (about to be scanned)
993ce5c5d65SMauro Carvalho Chehab    *
994ce5c5d65SMauro Carvalho Chehab    *      Returns 0 if ok. Any other return is assumed to be an error and
995ce5c5d65SMauro Carvalho Chehab    *      the device is ignored.
996ce5c5d65SMauro Carvalho Chehab    *
997ce5c5d65SMauro Carvalho Chehab    *      Locks: none
998ce5c5d65SMauro Carvalho Chehab    *
999ce5c5d65SMauro Carvalho Chehab    *      Calling context: process
1000ce5c5d65SMauro Carvalho Chehab    *
1001ce5c5d65SMauro Carvalho Chehab    *      Notes: Allows the driver to allocate any resources for a device
1002ce5c5d65SMauro Carvalho Chehab    *      prior to its initial scan. The corresponding scsi device may not
1003ce5c5d65SMauro Carvalho Chehab    *      exist but the mid level is just about to scan for it (i.e. send
1004ce5c5d65SMauro Carvalho Chehab    *      and INQUIRY command plus ...). If a device is found then
1005ce5c5d65SMauro Carvalho Chehab    *      slave_configure() will be called while if a device is not found
1006ce5c5d65SMauro Carvalho Chehab    *      slave_destroy() is called.
1007ce5c5d65SMauro Carvalho Chehab    *      For more details see the include/scsi/scsi_host.h file.
1008ce5c5d65SMauro Carvalho Chehab    *
1009ce5c5d65SMauro Carvalho Chehab    *      Optionally defined in: LLD
1010ce5c5d65SMauro Carvalho Chehab    **/
1011ce5c5d65SMauro Carvalho Chehab	int slave_alloc(struct scsi_device *sdp)
1012ce5c5d65SMauro Carvalho Chehab
1013ce5c5d65SMauro Carvalho Chehab
1014ce5c5d65SMauro Carvalho Chehab    /**
1015ce5c5d65SMauro Carvalho Chehab    *      slave_configure - driver fine tuning for given device just after it
1016ce5c5d65SMauro Carvalho Chehab    *                     has been first scanned (i.e. it responded to an
1017ce5c5d65SMauro Carvalho Chehab    *                     INQUIRY)
1018ce5c5d65SMauro Carvalho Chehab    *      @sdp: device that has just been attached
1019ce5c5d65SMauro Carvalho Chehab    *
1020ce5c5d65SMauro Carvalho Chehab    *      Returns 0 if ok. Any other return is assumed to be an error and
1021ce5c5d65SMauro Carvalho Chehab    *      the device is taken offline. [offline devices will _not_ have
1022ce5c5d65SMauro Carvalho Chehab    *      slave_destroy() called on them so clean up resources.]
1023ce5c5d65SMauro Carvalho Chehab    *
1024ce5c5d65SMauro Carvalho Chehab    *      Locks: none
1025ce5c5d65SMauro Carvalho Chehab    *
1026ce5c5d65SMauro Carvalho Chehab    *      Calling context: process
1027ce5c5d65SMauro Carvalho Chehab    *
1028ce5c5d65SMauro Carvalho Chehab    *      Notes: Allows the driver to inspect the response to the initial
1029ce5c5d65SMauro Carvalho Chehab    *      INQUIRY done by the scanning code and take appropriate action.
1030ce5c5d65SMauro Carvalho Chehab    *      For more details see the include/scsi/scsi_host.h file.
1031ce5c5d65SMauro Carvalho Chehab    *
1032ce5c5d65SMauro Carvalho Chehab    *      Optionally defined in: LLD
1033ce5c5d65SMauro Carvalho Chehab    **/
1034ce5c5d65SMauro Carvalho Chehab	int slave_configure(struct scsi_device *sdp)
1035ce5c5d65SMauro Carvalho Chehab
1036ce5c5d65SMauro Carvalho Chehab
1037ce5c5d65SMauro Carvalho Chehab    /**
1038ce5c5d65SMauro Carvalho Chehab    *      slave_destroy - given device is about to be shut down. All
1039ce5c5d65SMauro Carvalho Chehab    *                      activity has ceased on this device.
1040ce5c5d65SMauro Carvalho Chehab    *      @sdp: device that is about to be shut down
1041ce5c5d65SMauro Carvalho Chehab    *
1042ce5c5d65SMauro Carvalho Chehab    *      Returns nothing
1043ce5c5d65SMauro Carvalho Chehab    *
1044ce5c5d65SMauro Carvalho Chehab    *      Locks: none
1045ce5c5d65SMauro Carvalho Chehab    *
1046ce5c5d65SMauro Carvalho Chehab    *      Calling context: process
1047ce5c5d65SMauro Carvalho Chehab    *
1048ce5c5d65SMauro Carvalho Chehab    *      Notes: Mid level structures for given device are still in place
1049ce5c5d65SMauro Carvalho Chehab    *      but are about to be torn down. Any per device resources allocated
1050ce5c5d65SMauro Carvalho Chehab    *      by this driver for given device should be freed now. No further
1051ce5c5d65SMauro Carvalho Chehab    *      commands will be sent for this sdp instance. [However the device
1052ce5c5d65SMauro Carvalho Chehab    *      could be re-attached in the future in which case a new instance
1053ce5c5d65SMauro Carvalho Chehab    *      of struct scsi_device would be supplied by future slave_alloc()
1054ce5c5d65SMauro Carvalho Chehab    *      and slave_configure() calls.]
1055ce5c5d65SMauro Carvalho Chehab    *
1056ce5c5d65SMauro Carvalho Chehab    *      Optionally defined in: LLD
1057ce5c5d65SMauro Carvalho Chehab    **/
1058ce5c5d65SMauro Carvalho Chehab	void slave_destroy(struct scsi_device *sdp)
1059ce5c5d65SMauro Carvalho Chehab
1060ce5c5d65SMauro Carvalho Chehab
1061ce5c5d65SMauro Carvalho Chehab
1062ce5c5d65SMauro Carvalho ChehabData Structures
1063ce5c5d65SMauro Carvalho Chehab===============
1064ce5c5d65SMauro Carvalho Chehabstruct scsi_host_template
1065ce5c5d65SMauro Carvalho Chehab-------------------------
1066ce5c5d65SMauro Carvalho ChehabThere is one "struct scsi_host_template" instance per LLD [#]_. It is
1067ce5c5d65SMauro Carvalho Chehabtypically initialized as a file scope static in a driver's header file. That
1068ce5c5d65SMauro Carvalho Chehabway members that are not explicitly initialized will be set to 0 or NULL.
1069ce5c5d65SMauro Carvalho ChehabMember of interest:
1070ce5c5d65SMauro Carvalho Chehab
1071ce5c5d65SMauro Carvalho Chehab    name
1072ce5c5d65SMauro Carvalho Chehab		 - name of driver (may contain spaces, please limit to
1073ce5c5d65SMauro Carvalho Chehab                   less than 80 characters)
1074ce5c5d65SMauro Carvalho Chehab
1075ce5c5d65SMauro Carvalho Chehab    proc_name
1076ce5c5d65SMauro Carvalho Chehab		 - name used in "/proc/scsi/<proc_name>/<host_no>" and
1077ce5c5d65SMauro Carvalho Chehab                   by sysfs in one of its "drivers" directories. Hence
1078ce5c5d65SMauro Carvalho Chehab                   "proc_name" should only contain characters acceptable
1079ce5c5d65SMauro Carvalho Chehab                   to a Unix file name.
1080ce5c5d65SMauro Carvalho Chehab
1081ce5c5d65SMauro Carvalho Chehab   ``(*queuecommand)()``
1082ce5c5d65SMauro Carvalho Chehab		 - primary callback that the mid level uses to inject
1083ce5c5d65SMauro Carvalho Chehab                   SCSI commands into an LLD.
1084ce5c5d65SMauro Carvalho Chehab
1085ce5c5d65SMauro Carvalho ChehabThe structure is defined and commented in include/scsi/scsi_host.h
1086ce5c5d65SMauro Carvalho Chehab
1087ce5c5d65SMauro Carvalho Chehab.. [#] In extreme situations a single driver may have several instances
1088ce5c5d65SMauro Carvalho Chehab       if it controls several different classes of hardware (e.g. an LLD
1089ce5c5d65SMauro Carvalho Chehab       that handles both ISA and PCI cards and has a separate instance of
1090ce5c5d65SMauro Carvalho Chehab       struct scsi_host_template for each class).
1091ce5c5d65SMauro Carvalho Chehab
1092ce5c5d65SMauro Carvalho Chehabstruct Scsi_Host
1093ce5c5d65SMauro Carvalho Chehab----------------
1094ce5c5d65SMauro Carvalho ChehabThere is one struct Scsi_Host instance per host (HBA) that an LLD
1095ce5c5d65SMauro Carvalho Chehabcontrols. The struct Scsi_Host structure has many members in common
1096ce5c5d65SMauro Carvalho Chehabwith "struct scsi_host_template". When a new struct Scsi_Host instance
1097ce5c5d65SMauro Carvalho Chehabis created (in scsi_host_alloc() in hosts.c) those common members are
1098ce5c5d65SMauro Carvalho Chehabinitialized from the driver's struct scsi_host_template instance. Members
1099ce5c5d65SMauro Carvalho Chehabof interest:
1100ce5c5d65SMauro Carvalho Chehab
1101ce5c5d65SMauro Carvalho Chehab    host_no
1102ce5c5d65SMauro Carvalho Chehab		 - system wide unique number that is used for identifying
1103ce5c5d65SMauro Carvalho Chehab                   this host. Issued in ascending order from 0.
1104ce5c5d65SMauro Carvalho Chehab    can_queue
1105ce5c5d65SMauro Carvalho Chehab		 - must be greater than 0; do not send more than can_queue
1106ce5c5d65SMauro Carvalho Chehab                   commands to the adapter.
1107ce5c5d65SMauro Carvalho Chehab    this_id
1108ce5c5d65SMauro Carvalho Chehab		 - scsi id of host (scsi initiator) or -1 if not known
1109ce5c5d65SMauro Carvalho Chehab    sg_tablesize
1110ce5c5d65SMauro Carvalho Chehab		 - maximum scatter gather elements allowed by host.
1111ce5c5d65SMauro Carvalho Chehab                   Set this to SG_ALL or less to avoid chained SG lists.
1112ce5c5d65SMauro Carvalho Chehab                   Must be at least 1.
1113ce5c5d65SMauro Carvalho Chehab    max_sectors
1114ce5c5d65SMauro Carvalho Chehab		 - maximum number of sectors (usually 512 bytes) allowed
1115ce5c5d65SMauro Carvalho Chehab                   in a single SCSI command. The default value of 0 leads
1116ce5c5d65SMauro Carvalho Chehab                   to a setting of SCSI_DEFAULT_MAX_SECTORS (defined in
1117ce5c5d65SMauro Carvalho Chehab                   scsi_host.h) which is currently set to 1024. So for a
1118ce5c5d65SMauro Carvalho Chehab                   disk the maximum transfer size is 512 KB when max_sectors
1119ce5c5d65SMauro Carvalho Chehab                   is not defined. Note that this size may not be sufficient
1120ce5c5d65SMauro Carvalho Chehab                   for disk firmware uploads.
1121ce5c5d65SMauro Carvalho Chehab    cmd_per_lun
1122ce5c5d65SMauro Carvalho Chehab		 - maximum number of commands that can be queued on devices
1123ce5c5d65SMauro Carvalho Chehab                   controlled by the host. Overridden by LLD calls to
1124ce5c5d65SMauro Carvalho Chehab                   scsi_change_queue_depth().
1125ce5c5d65SMauro Carvalho Chehab    unchecked_isa_dma
1126ce5c5d65SMauro Carvalho Chehab		 - 1=>only use bottom 16 MB of ram (ISA DMA addressing
1127ce5c5d65SMauro Carvalho Chehab                   restriction), 0=>can use full 32 bit (or better) DMA
1128ce5c5d65SMauro Carvalho Chehab                   address space
1129ce5c5d65SMauro Carvalho Chehab    no_async_abort
1130ce5c5d65SMauro Carvalho Chehab		 - 1=>Asynchronous aborts are not supported
1131ce5c5d65SMauro Carvalho Chehab		 - 0=>Timed-out commands will be aborted asynchronously
1132ce5c5d65SMauro Carvalho Chehab    hostt
1133ce5c5d65SMauro Carvalho Chehab		 - pointer to driver's struct scsi_host_template from which
1134ce5c5d65SMauro Carvalho Chehab                   this struct Scsi_Host instance was spawned
1135ce5c5d65SMauro Carvalho Chehab    hostt->proc_name
1136ce5c5d65SMauro Carvalho Chehab		 - name of LLD. This is the driver name that sysfs uses
1137ce5c5d65SMauro Carvalho Chehab    transportt
1138ce5c5d65SMauro Carvalho Chehab		 - pointer to driver's struct scsi_transport_template instance
1139ce5c5d65SMauro Carvalho Chehab                   (if any). FC and SPI transports currently supported.
1140ce5c5d65SMauro Carvalho Chehab    sh_list
1141ce5c5d65SMauro Carvalho Chehab		 - a double linked list of pointers to all struct Scsi_Host
1142ce5c5d65SMauro Carvalho Chehab                   instances (currently ordered by ascending host_no)
1143ce5c5d65SMauro Carvalho Chehab    my_devices
1144ce5c5d65SMauro Carvalho Chehab		 - a double linked list of pointers to struct scsi_device
1145ce5c5d65SMauro Carvalho Chehab                   instances that belong to this host.
1146ce5c5d65SMauro Carvalho Chehab    hostdata[0]
1147ce5c5d65SMauro Carvalho Chehab		 - area reserved for LLD at end of struct Scsi_Host. Size
1148ce5c5d65SMauro Carvalho Chehab                   is set by the second argument (named 'xtr_bytes') to
1149ce5c5d65SMauro Carvalho Chehab                   scsi_host_alloc() or scsi_register().
1150ce5c5d65SMauro Carvalho Chehab    vendor_id
1151ce5c5d65SMauro Carvalho Chehab		 - a unique value that identifies the vendor supplying
1152ce5c5d65SMauro Carvalho Chehab                   the LLD for the Scsi_Host.  Used most often in validating
1153ce5c5d65SMauro Carvalho Chehab                   vendor-specific message requests.  Value consists of an
1154ce5c5d65SMauro Carvalho Chehab                   identifier type and a vendor-specific value.
1155ce5c5d65SMauro Carvalho Chehab                   See scsi_netlink.h for a description of valid formats.
1156ce5c5d65SMauro Carvalho Chehab
1157ce5c5d65SMauro Carvalho ChehabThe scsi_host structure is defined in include/scsi/scsi_host.h
1158ce5c5d65SMauro Carvalho Chehab
1159ce5c5d65SMauro Carvalho Chehabstruct scsi_device
1160ce5c5d65SMauro Carvalho Chehab------------------
1161ce5c5d65SMauro Carvalho ChehabGenerally, there is one instance of this structure for each SCSI logical unit
1162ce5c5d65SMauro Carvalho Chehabon a host. Scsi devices connected to a host are uniquely identified by a
1163ce5c5d65SMauro Carvalho Chehabchannel number, target id and logical unit number (lun).
1164ce5c5d65SMauro Carvalho ChehabThe structure is defined in include/scsi/scsi_device.h
1165ce5c5d65SMauro Carvalho Chehab
1166ce5c5d65SMauro Carvalho Chehabstruct scsi_cmnd
1167ce5c5d65SMauro Carvalho Chehab----------------
1168ce5c5d65SMauro Carvalho ChehabInstances of this structure convey SCSI commands to the LLD and responses
1169ce5c5d65SMauro Carvalho Chehabback to the mid level. The SCSI mid level will ensure that no more SCSI
1170ce5c5d65SMauro Carvalho Chehabcommands become queued against the LLD than are indicated by
1171ce5c5d65SMauro Carvalho Chehabscsi_change_queue_depth() (or struct Scsi_Host::cmd_per_lun). There will
1172ce5c5d65SMauro Carvalho Chehabbe at least one instance of struct scsi_cmnd available for each SCSI device.
1173ce5c5d65SMauro Carvalho ChehabMembers of interest:
1174ce5c5d65SMauro Carvalho Chehab
1175ce5c5d65SMauro Carvalho Chehab    cmnd
1176ce5c5d65SMauro Carvalho Chehab		 - array containing SCSI command
1177ce5c5d65SMauro Carvalho Chehab    cmnd_len
1178ce5c5d65SMauro Carvalho Chehab		 - length (in bytes) of SCSI command
1179ce5c5d65SMauro Carvalho Chehab    sc_data_direction
1180ce5c5d65SMauro Carvalho Chehab		 - direction of data transfer in data phase. See
1181ce5c5d65SMauro Carvalho Chehab                   "enum dma_data_direction" in include/linux/dma-mapping.h
1182ce5c5d65SMauro Carvalho Chehab    request_bufflen
1183ce5c5d65SMauro Carvalho Chehab		 - number of data bytes to transfer (0 if no data phase)
1184ce5c5d65SMauro Carvalho Chehab    use_sg
1185ce5c5d65SMauro Carvalho Chehab		 - ==0 -> no scatter gather list, hence transfer data
1186ce5c5d65SMauro Carvalho Chehab                          to/from request_buffer
1187ce5c5d65SMauro Carvalho Chehab                 - >0 ->  scatter gather list (actually an array) in
1188ce5c5d65SMauro Carvalho Chehab                          request_buffer with use_sg elements
1189ce5c5d65SMauro Carvalho Chehab    request_buffer
1190ce5c5d65SMauro Carvalho Chehab		   - either contains data buffer or scatter gather list
1191ce5c5d65SMauro Carvalho Chehab                     depending on the setting of use_sg. Scatter gather
1192ce5c5d65SMauro Carvalho Chehab                     elements are defined by 'struct scatterlist' found
1193ce5c5d65SMauro Carvalho Chehab                     in include/linux/scatterlist.h .
1194ce5c5d65SMauro Carvalho Chehab    done
1195ce5c5d65SMauro Carvalho Chehab		 - function pointer that should be invoked by LLD when the
1196ce5c5d65SMauro Carvalho Chehab                   SCSI command is completed (successfully or otherwise).
1197ce5c5d65SMauro Carvalho Chehab                   Should only be called by an LLD if the LLD has accepted
1198ce5c5d65SMauro Carvalho Chehab                   the command (i.e. queuecommand() returned or will return
1199ce5c5d65SMauro Carvalho Chehab                   0). The LLD may invoke 'done'  prior to queuecommand()
1200ce5c5d65SMauro Carvalho Chehab                   finishing.
1201ce5c5d65SMauro Carvalho Chehab    result
1202ce5c5d65SMauro Carvalho Chehab		 - should be set by LLD prior to calling 'done'. A value
1203ce5c5d65SMauro Carvalho Chehab                   of 0 implies a successfully completed command (and all
1204ce5c5d65SMauro Carvalho Chehab                   data (if any) has been transferred to or from the SCSI
1205ce5c5d65SMauro Carvalho Chehab                   target device). 'result' is a 32 bit unsigned integer that
1206ce5c5d65SMauro Carvalho Chehab                   can be viewed as 4 related bytes. The SCSI status value is
1207ce5c5d65SMauro Carvalho Chehab                   in the LSB. See include/scsi/scsi.h status_byte(),
1208ce5c5d65SMauro Carvalho Chehab                   msg_byte(), host_byte() and driver_byte() macros and
1209ce5c5d65SMauro Carvalho Chehab                   related constants.
1210ce5c5d65SMauro Carvalho Chehab    sense_buffer
1211ce5c5d65SMauro Carvalho Chehab		 - an array (maximum size: SCSI_SENSE_BUFFERSIZE bytes) that
1212ce5c5d65SMauro Carvalho Chehab                   should be written when the SCSI status (LSB of 'result')
1213ce5c5d65SMauro Carvalho Chehab                   is set to CHECK_CONDITION (2). When CHECK_CONDITION is
1214ce5c5d65SMauro Carvalho Chehab                   set, if the top nibble of sense_buffer[0] has the value 7
1215ce5c5d65SMauro Carvalho Chehab                   then the mid level will assume the sense_buffer array
1216ce5c5d65SMauro Carvalho Chehab                   contains a valid SCSI sense buffer; otherwise the mid
1217ce5c5d65SMauro Carvalho Chehab                   level will issue a REQUEST_SENSE SCSI command to
1218ce5c5d65SMauro Carvalho Chehab                   retrieve the sense buffer. The latter strategy is error
1219ce5c5d65SMauro Carvalho Chehab                   prone in the presence of command queuing so the LLD should
1220ce5c5d65SMauro Carvalho Chehab                   always "auto-sense".
1221ce5c5d65SMauro Carvalho Chehab    device
1222ce5c5d65SMauro Carvalho Chehab		 - pointer to scsi_device object that this command is
1223ce5c5d65SMauro Carvalho Chehab                   associated with.
1224ce5c5d65SMauro Carvalho Chehab    resid
1225ce5c5d65SMauro Carvalho Chehab		 - an LLD should set this signed integer to the requested
1226ce5c5d65SMauro Carvalho Chehab                   transfer length (i.e. 'request_bufflen') less the number
1227ce5c5d65SMauro Carvalho Chehab                   of bytes that are actually transferred. 'resid' is
1228ce5c5d65SMauro Carvalho Chehab                   preset to 0 so an LLD can ignore it if it cannot detect
1229ce5c5d65SMauro Carvalho Chehab                   underruns (overruns should be rare). If possible an LLD
1230ce5c5d65SMauro Carvalho Chehab                   should set 'resid' prior to invoking 'done'. The most
1231ce5c5d65SMauro Carvalho Chehab                   interesting case is data transfers from a SCSI target
1232ce5c5d65SMauro Carvalho Chehab                   device (e.g. READs) that underrun.
1233ce5c5d65SMauro Carvalho Chehab    underflow
1234ce5c5d65SMauro Carvalho Chehab		 - LLD should place (DID_ERROR << 16) in 'result' if
1235ce5c5d65SMauro Carvalho Chehab                   actual number of bytes transferred is less than this
1236ce5c5d65SMauro Carvalho Chehab                   figure. Not many LLDs implement this check and some that
1237ce5c5d65SMauro Carvalho Chehab                   do just output an error message to the log rather than
1238ce5c5d65SMauro Carvalho Chehab                   report a DID_ERROR. Better for an LLD to implement
1239ce5c5d65SMauro Carvalho Chehab                   'resid'.
1240ce5c5d65SMauro Carvalho Chehab
1241ce5c5d65SMauro Carvalho ChehabIt is recommended that a LLD set 'resid' on data transfers from a SCSI
1242ce5c5d65SMauro Carvalho Chehabtarget device (e.g. READs). It is especially important that 'resid' is set
1243ce5c5d65SMauro Carvalho Chehabwhen such data transfers have sense keys of MEDIUM ERROR and HARDWARE ERROR
1244ce5c5d65SMauro Carvalho Chehab(and possibly RECOVERED ERROR). In these cases if a LLD is in doubt how much
1245ce5c5d65SMauro Carvalho Chehabdata has been received then the safest approach is to indicate no bytes have
1246ce5c5d65SMauro Carvalho Chehabbeen received. For example: to indicate that no valid data has been received
1247ce5c5d65SMauro Carvalho Chehaba LLD might use these helpers::
1248ce5c5d65SMauro Carvalho Chehab
1249ce5c5d65SMauro Carvalho Chehab    scsi_set_resid(SCpnt, scsi_bufflen(SCpnt));
1250ce5c5d65SMauro Carvalho Chehab
1251ce5c5d65SMauro Carvalho Chehabwhere 'SCpnt' is a pointer to a scsi_cmnd object. To indicate only three 512
1252ce5c5d65SMauro Carvalho Chehabbytes blocks has been received 'resid' could be set like this::
1253ce5c5d65SMauro Carvalho Chehab
1254ce5c5d65SMauro Carvalho Chehab    scsi_set_resid(SCpnt, scsi_bufflen(SCpnt) - (3 * 512));
1255ce5c5d65SMauro Carvalho Chehab
1256ce5c5d65SMauro Carvalho ChehabThe scsi_cmnd structure is defined in include/scsi/scsi_cmnd.h
1257ce5c5d65SMauro Carvalho Chehab
1258ce5c5d65SMauro Carvalho Chehab
1259ce5c5d65SMauro Carvalho ChehabLocks
1260ce5c5d65SMauro Carvalho Chehab=====
1261ce5c5d65SMauro Carvalho ChehabEach struct Scsi_Host instance has a spin_lock called struct
1262ce5c5d65SMauro Carvalho ChehabScsi_Host::default_lock which is initialized in scsi_host_alloc() [found in
1263ce5c5d65SMauro Carvalho Chehabhosts.c]. Within the same function the struct Scsi_Host::host_lock pointer
1264ce5c5d65SMauro Carvalho Chehabis initialized to point at default_lock.  Thereafter lock and unlock
1265ce5c5d65SMauro Carvalho Chehaboperations performed by the mid level use the struct Scsi_Host::host_lock
1266ce5c5d65SMauro Carvalho Chehabpointer.  Previously drivers could override the host_lock pointer but
1267ce5c5d65SMauro Carvalho Chehabthis is not allowed anymore.
1268ce5c5d65SMauro Carvalho Chehab
1269ce5c5d65SMauro Carvalho Chehab
1270ce5c5d65SMauro Carvalho ChehabAutosense
1271ce5c5d65SMauro Carvalho Chehab=========
1272ce5c5d65SMauro Carvalho ChehabAutosense (or auto-sense) is defined in the SAM-2 document as "the
1273ce5c5d65SMauro Carvalho Chehabautomatic return of sense data to the application client coincident
1274ce5c5d65SMauro Carvalho Chehabwith the completion of a SCSI command" when a status of CHECK CONDITION
1275ce5c5d65SMauro Carvalho Chehaboccurs. LLDs should perform autosense. This should be done when the LLD
1276ce5c5d65SMauro Carvalho Chehabdetects a CHECK CONDITION status by either:
1277ce5c5d65SMauro Carvalho Chehab
1278ce5c5d65SMauro Carvalho Chehab    a) instructing the SCSI protocol (e.g. SCSI Parallel Interface (SPI))
1279ce5c5d65SMauro Carvalho Chehab       to perform an extra data in phase on such responses
1280ce5c5d65SMauro Carvalho Chehab    b) or, the LLD issuing a REQUEST SENSE command itself
1281ce5c5d65SMauro Carvalho Chehab
1282ce5c5d65SMauro Carvalho ChehabEither way, when a status of CHECK CONDITION is detected, the mid level
1283ce5c5d65SMauro Carvalho Chehabdecides whether the LLD has performed autosense by checking struct
1284ce5c5d65SMauro Carvalho Chehabscsi_cmnd::sense_buffer[0] . If this byte has an upper nibble of 7 (or 0xf)
1285ce5c5d65SMauro Carvalho Chehabthen autosense is assumed to have taken place. If it has another value (and
1286ce5c5d65SMauro Carvalho Chehabthis byte is initialized to 0 before each command) then the mid level will
1287ce5c5d65SMauro Carvalho Chehabissue a REQUEST SENSE command.
1288ce5c5d65SMauro Carvalho Chehab
1289ce5c5d65SMauro Carvalho ChehabIn the presence of queued commands the "nexus" that maintains sense
1290ce5c5d65SMauro Carvalho Chehabbuffer data from the command that failed until a following REQUEST SENSE
1291ce5c5d65SMauro Carvalho Chehabmay get out of synchronization. This is why it is best for the LLD
1292ce5c5d65SMauro Carvalho Chehabto perform autosense.
1293ce5c5d65SMauro Carvalho Chehab
1294ce5c5d65SMauro Carvalho Chehab
1295ce5c5d65SMauro Carvalho ChehabChanges since lk 2.4 series
1296ce5c5d65SMauro Carvalho Chehab===========================
1297ce5c5d65SMauro Carvalho Chehabio_request_lock has been replaced by several finer grained locks. The lock
1298ce5c5d65SMauro Carvalho Chehabrelevant to LLDs is struct Scsi_Host::host_lock and there is
1299ce5c5d65SMauro Carvalho Chehabone per SCSI host.
1300ce5c5d65SMauro Carvalho Chehab
1301ce5c5d65SMauro Carvalho ChehabThe older error handling mechanism has been removed. This means the
1302ce5c5d65SMauro Carvalho ChehabLLD interface functions abort() and reset() have been removed.
1303ce5c5d65SMauro Carvalho ChehabThe struct scsi_host_template::use_new_eh_code flag has been removed.
1304ce5c5d65SMauro Carvalho Chehab
1305ce5c5d65SMauro Carvalho ChehabIn the 2.4 series the SCSI subsystem configuration descriptions were
1306ce5c5d65SMauro Carvalho Chehabaggregated with the configuration descriptions from all other Linux
1307ce5c5d65SMauro Carvalho Chehabsubsystems in the Documentation/Configure.help file. In the 2.6 series,
1308ce5c5d65SMauro Carvalho Chehabthe SCSI subsystem now has its own (much smaller) drivers/scsi/Kconfig
1309ce5c5d65SMauro Carvalho Chehabfile that contains both configuration and help information.
1310ce5c5d65SMauro Carvalho Chehab
1311ce5c5d65SMauro Carvalho Chehabstruct SHT has been renamed to struct scsi_host_template.
1312ce5c5d65SMauro Carvalho Chehab
1313ce5c5d65SMauro Carvalho ChehabAddition of the "hotplug initialization model" and many extra functions
1314ce5c5d65SMauro Carvalho Chehabto support it.
1315ce5c5d65SMauro Carvalho Chehab
1316ce5c5d65SMauro Carvalho Chehab
1317ce5c5d65SMauro Carvalho ChehabCredits
1318ce5c5d65SMauro Carvalho Chehab=======
1319ce5c5d65SMauro Carvalho ChehabThe following people have contributed to this document:
1320ce5c5d65SMauro Carvalho Chehab
1321ce5c5d65SMauro Carvalho Chehab	- Mike Anderson <andmike at us dot ibm dot com>
1322ce5c5d65SMauro Carvalho Chehab	- James Bottomley <James dot Bottomley at hansenpartnership dot com>
1323ce5c5d65SMauro Carvalho Chehab	- Patrick Mansfield <patmans at us dot ibm dot com>
1324ce5c5d65SMauro Carvalho Chehab	- Christoph Hellwig <hch at infradead dot org>
1325ce5c5d65SMauro Carvalho Chehab	- Doug Ledford <dledford at redhat dot com>
1326ce5c5d65SMauro Carvalho Chehab	- Andries Brouwer <Andries dot Brouwer at cwi dot nl>
1327ce5c5d65SMauro Carvalho Chehab	- Randy Dunlap <rdunlap at xenotime dot net>
1328ce5c5d65SMauro Carvalho Chehab	- Alan Stern <stern at rowland dot harvard dot edu>
1329ce5c5d65SMauro Carvalho Chehab
1330ce5c5d65SMauro Carvalho Chehab
1331ce5c5d65SMauro Carvalho ChehabDouglas Gilbert
1332ce5c5d65SMauro Carvalho Chehabdgilbert at interlog dot com
1333ce5c5d65SMauro Carvalho Chehab
1334ce5c5d65SMauro Carvalho Chehab21st September 2004
1335