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