The sg driver permits user applications to send SCSI commands to devices that understand them. SCSI commands are 6, 10, 12 or 16 bytes long [1]. The SCSI disk driver (sd), once device initialization is complete, only sends SCSI READ and WRITE commands. There a several other interesting things one might want to do, for example, perform a low level format or turn on write caching.
Associated with some SCSI commands there is data to be written to the device. A SCSI WRITE command is one obvious example. When instructed, the sg driver arranges for data to be transferred to the device along with the SCSI command. It is possible that the lower level driver (often known as the "Host Bus Adapter" [HBA] or simply "adapter" driver) is unable to send the command to the device. An example of this occurs when the device does not respond in which case a 'host_status' or 'driver-status' error will be conveyed back to the user application.
All going well the SCSI command (and optionally some data) are conveyed to the device. The device will respond with a single byte value called the 'scsi_status'. GOOD is the scsi status indicating everything has gone well. The most common other status is CHECK CONDITION. In this latter case, the SCSI mid level issues a REQUEST SENSE SCSI command The response of the REQUEST SENSE is 18 bytes or more in length and is called the "sense buffer" [2] . It will indicate why the original command may not have been executed. It is important to realize that a CHECK CONDITION may vary in severity from informative (e.g. command needed to be retried before succeeding) to fatal (e.g. "medium error" which often indicates it is time to replace a disk).
So in all cases a user application should check the various status values. If necessary the "sense buffer" will be copied back to the user application. SCSI commands like READ convey data back to the user application (if they succeed). The sg driver arranges for this data transfer from the device to the user space, if necessary.
The description so far has concentrated on a disk device, but in reality the sg driver is not needed very often for disks because there already is a purpose built device driver for that: sd. The same is true of reading audio and data CDs (sr [scd]) and tapes (st). However scanners that understand the SCSI command set and CDR "burning" programs tend to use the sg driver. Other applications include tape "robots" and music CD "ripping".
To find out more about SCSI (draft) standards and resources visit
www.t10.org
.
To use the sg device driver you should be familiar with the
SCSI commands supported by the device that you wish to control.
Getting hold of such information for devices like scanners can be
quite challenging (if the vendor does not provide it).
The first SCSI command sent to a SCSI device when it is initialized is an INQUIRY. All SCSI devices should respond promptly to an INQUIRY supplying information such as the vendor, product designation and revision. Appendix C, Programming example shows the sg driver being used to send an INQUIRY and print out some of the information in the response.
[1] SCSI command opcode 0x7f does allow for variable length commands but that is not supported in Linux currently.
[2] More recent HBA drivers can do REQUEST SENSE themselves (rather than the mid level) when a CHECK CONDITION status occurs. HBA drivers may use a recent SCSI feature called autosense rather than issuing a REQUEST SENSE. Autosense involves an extra data in phase containing the sense buffer being sent back to the initiator when a CHECK CONDITION status occurs (so no following REQUEST SENSE command is needed). Whichever mechanism is used is transparent to the sg driver.