Differences between current version and previous revision of HowToSCSIProgrammingHOWTO.
Other diffs: Previous Major Revision, Previous Author, or view the Annotated Edit History
Newer page: | version 3 | Last edited on Tuesday, October 26, 2004 4:58:02 pm | by AristotlePagaltzis | |
Older page: | version 2 | Last edited on Friday, June 7, 2002 1:07:27 am | by perry | Revert |
@@ -1,3067 +1 @@
-
-
-
-The Linux SCSI programming HOWTO
-
-
-
-----
-
-!!!The Linux SCSI programming HOWTO
-
-!!Heiko Eiszligfeldt heiko@colossus.escape.dev1.5, 7 May 1996
-
-
-----
-''This document deals with programming the Linux generic SCSI interface.''
-----
-
-
-__Archived Document Notice:__ This document has been archived by the LDP
-because it does not apply to modern Linux systems. It is no longer
-being actively maintained.
-
-
-
-
-!!1. What's New?
-
-
-
-
-!!2. Introduction
-
-
-
-
-!!3. What Is The Generic SCSI Interface?
-
-
-
-
-!!4. What Are The Requirements To Use It?
-
-
-*4.1 Kernel Configuration
-
-*4.2 Device Files
-
-*4.3 Device Mapping
-
-
-
-
-
-!!5. Programmers Guide
-
-
-
-
-!!6. Overview Of Device Programming
-
-
-
-
-!!7. Opening The Device
-
-
-
-
-!!8. The Header Structure
-
-
-
-
-!!9. Inquiry Command Example
-
-
-
-
-!!10. The Sense Buffer
-
-
-
-
-!!11. Example Using Sense Buffer
-
-
-
-
-!!12. Ioctl Functions
-
-
-
-
-!!13. Driver Defaults
-
-
-*13.1 Transfer Lengths
-
-*13.2 Timeout And Retry Values
-
-
-
-
-
-!!14. Obtaining The Scsi Specifications
-
-
-
-
-!!15. Related Information Sources
-
-
-*15.1 HOWTOs and FAQs
-
-*15.2 Mailing list
-
-*15.3 Example code
-
-
-
-
-
-!!16. Other useful stuff
-
-
-*16.1 Device driver writer helpers
-
-*16.2 Utilities
-
-
-
-
-
-!!17. Other SCSI Access Interfaces
-
-
-
-
-!!18. Final Comments
-
-
-
-
-!!19. Acknowledgments
-
-!!Appendix
-
-
-
-
-!!20. Appendix
-
-
-
-
-!!21. Error handling
-
-
-*21.1 Error status decoding
-
-*21.2 Status codes
-
-*21.3 SCSI Sense Keys
-
-*21.4 Host codes
-
-*21.5 Driver codes
-
-
-
-
-
-!!22. Additional sense codes and additional sense code qualifiers
-
-
-*22.1 ASC and ASCQ in lexical order
-
-*22.2 ASC and ASCQ in numerical order
-
-
-
-
-
-!!23. A SCSI command code quick reference
-
-
-
-
-!!24. Example programs
-----
-
-!!1. What's New?
-
-
-Newer kernels have changed the interface a bit. This affects
-a section formerly entitled 'rescanning the devices'. Now it is
-possible to add/remove SCSI devices on the fly.
-
-
-Since kernel 1.3.98 some important header files have been
-moved/split (sg.h and scsi.h).
-
-
-Some stupid bugs have been replaced by newer ones.
-
-
-
-----
-
-!!2. Introduction
-
-
-This document is a guide to the installation and programming of the
-Linux generic SCSI interface.
-
-
-It covers kernel prerequisites, device mappings, and basic interaction
-with devices. Some simple C programming examples are included.
-General knowledge of the SCSI command set is required; for more
-information on the SCSI standard and related information, see the
-appendix to this document.
-
-
-Note the plain text version of this document lacks cross references
-(they show up as ``'').
-
-
-
-----
-
-!!3. What Is The Generic SCSI Interface?
-
-
-The generic SCSI interface has been implemented to provide general
-SCSI access to (possibly exotic) pieces of SCSI hardware. It was
-developed by Lawrence Foard ( entropy@world.std.com) and
-sponsored by Killy Corporation (see the comments in scsi/sg.h).
-
-
-The interface makes special device handling possible from user level
-applications (i.e. outside the kernel). Thus, kernel driver
-development, which is more risky and difficult to debug, is not
-necessary.
-
-
-However, if you don't program the driver properly it is possible to
-hang the SCSI bus, the driver, or the kernel. Therefore, it is
-important to properly program the generic driver and to first back up
-all files to avoid losing data. Another useful thing to do before
-running your programs is to issue a sync command to ensure that
-any buffers are flushed to disk, minimizing data loss if the system
-hangs.
-
-
-Another advantage of the generic driver is that as long as the
-interface itself does not change, all applications are independent of
-new kernel development. In comparison, other low-level kernel drivers
-have to be synchronized with other internal kernel changes.
-
-
-Typically, the generic driver is used to communicate with new SCSI
-hardware devices that require special user applications to be written
-to take advantage of their features (e.g. scanners, printers, CD-ROM
-jukeboxes). The generic interface allows these to be written quickly.
-
-
-
-----
-
-!!4. What Are The Requirements To Use It?
-
-
-
-
-!!4.1 Kernel Configuration
-
-
-
-You must have a supported SCSI controller, obviously. Furthermore,
-your kernel must have controller support as well as generic support
-compiled in. Configuring the Linux kernel (via make config under
-/usr/src/linux) typically looks like the following:
-
-
-
-
-
-...
-*
-* SCSI support
-*
-SCSI support? (CONFIG_SCSI)
[[n
] y
-*
-* SCSI support type (disk, tape, CDrom)
-*
-...
-Scsi generic support (CONFIG_CHR_DEV_SG) [[n] y
-*
-* SCSI low-level drivers
-*
-...
-
-
-
-
-If available, modules can of course be build instead.
-
-
-
-
-!!4.2 Device Files
-
-
-
-The generic SCSI driver uses its own device files, separate from those
-used by the other SCSI device drivers. They can be generated using
-the MAKEDEV script, typically found in the /dev
-directory. Running MAKEDEV sg produces these files:
-
-
-
-
-
-crw------- 1 root system 21, 0 Aug 20 20:09 /dev/sga
-crw------- 1 root system 21, 1 Aug 20 20:09 /dev/sgb
-crw------- 1 root system 21, 2 Aug 20 20:09 /dev/sgc
-crw------- 1 root system 21, 3 Aug 20 20:09 /dev/sgd
-crw------- 1 root system 21, 4 Aug 20 20:09 /dev/sge
-crw------- 1 root system 21, 5 Aug 20 20:09 /dev/sgf
-crw------- 1 root system 21, 6 Aug 20 20:09 /dev/sgg
-crw------- 1 root system 21, 7 Aug 20 20:09 /dev/sgh
-| |
-major, minor device numbers
-
-
-
-
-Note that these are character devices for raw access. On some systems
-these devices may be called /dev/{sg0,sg1,...}, depending on your
-installation, so adjust the following examples accordingly.
-
-
-
-
-!!4.3 Device Mapping
-
-
-
-These device files are dynamically mapped to SCSI id/LUNs on your SCSI
-bus (LUN = logical unit). The mapping allocates devices consecutively
-for each LUN of each device on each SCSI bus found at time of the SCSI
-scan, beginning at the lower LUNs/ids/buses. It starts with the first SCSI
-controller and continues without interruption with all following
-controllers. This is currently done in the initialisation of the SCSI
-driver.
-
-
-For example, assuming you had three SCSI devices hooked up with ids 1,
-3, and 5 on the first SCSI bus (each having one LUN), then the
-following mapping would be in effect:
-
-
-
-
-
-/dev/sga -> SCSI id 1
-/dev/sgb -> SCSI id 3
-/dev/sgc -> SCSI id 5
-
-
-
-
-If you now add a new device with id 4, then the mapping (after the
-next rescan) will be:
-
-
-
-
-
-/dev/sga -> SCSI id 1
-/dev/sgb -> SCSI id 3
-/dev/sgc -> SCSI id 4
-/dev/sgd -> SCSI id 5
-
-
-
-
-Notice the change for id 5 -- the corresponding device is no longer
-mapped to /dev/sgc but is now under /dev/sgd.
-
-
-Luckily newer kernels allow for changing this order.
-
-
-
-
-!Dynamically insert and remove SCSI devices
-
-
-If a newer kernel and the /proc file system is running,
-a non-busy device can be removed and installed 'on the fly'.
-
-
-To remove a SCSI device:
-
-
-echo "scsi remove-single-device a b c d" > /proc/scsi/scsi
-
-
-
-
-and similar, to add a SCSI device, do
-
-
-echo "scsi add-single-device a b c d" > /proc/scsi/scsi
-
-
-
-
-where
-
-
-a == hostadapter id (first one being )
-b == SCSI channel on hostadapter (first one being )
-c == ID
-d == LUN (first one being )
-
-
-
-
-So in order to swap the /dev/sgc and /dev/sgd mappings from
-the previous example, we could do
-
-
-
-
-
-echo "scsi remove-single-device 0 0 4 " > /proc/scsi/scsi
-echo "scsi remove-single-device 0 0 5 " > /proc/scsi/scsi
-echo "scsi add-single-device 0 0 5 " > /proc/scsi/scsi
-echo "scsi add-single-device 0 0 4 " > /proc/scsi/scsi
-
-
-
-
-since generic devices are mapped in the order of their insertion.
-
-
-When adding more devices to the scsi bus keep in mind there are
-limited spare entries for new devices. The memory has been allocated
-at boot time and has room for 2 more devices.
-
-
-
-----
-
-!!5. Programmers Guide
-
-
-The following sections are for programmers who want to use the generic
-SCSI interface in their own applications. An example will be given
-showing how to access a SCSI device with the INQUIRY and the
-TESTUNITREADY commands.
-
-
-
-
-
-When using these code examples, note the following:
-
-
-*the location of the header files sg.h and scsi.h has
-changed in kernel version 1.3.98. Now these files are located at
-/usr/src/linux/include/scsi, which is hopefully linked to
-/usr/include/scsi. Previously they were in
-/usr/src/linux/drivers/scsi. We assume a newer kernel in the following text.
-*
-
-*the generic SCSI interface was extended in kernel version 1.1.68; the
-examples require at least this version. But please avoid kernel version
-1.1.77 up to 1.1.89 and 1.3.52 upto 1.3.56 since they had a broken generic
-scsi interface.
-*
-
-*the constant DEVICE in the header section describing the accessed
-device should be set according to your available devices (see
-section
-sec-header
-.
-*
-
-
-
-
-----
-
-!!6. Overview Of Device Programming
-
-
-The header file include/scsi/sg.h
-contains a description of the interface (this is based on kernel
-version 1.3.98):
-
-
-
-
-
-struct sg_header
-{
-int pack_len;
-/* length of incoming packet (including header) */
-int reply_len; /* maximum length of expected reply */
-int pack_id; /* id number of packet */
-int result; /* ==ok, otherwise refer to errno codes */
-unsigned int twelve_byte:1;
-/* Force 12 byte command length for group 6 & 7 commands */
-unsigned int other_flags:31; /* for future use */
-unsigned char sense_buffer[[16]; /* used only by reads */
-/* command follows then data for command */
-};
-
-
-
-
-
-
-
-This structure describes how a SCSI command is to be processed and has
-room to hold the results of the execution of the command. The
-individual structure components will be discussed later in
-section
-sec-header
-.
-
-
-The general way of exchanging data with the generic driver is as
-follows: to send a command to an opened generic device, write() a
-block containing these three parts to it:
-
-
-
-
-
-
-
-
-
-
-
-struct sg_header
-SCSI command
-data to be sent with the command
-
-
-
-
-
-
-
-To obtain the result of a command, read() a block with this
-(similar) block structure:
-
-
-
-
-
-struct sg_header
-data coming from the device
-
-
-
-
-
-
-
-This is a general overview of the process. The following sections
-describe each of the steps in more detail.
-
-
-NOTE: Up to recent kernel versions, it is necessary to block the
-SIGINT signal between the write() and the corresponding
-read() call (i.e. via sigprocmask()). A return after the
-write() part without any read() to fetch the results
-will block on subsequent accesses. This signal blocking has not
-yet been included in the example code. So better do not issue
-SIGINT (a la ^C) when running these examples.
-
-
-
-----
-
-!!7. Opening The Device
-
-
-A generic device has to be opened for read and write access:
-
-
-
-
-
-int fd = open (device_name, O_RDWR);
-
-
-
-
-(This is the case even for a read-only hardware device such as a cdrom
-drive).
-
-
-We have to perform a write to send the command and a read
-to get back any results. In the case of an error the return code is
-negative (see section
-sec-errorhandling
-for a complete list).
-
-
-
-----
-
-!!8. The Header Structure
-
-
-
-
-
-
-
-The header structure struct sg_header serves as a controlling
-layer between the application and the kernel driver.
-We now discuss its components in detail.
-
-
-
-
-
-
-
-; __int pack_len__:
-
-defines the size of the block written to the driver.
-This is defined within the kernel for internal use.
-; __int reply_len__:
-
-defines the size of the block to be accepted at reply.
-This is defined from the application side.
-
-
-
-; __int pack_id__:
-
-This field helps to assign replies to requests. The application
-can supply a unique id for each request. Suppose you have written several
-commands (say 4) to one device. They may work in
-parallel, one being the fastest. When getting replies via 4 reads, the replies
-do not have to have the order of the requests. To identify the correct reply
-for a given request one can use the pack_id field. Typically its value
-is incremented after each request (and wraps eventually). The maximum
-amount of outstanding requests is limited by the kernel to SG_MAX_QUEUE (eg 4).
-
-
-
-; __int result__:
-
-the result code of a read or write call.
-This is (sometimes) defined from the generic driver (kernel) side.
-It is safe to set it to null before the write call.
-These codes are defined in errno.h (0 meaning no error).
-
-
-
-; __unsigned int twelve_byte:1__:
-
-This field is necessary only when
-using non-standard vendor specific commands (in the range 0xc0 - 0xff).
-When these commands have a command length of 12 bytes instead of 10,
-this field has to be set to one before the write call. Other command
-lengths are not supported. This is defined from the application side.
-
-
-
-; __unsigned char sense_buffer[[16]__:
-
-This buffer is set after a
-command is completed (after a read() call) and contains the
-SCSI sense code. Some command results have to be read from
here (e.g. for
-TESTUNITREADY). Usually it contains just zero bytes.
-The value in this field is set by the generic driver (kernel) side.
-
-
-
-
-
-
-
-
-
-The following example function interfaces directly with the generic
-kernel driver. It defines the header structure, sends the command via
-write, gets the result via read and does some (limited)
-error checking. The sense buffer data is available in the output
-buffer (unless a NULL pointer has been given, in which case it's in
-the input buffer). We will use it in the examples which follow.
-
-
-Note: Set the value of DEVICE to your device descriptor.
-
-
-
-
-
-
-
-
-#define DEVICE "/dev/sgc"
-/* Example program to demonstrate the generic SCSI interface */
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <scsi/sg.h>
-#define SCSI_OFF sizeof(struct sg_header)
-static unsigned char cmd[[SCSI_OFF + 18]; /* SCSI command buffer */
-int fd; /* SCSI device/file descriptor */
-/* process a complete SCSI cmd. Use the generic SCSI interface. */
-static int handle_SCSI_cmd(unsigned cmd_len, /* command length */
-unsigned in_size, /* input data size */
-unsigned char *i_buff, /* input buffer */
-unsigned out_size, /* output data size */
-unsigned char *o_buff /* output buffer */
-)
-{
-int status = ;
-struct sg_header *sg_hd;
-/* safety checks */
-if (!cmd_len) return -1; /* need a cmd_len != 0 */
-if (!i_buff) return -1; /* need an input buffer != NULL */
-#ifdef SG_BIG_BUFF
-if (SCSI_OFF + cmd_len + in_size > SG_BIG_BUFF) return -1;
-if (SCSI_OFF + out_size > SG_BIG_BUFF) return -1;
-#else
-if (SCSI_OFF + cmd_len + in_size > 4096) return -1;
-if (SCSI_OFF + out_size > 4096) return -1;
-#endif
-if (!o_buff) out_size = ; /* no output buffer, no output size */
-/* generic SCSI device header construction */
-sg_hd = (struct sg_header *) i_buff;
-sg_hd->reply_len = SCSI_OFF + out_size;
-sg_hd->twelve_byte = cmd_len == 12;
-sg_hd->result = ;
-#if
-sg_hd->pack_len = SCSI_OFF + cmd_len + in_size; /* not necessary */
-sg_hd->pack_id; /* not used */
-sg_hd->other_flags; /* not used */
-#endif
-/* send command */
-status = write( fd, i_buff, SCSI_OFF + cmd_len + in_size );
-if ( status < 0 || status != SCSI_OFF + cmd_len + in_size ||
-sg_hd->result ) {
-/* some error happened */
-fprintf( stderr, "write(generic) result = 0x%x cmd = 0x%x\n",
-sg_hd->result, i_buff[[SCSI_OFF] );
-perror("");
-return status;
-}
-if (!o_buff) o_buff = i_buff; /* buffer pointer check */
-/* retrieve result */
-status = read( fd, o_buff, SCSI_OFF + out_size);
-if ( status < 0 || status != SCSI_OFF + out_size || sg_hd->result ) {
-/* some error happened */
-fprintf( stderr, "read(generic) status = 0x%x, result = 0x%x, "
-"cmd = 0x%x\n",
-status, sg_hd->result, o_buff[[SCSI_OFF] );
-fprintf( stderr, "read(generic) sense "
-"%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n",
-sg_hd->sense_buffer[[], sg_hd->sense_buffer[[1],
-sg_hd->sense_buffer[[2], sg_hd->sense_buffer[[3],
-sg_hd->sense_buffer[[4], sg_hd->sense_buffer[[5],
-sg_hd->sense_buffer[[6], sg_hd->sense_buffer[[7],
-sg_hd->sense_buffer[[8], sg_hd->sense_buffer[[9],
-sg_hd->sense_buffer[[10], sg_hd->sense_buffer[[11],
-sg_hd->sense_buffer[[12], sg_hd->sense_buffer[[13],
-sg_hd->sense_buffer[[14], sg_hd->sense_buffer[[15]);
-if (status < )
-perror("");
-}
-/* Look if we got what we expected to get */
-if (status == SCSI_OFF + out_size) status = ; /* got them all */
-return status; /* 0 means no error */
-}
-
-
-
-
-While this may look somewhat complex at first appearance, most of the
-code is for error checking and reporting (which is useful even after
-the code is working).
-
-
-Handle_SCSI_cmd has a generalized form for all SCSI commands
-types, falling into each of these categories:
-
-
-
-
-
-
-
-
-Data Mode | Example Command
-===============================================
-neither input nor output data | test unit ready
-no input data, output data | inquiry, read
-input data, no output data | mode select, write
-input data, output data | mode sense
-
-
-
-
-
-
-
-
-----
-
-!!9. Inquiry Command Example
-
-
-One of the most basic SCSI commands is the INQUIRY command, used
-to identify the type and make of the device. Here is the definition
-from the SCSI-2 specification (for details refer to the SCSI-2
-standard).
-
-
-
-
-
-Table 44: INQUIRY Command
-+=====-========-========-========-========-========-========-========-========+
-| Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
-|Byte | | | | | | | | |
-|=====+=======================================================================|
-| 0 | Operation Code (12h) |
-|-----+-----------------------------------------------------------------------|
-| 1 | Logical Unit Number | Reserved | EVPD |
-|-----+-----------------------------------------------------------------------|
-| 2 | Page Code |
-|-----+-----------------------------------------------------------------------|
-| 3 | Reserved |
-|-----+-----------------------------------------------------------------------|
-| 4 | Allocation Length |
-|-----+-----------------------------------------------------------------------|
-| 5 | Control |
-+=============================================================================+
-
-
-
-
-The output data are as follows:
-
-
-Table 45: Standard INQUIRY Data Format
-+=====-========-========-========-========-========-========-========-========+
-| Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
-|Byte | | | | | | | | |
-|=====+==========================+============================================|
-| 0 | Peripheral Qualifier | Peripheral Device Type |
-|-----+-----------------------------------------------------------------------|
-| 1 | RMB | Device-Type Modifier |
-|-----+-----------------------------------------------------------------------|
-| 2 | ISO Version | ECMA Version | ANSI-Approved Version |
-|-----+-----------------+-----------------------------------------------------|
-| 3 | AENC | TrmIOP | Reserved | Response Data Format |
-|-----+-----------------------------------------------------------------------|
-| 4 | Additional Length (n-4) |
-|-----+-----------------------------------------------------------------------|
-| 5 | Reserved |
-|-----+-----------------------------------------------------------------------|
-| 6 | Reserved |
-|-----+-----------------------------------------------------------------------|
-| 7 | !RelAdr | WBus32 | WBus16 | Sync | Linked |Reserved| !CmdQue | !SftRe |
-|-----+-----------------------------------------------------------------------|
-| 8 | (MSB) |
-|- - -+--- Vendor Identification ---|
-| 15 | (LSB) |
-|-----+-----------------------------------------------------------------------|
-| 16 | (MSB) |
-|- - -+--- Product Identification ---|
-| 31 | (LSB) |
-|-----+-----------------------------------------------------------------------|
-| 32 | (MSB) |
-|- - -+--- Product Revision Level ---|
-| 35 | (LSB) |
-|-----+-----------------------------------------------------------------------|
-| 36 | |
-|- - -+--- Vendor Specific ---|
-| 55 | |
-|-----+-----------------------------------------------------------------------|
-| 56 | |
-|- - -+--- Reserved ---|
-| 95 | |
-|=====+=======================================================================|
-| | Vendor-Specific Parameters |
-|=====+=======================================================================|
-| 96 | |
-|- - -+--- Vendor Specific ---|
-| n | |
-+=============================================================================+
-
-
-
-
-
-
-
-The next example uses the low-level function handle_SCSI_cmd to
-perform the Inquiry SCSI command.
-
-
-We first append the command block to the generic header, then call
-handle_SCSI_cmd. Note that the output buffer size argument for
-the handle_SCSI_cmd call excludes the generic header size.
-After command completion the output buffer contains the requested
-data, unless an error occurred.
-
-
-
-
-
-#define INQUIRY_CMD 0x12
-#define INQUIRY_CMDLEN 6
-#define INQUIRY_REPLY_LEN 96
-#define INQUIRY_VENDOR 8 /* Offset in reply data to vendor name */
-/* request vendor brand and model */
-static unsigned char *Inquiry ( void )
-{
-unsigned char Inqbuffer[[ SCSI_OFF + INQUIRY_REPLY_LEN ];
-unsigned char cmdblk [[ INQUIRY_CMDLEN ] =
-{ INQUIRY_CMD, /* command */
-, /* lun/reserved */
-, /* page code */
-, /* reserved */
-INQUIRY_REPLY_LEN, /* allocation length */
-0 };/* reserved/flag/link */
-memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) );
-/*
-* +------------------+
-* | struct sg_header | <- cmd
-* +------------------+
-* | copy of cmdblk | <- cmd + SCSI_OFF
-* +------------------+
-*/
-if (handle_SCSI_cmd(sizeof(cmdblk), , cmd,
-sizeof(Inqbuffer) - SCSI_OFF, Inqbuffer )) {
-fprintf( stderr, "Inquiry failed\n" );
-exit(2);
-}
-return (Inqbuffer + SCSI_OFF);
-}
-
-
-
-
-The example above follows this structure. The Inquiry function copies
-its command block behind the generic header (given by
-SCSI_OFF). Input data is not present for this command.
-Handle_SCSI_cmd will define the header structure. We can now
-implement the function main to complete this working example
-program.
-
-
-
-
-
-void main( void )
-{
-fd = open(DEVICE, O_RDWR);
-if (fd < ) {
-fprintf( stderr, "Need read/write permissions for "DEVICE".\n" );
-exit(1);
-}
-/* print some fields of the Inquiry result */
-printf( "%s\n", Inquiry() + INQUIRY_VENDOR );
-}
-
-
-
-
-We first open the device, check for errors, and then call the higher
-level subroutine. Then we print the results in human readable format
-including the vendor, product, and revision.
-
-
-Note: There is more information in the Inquiry result than this little
-program gives. You may want to extend the program to give device type,
-ANSI version etc. The device type is of special importance, since it
-determines the mandatory and optional command sets for this device.
-If you don't want to program it yourself, you may want to use the
-scsiinfo program from Eric Youngdale, which requests nearly all
-information about an SCSI device. Look at tsx-11.mit.edu in
-pub/Linux/ALPHA/scsi.
-
-
-
-----
-
-!!10. The Sense Buffer
-
-
-
-
-Commands with no output data can give status information via the sense
-buffer (which is part of the header structure). Sense data is
-available when the previous command has terminated with a CHECK
-CONDITION status. In this case the kernel automatically retrieves the
-sense data via a REQUEST SENSE command. Its structure is:
-
-
-
-
-
-
-
-
-+=====-========-========-========-========-========-========-========-========+
-| Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
-|Byte | | | | | | | | |
-|=====+========+==============================================================|
-| 0 | Valid | Error Code (70h or 71h) |
-|-----+-----------------------------------------------------------------------|
-| 1 | Segment Number |
-|-----+-----------------------------------------------------------------------|
-| 2 |Filemark| EOM | ILI |Reserved| Sense Key |
-|-----+-----------------------------------------------------------------------|
-| 3 | (MSB) |
-|- - -+--- Information ---|
-| 6 | (LSB) |
-|-----+-----------------------------------------------------------------------|
-| 7 | Additional Sense Length (n-7) |
-|-----+-----------------------------------------------------------------------|
-| 8 | (MSB) |
-|- - -+--- Command-Specific Information ---|
-| 11 | (LSB) |
-|-----+-----------------------------------------------------------------------|
-| 12 | Additional Sense Code |
-|-----+-----------------------------------------------------------------------|
-| 13 | Additional Sense Code Qualifier |
-|-----+-----------------------------------------------------------------------|
-| 14 | Field Replaceable Unit Code |
-|-----+-----------------------------------------------------------------------|
-| 15 | SKSV | |
-|- - -+------------ Sense-Key Specific ---|
-| 17 | |
-|-----+-----------------------------------------------------------------------|
-| 18 | |
-|- - -+--- Additional Sense Bytes ---|
-| n | |
-+=============================================================================+
-
-
-
-
-
-
-
-Note: The most useful fields are Sense Key (see section
-sec-sensekeys
-),
-Additional Sense Code and Additional Sense Code Qualifier (see
-section
-sec-sensecodes
-). The latter two are used combined as a pair.
-
-
-
-
-
-
-
-
-
-----
-
-!!11. Example Using Sense Buffer
-
-
-Here we will use the TEST UNIT READY command to check whether media is
-loaded into our device. The header declarations and function
-handle_SCSI_cmd from the inquiry example will be needed as well.
-
-
-
-
-
-
-
-
-Table 73: TEST UNIT READY Command
-+=====-========-========-========-========-========-========-========-========+
-| Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
-|Byte | | | | | | | | |
-|=====+=======================================================================|
-| 0 | Operation Code (00h) |
-|-----+-----------------------------------------------------------------------|
-| 1 | Logical Unit Number | Reserved |
-|-----+-----------------------------------------------------------------------|
-| 2 | Reserved |
-|-----+-----------------------------------------------------------------------|
-| 3 | Reserved |
-|-----+-----------------------------------------------------------------------|
-| 4 | Reserved |
-|-----+-----------------------------------------------------------------------|
-| 5 | Control |
-+=============================================================================+
-
-
-
-
-
-
-
-
-
-
-Here is the function which implements it:
-
-
-
-
-
-#define TESTUNITREADY_CMD
-#define TESTUNITREADY_CMDLEN 6
-#define ADD_SENSECODE 12
-#define ADD_SC_QUALIFIER 13
-#define NO_MEDIA_SC 0x3a
-#define NO_MEDIA_SCQ 0x00
-int !TestForMedium ( void )
-{
-/* request READY status */
-static unsigned char cmdblk [[TESTUNITREADY_CMDLEN] = {
-TESTUNITREADY_CMD, /* command */
-, /* lun/reserved */
-, /* reserved */
-, /* reserved */
-, /* reserved */
-};/* control */
-memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) );
-/*
-* +------------------+
-* | struct sg_header | <- cmd
-* +------------------+
-* | copy of cmdblk | <- cmd + SCSI_OFF
-* +------------------+
-*/
-if (handle_SCSI_cmd(sizeof(cmdblk), , cmd,
-, NULL)) {
-fprintf (stderr, "Test unit ready failed\n");
-exit(2);
-}
-return
-*(((struct sg_header*)cmd)->sense_buffer +ADD_SENSECODE) !=
-NO_MEDIA_SC ||
-*(((struct sg_header*)cmd)->sense_buffer +ADD_SC_QUALIFIER) !=
-NO_MEDIA_SCQ;
-}
-
-
-
-
-Combined with this main function we can do the check.
-
-
-
-
-
-void main( void )
-{
-fd = open(DEVICE, O_RDWR);
-if (fd < ) {
-fprintf( stderr, "Need read/write permissions for "DEVICE".\n" );
-exit(1);
-}
-/* look if medium is loaded */
-if (!!TestForMedium()) {
-printf("device is unloaded\n");
-} else {
-printf("device is loaded\n");
-}
-}
-
-
-
-
-
-
-
-The file generic_demo.c from the appendix contains both examples.
-
-
-
-----
-
-!!12. Ioctl Functions
-
-
-
-
-There are two ioctl functions available:
-
-
-* ioctl(fd, SG_SET_TIMEOUT, &Timeout); sets the timeout value to
-Timeout * 10 milliseconds. Timeout has to be declared as int.
-*
-
-* ioctl(fd, SG_GET_TIMEOUT, &Timeout); gets the current timeout value.
-Timeout has to be declared as int.
-*
-
-
-
-
-----
-
-!!13. Driver Defaults
-
-
-
-
-!!13.1 Transfer Lengths
-
-
-
-
-
-Currently (at least up to kernel version 1.1.68) input and output
-sizes have to be less than or equal than 4096 bytes unless the kernel
-has been compiled with SG_BIG_BUFF defined, if which case it is
-limited to SG_BIG_BUFF (e.g. 32768) bytes. These sizes include
-the generic header as well as the command block on input.
-SG_BIG_BUFF can be safely increased upto (131072 - 512). To take
-advantage of this, a new kernel has to be compiled and booted, of course.
-
-
-
-
-!!13.2 Timeout And Retry Values
-
-
-
-The default timeout value is set to one minute (Timeout = 6000).
-It can be changed through an ioctl call (see section
-sec-ioctl
-).
-The default number of retries is one.
-
-
-
-----
-
-!!14. Obtaining The Scsi Specifications
-
-
-There are standards entitled SCSI-1 and SCSI-2 (and possibly soon
-SCSI-3). The standards are mostly upward compatible.
-
-
-The SCSI-1 standard is (in the author's opinion) mostly obsolete, and
-SCSI-2 is the most widely used. SCSI-3 is very new and very
-expensive. These standardized command sets specify mandatory and
-optional commands for SCSI manufacturers and should be preferred over
-the vendor specific command extensions which are not standardized and
-for which programming information is seldom available. Of course
-sometimes there is no alternative to these extensions.
-
-
-
-
-
-Electronic copies of the latest drafts are available via anonymous ftp from:
-
-
-*ftp.cs.tulane.edu:pub/scsi
-*
-
-*ftp.symbios.com:/pub/standards
-*
-
-*ftp.cs.uni-sb.de:/pub/misc/doc/scsi
-*
-
-
-
-(I got my SCSI specification from the Yggdrasil Linux CD-ROM in the
-directory /usr/doc/scsi-2 and /usr/doc/scsi-1).
-
-
-The SCSI FAQ also lists the following sources of printed
-information:
-
-
-The SCSI specification: Available from:
-
-
-
-
-
-Global Engineering Documents
-15 Inverness Way East
-Englewood Co 80112-5704
-(800) 854-7179
-SCSI-1: X3.131-1986
-SCSI-2: X3.131-199x
-SCSI-3 X3T9.2/91-010R4 Working Draft
-(Global Engineering Documentation in Irvine, CA (714)261-1455??)
-SCSI-1: Doc \# X3.131-1986 from ANSI, 1430 Broadway, NY, NY 10018
-IN-DEPTH EXPLORATION OF SCSI can be obtained from
-Solution Technology, Attn: SCSI Publications, POB 104, Boulder Creek,
-CA 95006, (408)338-4285, FAX (408)338-4374
-THE SCSI ENCYLOPEDIA and the SCSI BENCH REFERENCE can be obtained from
-ENDL Publishing, 14426 Black Walnut Ct., Saratoga, CA 95090,
-(408)867-6642, FAX (408)867-2115
-SCSI: UNDERSTANDING THE SMALL COMPUTER SYSTEM INTERFACE was published
-by Prentice-Hall, ISBN -13-796855-8
-
-
-
-
-
-----
-
-!!15. Related Information Sources
-
-
-
-
-!!15.1 HOWTOs and FAQs
-
-
-
-The Linux __SCSI-HOWTO__ by Drew Eckhardt covers all supported SCSI
-controllers as well as device specific questions. A lot of
-troubleshooting hints are given. It is available from sunsite.unc.edu
-in /pub/Linux/docs/LDP and its mirror sites.
-
-
-General questions about SCSI are answered in the __SCSI-FAQ__ from the
-newsgroup Comp.Periphs.Scsi (available on tsx-11 in
-pub/linux/ALPHA/scsi and mirror sites).
-
-
-
-
-!!15.2 Mailing list
-
-
-
-There is a __mailing list__ for bug reports and questions regarding SCSI
-development under Linux. To join, send email to
-majordomo@vger.rutgers.edu with the line
-subscribe linux-scsi
-in the body of the message. Messages should be posted to
-linux-scsi@vger.rutgers.edu. Help text can be requested by sending
-the message line "help" to majordomo@vger.rutgers.edu.
-
-
-
-
-!!15.3 Example code
-
-
-
-
-
-; __sunsite.unc.edu: apps/graphics/hpscanpbm-.3a.tar.gz__:
-
-This package handles a HP scanjet scanner through the generic interface.
-; __tsx-11.mit.edu: BETA/cdrom/private/mkisofs/cdwrite-1.3.tar.gz__:
-
-The cdwrite package uses the generic interface to write a cd image
-to a cd writer.
-; __sunsite.unc.edu: apps/sound/cds/cdda2wav*.src.tar.gz__:
-
-A shameless plug for my own application, which copies audio cd tracks
-into wav files.
-
-
-
-
-
-
-
-----
-
-!!16. Other useful stuff
-
-
-Things that may come in handy. I don't have no idea if there are newer
-or better versions around. Feedback is welcome.
-
-
-
-
-!!16.1 Device driver writer helpers
-
-
-
-These documents can be found at the sunsite.unc.edu ftp server and
-its mirrors.
-
-; __/pub/Linux/docs/kernel/kernel-hackers-guide__:
-
-The LDP kernel hackers guide. May be a bit outdated, but covers the
-most fundamental things.
-; __/pub/Linux/docs/kernel/drivers.doc.z__:
-
-This document covers writing character drivers.
-; __/pub/Linux/docs/kernel/tutorial.doc.z__:
-
-Tutorial on writing a character device driver with code.
-; __/pub/Linux/docs/kernel/scsi.paper.tar.gz__:
-
-A Latex document describing howto write a SCSI driver.
-; __/pub/Linux/docs/hardware/DEVICES__:
-
-A list of device majors and minors used by Linux.
-
-
-
-
-
-!!16.2 Utilities
-
-
-
-
-
-; __tsx-11.mit.edu: ALPHA/scsi/scsiinfo*.tar.gz__:
-
-Program to query a scsi device for operating parameters,
-defect lists, etc. An X-based interface is available which requires
-you have Tk/Tcl/wish installed. With the X-based interface you
-can easily alter the settings on the drive.
-; __tsx-11.mit.edu: ALPHA/kdebug__:
-
-A gdb extension for kernel debugging.
-
-
-
-
-
-
-
-
-
-
-----
-
-!!17. Other SCSI Access Interfaces
-
-
-In Linux there is also another SCSI access method via
-SCSI_IOCTL_SEND_COMMAND ioctl calls, which is deprecated.
-Special tools like 'scsiinfo' utilize it.
-
-
-
-
-
-There are some other similar interfaces in use in the un*x world, but
-not available for Linux:
-
-
-#CAM (Common Access Method) developed by Future Domain and other
-SCSI vendors. Linux has little support for a SCSI CAM system yet
-(mainly for booting from hard disk).
-CAM even supports target mode, so one could disguise ones computer
-as a peripheral hardware device (e.g. for a small SCSI net).
-#
-
-#ASPI (Advanced SCSI Programming Interface) developed by Adaptec.
-This is the de facto standard for MS-DOS machines.
-#
-
-
-
-There are other application interfaces from SCO(TM), NeXT(TM), Silicon
-Graphics(TM) and SUN(TM) as well.
-
-
-
-----
-
-!!18. Final Comments
-
-
-The generic SCSI interface bridges the gap between user applications
-and specific devices. But rather than bloating a lot of programs with
-similar sets of low-level functions, it would be more desirable to
-have a shared library with a generalized set of low-level functions
-for a particular purpose. The main goal should be to have independent
-layers of interfaces. A good design would separate an application
-into low-level and hardware independent routines. The low-level
-routines could be put into a shared library and made available for all
-applications. Here, standardized interfaces should be followed as much
-as possible before making new ones.
-
-
-By now you should know more than I do about the Linux generic SCSI
-interface. So you can start developing powerful applications
-for the benefit of the global Linux community now...
-
-
-
-----
-
-!!19. Acknowledgments
-
-
-Special thanks go to Jeff Tranter for proofreading and enhancing the
-text considerably as well as to Carlos Puchol for useful comments.
-Drew Eckhardt's and Eric Youngdale's help on my first (dumb) questions
-about the use of this interface has been appreciated.
-
-
-
-----
-
-!!20. Appendix
-
-
-
-----
-
-!!21. Error handling
-
-
-
-
-The functions open, ioctl, write and read
-can report errors. In this case their return value is -1 and the
-global variable errno is set to the error number.
-The errno values are defined in /usr/include/errno.h.
-Possible values are:
-
-
-
-
-
-Function | Error | Description
-=========|==============|=============================================
-open | ENXIO | not a valid device
-| EACCES | access mode is not read/write (O_RDWR)
-| EBUSY | device was requested for nonblocking access,
-| | but is busy now.
-| ERESTARTSYS | this indicates an internal error. Try to
-| | make it reproducible and inform the SCSI
-| | channel (for details on bug reporting
-| | see Drew Eckhardts SCSI-HOWTO).
-ioctl | ENXIO | not a valid device
-read | EAGAIN | the device would block. Try again later.
-| ERESTARTSYS | this indicates an internal error. Try to
-| | make it reproducible and inform the SCSI
-| | channel (for details on bug reporting
-| | see Drew Eckhardts SCSI-HOWTO).
-write | EIO | the length is too small (smaller than the
-| | generic header struct). Caution: Currently
-| | there is no overlength checking.
-| EAGAIN | the device would block. Try again later.
-| ENOMEM | memory required for this request could not be
-| | allocated. Try later again unless you
-| | exceeded the maximum transfer size (see above)
-select | | none
-close | | none
-
-
-
-
-
-
-
-For read/write positive return values indicate as usual the amount of
-bytes that have been successfully transferred. This should equal the
-amount you requested.
-
-
-
-
-!!21.1 Error status decoding
-
-
-
-
-
-Furthermore a detailed reporting is done via the kernels hd_status
-and the devices sense_buffer (see section
-sec-sensebuff
-)
-both from the generic header structure.
-
-
-The meaning of hd_status can be found in drivers/scsi/scsi.h:
-This unsigned int is composed out of different parts:
-
-
-
-
-
-
-
-
-lsb | ... | ... | msb
-=======|===========|===========|============
-status | sense key | host code | driver byte
-
-
-
-
-
-
-
-These macros from drivers/scsi/scsi.h are available, but
-unfortunately cannot be easily used due to weird header file
-interdependencies. This has to be cleaned.
-
-
-
-
-
-Macro | Description
-=======================|=================================================
-status_byte(hd_status) | The SCSI device status. See section Status codes
-msg_byte(hd_status) | From the device. See section SCSI sense keys
-host_byte(hd_status) | From the kernel. See section Hostcodes
-driver_byte(hd_status) | From the kernel. See section midlevel codes
-
-
-
-
-
-
-
-
-
-
-
-
-!!21.2 Status codes
-
-
-
-
-
-
-The following status codes from the SCSI device
-(defined in scsi/scsi.h)
-are available.
-
-
-
-
-
-Value | Symbol
-======|=====================
-0x00 | GOOD
-0x01 | CHECK_CONDITION
-0x02 | CONDITION_GOOD
-0x04 | BUSY
-0x08 | INTERMEDIATE_GOOD
-0x0a | INTERMEDIATE_C_GOOD
-0x0c | RESERVATION_CONFLICT
-
-
-
-
-
-
-
-Note that these symbol values have been __shifted right once__.
-When the status is CHECK_CONDITION, the sense data in the sense
-buffer is valid (check especially the additional sense code
-and additional sense code qualifier).
-
-
-These values carry the meaning from the SCSI-2 specification:
-
-
-Table 27: Status Byte Code
-+=================================-==============================+
-| Bits of Status Byte | Status |
-| 7 6 5 4 3 2 1 0 | |
-|---------------------------------+------------------------------|
-| R R 0 0 0 0 0 R | GOOD |
-| R R 0 0 0 0 1 R | CHECK CONDITION |
-| R R 0 0 0 1 0 R | CONDITION MET |
-| R R 0 0 1 0 0 R | BUSY |
-| R R 0 1 0 0 0 R | INTERMEDIATE |
-| R R 0 1 0 1 0 R | INTERMEDIATE-CONDITION MET |
-| R R 0 1 1 0 0 R | RESERVATION CONFLICT |
-| R R 1 0 0 0 1 R | COMMAND TERMINATED |
-| R R 1 0 1 0 0 R | QUEUE FULL |
-| | |
-| All Other Codes | Reserved |
-|----------------------------------------------------------------|
-| Key: R = Reserved bit |
-+================================================================+
-A definition of the status byte codes is given below.
-GOOD. This status indicates that the target has successfully completed the
-command.
-CHECK CONDITION. This status indicates that a contingent allegiance condition
-has occurred (see 6.6).
-CONDITION MET. This status or INTERMEDIATE-CONDITION MET is returned whenever
-the requested operation is satisfied (see the SEARCH DATA and PRE-FETCH
-commands).
-BUSY. This status indicates that the target is busy. This status shall be
-returned whenever a target is unable to accept a command from an otherwise
-acceptable initiator (i.e., no reservation conflicts). The recommended
-initiator recovery action is to issue the command again at a later time.
-INTERMEDIATE. This status or INTERMEDIATE-CONDITION MET shall be returned for
-every successfully completed command in a series of linked commands (except
-the last command), unless the command is terminated with CHECK CONDITION,
-RESERVATION CONFLICT, or COMMAND TERMINATED status. If INTERMEDIATE or
-INTERMEDIATE-CONDITION MET status is not returned, the series of linked
-commands is terminated and the I/O process is ended.
-INTERMEDIATE-CONDITION MET. This status is the combination of the CONDITION
-MET and INTERMEDIATE statuses.
-RESERVATION CONFLICT. This status shall be returned whenever an initiator
-attempts to access a logical unit or an extent within a logical unit that is
-reserved with a conflicting reservation type for another SCSI device (see the
-RESERVE and RESERVE UNIT commands). The recommended initiator recovery action
-is to issue the command again at a later time.
-COMMAND TERMINATED. This status shall be returned whenever the target
-terminates the current I/O process after receiving a TERMINATE I/O PROCESS
-message (see 5.6.22). This status also indicates that a contingent allegiance
-condition has occurred (see 6.6).
-QUEUE FULL. This status shall be implemented if tagged queuing is
-implemented. This status is returned when a SIMPLE QUEUE TAG, ORDERED QUEUE
-TAG, or HEAD OF QUEUE TAG message is received and the command queue is full.
-The I/O process is not placed in the command queue.
-
-
-
-
-
-
-
-
-
-!!21.3 SCSI Sense Keys
-
-
-
-
-
-These kernel symbols (from scsi/scsi.h) are predefined:
-
-
-
-
-
-Value | Symbol
-======|================
-0x00 | NO_SENSE
-0x01 | RECOVERED_ERROR
-0x02 | NOT_READY
-0x03 | MEDIUM_ERROR
-0x04 | HARDWARE_ERROR
-0x05 | ILLEGAL_REQUEST
-0x06 | UNIT_ATTENTION
-0x07 | DATA_PROTECT
-0x08 | BLANK_CHECK
-0x0a | COPY_ABORTED
-0x0b | ABORTED_COMMAND
-0x0d | VOLUME_OVERFLOW
-0x0e | MISCOMPARE
-
-
-
-
-
-
-
-A verbatim list from the SCSI-2 doc follows (from section 7.2.14.3):
-
-
-
-
-
-Table 69: Sense Key (0h-7h) Descriptions
-+========-====================================================================+
-| Sense | Description |
-| Key | |
-|--------+--------------------------------------------------------------------|
-| 0h | NO SENSE. Indicates that there is no specific sense key |
-| | information to be reported for the designated logical unit. This |
-| | would be the case for a successful command or a command that |
-| | received CHECK CONDITION or COMMAND TERMINATED status because one |
-| | of the filemark, EOM, or ILI bits is set to one. |
-|--------+--------------------------------------------------------------------|
-| 1h | RECOVERED ERROR. Indicates that the last command completed |
-| | successfully with some recovery action performed by the target. |
-| | Details may be determinable by examining the additional sense |
-| | bytes and the information field. When multiple recovered errors |
-| | occur during one command, the choice of which error to report |
-| | (first, last, most severe, etc.) is device specific. |
-|--------+--------------------------------------------------------------------|
-| 2h | NOT READY. Indicates that the logical unit addressed cannot be |
-| | accessed. Operator intervention may be required to correct this |
-| | condition. |
-|--------+--------------------------------------------------------------------|
-| 3h | MEDIUM ERROR. Indicates that the command terminated with a non- |
-| | recovered error condition that was probably caused by a flaw in |
-| | the medium or an error in the recorded data. This sense key may |
-| | also be returned if the target is unable to distinguish between a |
-| | flaw in the medium and a specific hardware failure (sense key 4h).|
-|--------+--------------------------------------------------------------------|
-| 4h | HARDWARE ERROR. Indicates that the target detected a non- |
-| | recoverable hardware failure (for example, controller failure, |
-| | device failure, parity error, etc.) while performing the command |
-| | or during a self test. |
-|--------+--------------------------------------------------------------------|
-| 5h | ILLEGAL REQUEST. Indicates that there was an illegal parameter in|
-| | the command descriptor block or in the additional parameters |
-| | supplied as data for some commands (FORMAT UNIT, SEARCH DATA, |
-| | etc.). If the target detects an invalid parameter in the command |
-| | descriptor block, then it shall terminate the command without |
-| | altering the medium. If the target detects an invalid parameter |
-| | in the additional parameters supplied as data, then the target may|
-| | have already altered the medium. This sense key may also indicate|
-| | that an invalid IDENTIFY message was received (5.6.7). |
-|--------+--------------------------------------------------------------------|
-| 6h | UNIT ATTENTION. Indicates that the removable medium may have been|
-| | changed or the target has been reset. See 6.9 for more detailed |
-| | information about the unit attention condition. |
-|--------+--------------------------------------------------------------------|
-| 7h | DATA PROTECT. Indicates that a command that reads or writes the |
-| | medium was attempted on a block that is protected from this |
-| | operation. The read or write operation is not performed. |
-+=============================================================================+
-Table 70: Sense Key (8h-Fh) Descriptions
-+========-====================================================================+
-| Sense | Description |
-| Key | |
-|--------+--------------------------------------------------------------------|
-| 8h | BLANK CHECK. Indicates that a write-once device or a sequential- |
-| | access device encountered blank medium or format-defined end-of- |
-| | data indication while reading or a write-once device encountered a|
-| | non-blank medium while writing. |
-|--------+--------------------------------------------------------------------|
-| 9h | Vendor Specific. This sense key is available for reporting vendor|
-| | specific conditions. |
-|--------+--------------------------------------------------------------------|
-| Ah | COPY ABORTED. Indicates a COPY, COMPARE, or COPY AND VERIFY |
-| | command was aborted due to an error condition on the source |
-| | device, the destination device, or both. (See 7.2.3.2 for |
-| | additional information about this sense key.) |
-|--------+--------------------------------------------------------------------|
-| Bh | ABORTED COMMAND. Indicates that the target aborted the command. |
-| | The initiator may be able to recover by trying the command again. |
-|--------+--------------------------------------------------------------------|
-| Ch | EQUAL. Indicates a SEARCH DATA command has satisfied an equal |
-| | comparison. |
-|--------+--------------------------------------------------------------------|
-| Dh | VOLUME OVERFLOW. Indicates that a buffered peripheral device has |
-| | reached the end-of-partition and data may remain in the buffer |
-| | that has not been written to the medium. A RECOVER BUFFERED DATA |
-| | command(s) may be issued to read the unwritten data from the |
-| | buffer. |
-|--------+--------------------------------------------------------------------|
-| Eh | MISCOMPARE. Indicates that the source data did not match the data|
-| | read from the medium. |
-|--------+--------------------------------------------------------------------|
-| Fh | RESERVED. |
-+=============================================================================+
-
-
-
-
-
-
-
-
-
-!!21.4 Host codes
-
-
-
-
-
-The following host codes are defined in drivers/scsi/scsi.h. They
-are set by the kernel driver.
-
-
-
-
-
-Value | Symbol | Description
-======|================|========================================
-0x00 | DID_OK | No error
-0x01 | DID_NO_CONNECT | Couldn't connect before timeout period
-0x02 | DID_BUS_BUSY | BUS stayed busy through time out period
-0x03 | DID_TIME_OUT | TIMED OUT for other reason
-0x04 | DID_BAD_TARGET | BAD target
-0x05 | DID_ABORT | Told to abort for some other reason
-0x06 | DID_PARITY | Parity error
-0x07 | DID_ERROR | internal error
-0x08 | DID_RESET | Reset by somebody
-0x09 | DID_BAD_INTR | Got an interrupt we weren't expecting
-
-
-
-
-
-
-!!21.5 Driver codes
-
-
-
-
-
-The midlevel driver categorizes the returned status from the lowlevel
-driver based on the sense key from the device. It suggests some actions
-to be taken such as retry, abort or remap. The routine scsi_done from
-scsi.c does a very differentiated handling based on host_byte(),
-status_byte(), msg_byte() and the suggestion. It then sets the driver
-byte to show what it has done. The driver byte is composed out of two
-nibbles: the driver status and the suggestion. Each half is composed
-from the below values being 'or'ed together (found in scsi.h).
-
-
-
-
-
-Value | Symbol | Description of Driver status
-======|================|========================================
-0x00 | DRIVER_OK | No error
-0x01 | DRIVER_BUSY | not used
-0x02 | DRIVER_SOFT | not used
-0x03 | DRIVER_MEDIA | not used
-0x04 | DRIVER_ERROR | internal driver error
-0x05 | DRIVER_INVALID | finished (DID_BAD_TARGET or DID_ABORT)
-0x06 | DRIVER_TIMEOUT | finished with timeout
-0x07 | DRIVER_HARD | finished with fatal error
-0x08 | DRIVER_SENSE | had sense information available
-
-
-
-
-
-
-
-Value | Symbol | Description of suggestion
-======|================|========================================
-0x10 | SUGGEST_RETRY | retry the SCSI request
-0x20 | SUGGEST_ABORT | abort the request
-0x30 | SUGGEST_REMAP | remap the block (not yet implemented)
-0x40 | SUGGEST_DIE | let the kernel panic
-0x80 | SUGGEST_SENSE | get sense information from the device
-0xff | SUGGEST_IS_OK | nothing to be done
-
-
-
-
-
-----
-
-!!22. Additional sense codes and additional sense code qualifiers
-
-
-
-
-When the status of the executed SCSI command is CHECK_CONDITION,
-sense data is available in the sense buffer. The additional sense
-code and additional sense code qualifier are contained in that
-buffer.
-
-
-From the SCSI-2 specification I include two tables. The first is in
-lexical, the second in numerical order.
-
-
-
-
-!!22.1 ASC and ASCQ in lexical order
-
-
-
-The following table list gives a list of descriptions and device types
-they apply to.
-
-
-
-
-
-+=============================================================================+
-| D - DIRECT ACCESS DEVICE |
-| .T - SEQUENTIAL ACCESS DEVICE |
-| . L - PRINTER DEVICE |
-| . P - PROCESSOR DEVICE |
-| . .W - WRITE ONCE READ MULTIPLE DEVICE |
-| . . R - READ ONLY (CD-ROM) DEVICE |
-| . . S - SCANNER DEVICE |
-| . . .O - OPTICAL MEMORY DEVICE |
-| . . . M - MEDIA CHANGER DEVICE |
-| . . . C - COMMUNICATION DEVICE |
-| . . . . |
-| ASC ASCQ DTLPWRSOMC DESCRIPTION |
-| --- ---- ----------------------------------------------------- |
-| 13h 00h D W O ADDRESS MARK NOT FOUND FOR DATA FIELD |
-| 12h 00h D W O ADDRESS MARK NOT FOUND FOR ID FIELD |
-| 00h 11h R AUDIO PLAY OPERATION IN PROGRESS |
-| 00h 12h R AUDIO PLAY OPERATION PAUSED |
-| 00h 14h R AUDIO PLAY OPERATION STOPPED DUE TO ERROR |
-| 00h 13h R AUDIO PLAY OPERATION SUCCESSFULLY COMPLETED |
-| 00h 04h T S BEGINNING-OF-PARTITION/MEDIUM DETECTED |
-| 14h 04h T BLOCK SEQUENCE ERROR |
-| 30h 02h DT WR O CANNOT READ MEDIUM - INCOMPATIBLE FORMAT |
-| 30h 01h DT WR O CANNOT READ MEDIUM - UNKNOWN FORMAT |
-| 52h 00h T CARTRIDGE FAULT |
-| 3Fh 02h DTLPWRSOMC CHANGED OPERATING DEFINITION |
-| 11h 06h WR O CIRC UNRECOVERED ERROR |
-| 30h 03h DT CLEANING CARTRIDGE INSTALLED |
-| 4Ah 00h DTLPWRSOMC COMMAND PHASE ERROR |
-| 2Ch 00h DTLPWRSOMC COMMAND SEQUENCE ERROR |
-| 2Fh 00h DTLPWRSOMC COMMANDS CLEARED BY ANOTHER INITIATOR |
-| 2Bh 00h DTLPWRSO C COPY CANNOT EXECUTE SINCE HOST CANNOT DISCONNECT |
-| 41h 00h D DATA PATH FAILURE (SHOULD USE 40 NN) |
-| 4Bh 00h DTLPWRSOMC DATA PHASE ERROR |
-| 11h 07h W O DATA RESYCHRONIZATION ERROR |
-| 16h 00h D W O DATA SYNCHRONIZATION MARK ERROR |
-| 19h 00h D O DEFECT LIST ERROR |
-| 19h 03h D O DEFECT LIST ERROR IN GROWN LIST |
-| 19h 02h D O DEFECT LIST ERROR IN PRIMARY LIST |
-| 19h 01h D O DEFECT LIST NOT AVAILABLE |
-| 1Ch 00h D O DEFECT LIST NOT FOUND |
-| 32h 01h D W O DEFECT LIST UPDATE FAILURE |
-| 40h NNh DTLPWRSOMC DIAGNOSTIC FAILURE ON COMPONENT NN (80H-FFH) |
-| 63h 00h R END OF USER AREA ENCOUNTERED ON THIS TRACK |
-| 00h 05h T S END-OF-DATA DETECTED |
-| 14h 03h T END-OF-DATA NOT FOUND |
-| 00h 02h T S END-OF-PARTITION/MEDIUM DETECTED |
-| 51h 00h T O ERASE FAILURE |
-| 0Ah 00h DTLPWRSOMC ERROR LOG OVERFLOW |
-| 11h 02h DT W SO ERROR TOO LONG TO CORRECT |
-| 03h 02h T EXCESSIVE WRITE ERRORS |
-| 3Bh 07h L FAILED TO SENSE BOTTOM-OF-FORM |
-| 3Bh 06h L FAILED TO SENSE TOP-OF-FORM |
-| 00h 01h T FILEMARK DETECTED |
-| 14h 02h T FILEMARK OR SETMARK NOT FOUND |
-| 09h 02h WR O FOCUS SERVO FAILURE |
-| 31h 01h D L O FORMAT COMMAND FAILED |
-| 58h 00h O GENERATION DOES NOT EXIST |
-+=============================================================================+
-
-
-
-
-
-
-
-Table 71: (continued)
-+=============================================================================+
-| ASC ASCQ DTLPWRSOMC DESCRIPTION |
-| --- ---- ----------------------------------------------------- |
-| 1Ch 02h D O GROWN DEFECT LIST NOT FOUND |
-| 00h 06h DTLPWRSOMC I/O PROCESS TERMINATED |
-| 10h 00h D W O ID CRC OR ECC ERROR |
-| 22h 00h D ILLEGAL FUNCTION (SHOULD USE 20 00, 24 00, OR 26 00) |
-| 64h 00h R ILLEGAL MODE FOR THIS TRACK |
-| 28h 01h M IMPORT OR EXPORT ELEMENT ACCESSED |
-| 30h 00h DT WR OM INCOMPATIBLE MEDIUM INSTALLED |
-| 11h 08h T INCOMPLETE BLOCK READ |
-| 48h 00h DTLPWRSOMC INITIATOR DETECTED ERROR MESSAGE RECEIVED |
-| 3Fh 03h DTLPWRSOMC INQUIRY DATA HAS CHANGED |
-| 44h 00h DTLPWRSOMC INTERNAL TARGET FAILURE |
-| 3Dh 00h DTLPWRSOMC INVALID BITS IN IDENTIFY MESSAGE |
-| 2Ch 02h S INVALID COMBINATION OF WINDOWS SPECIFIED |
-| 20h 00h DTLPWRSOMC INVALID COMMAND OPERATION CODE |
-| 21h 01h M INVALID ELEMENT ADDRESS |
-| 24h 00h DTLPWRSOMC INVALID FIELD IN CDB |
-| 26h 00h DTLPWRSOMC INVALID FIELD IN PARAMETER LIST |
-| 49h 00h DTLPWRSOMC INVALID MESSAGE ERROR |
-| 11h 05h WR O L-EC UNCORRECTABLE ERROR |
-| 60h 00h S LAMP FAILURE |
-| 5Bh 02h DTLPWRSOM LOG COUNTER AT MAXIMUM |
-| 5Bh 00h DTLPWRSOM LOG EXCEPTION |
-| 5Bh 03h DTLPWRSOM LOG LIST CODES EXHAUSTED |
-| 2Ah 02h DTL WRSOMC LOG PARAMETERS CHANGED |
-| 21h 00h DT WR OM LOGICAL BLOCK ADDRESS OUT OF RANGE |
-| 08h 00h DTL WRSOMC LOGICAL UNIT COMMUNICATION FAILURE |
-| 08h 02h DTL WRSOMC LOGICAL UNIT COMMUNICATION PARITY ERROR |
-| 08h 01h DTL WRSOMC LOGICAL UNIT COMMUNICATION TIME-OUT |
-| 4Ch 00h DTLPWRSOMC LOGICAL UNIT FAILED SELF-CONFIGURATION |
-| 3Eh 00h DTLPWRSOMC LOGICAL UNIT HAS NOT SELF-CONFIGURED YET |
-| 04h 01h DTLPWRSOMC LOGICAL UNIT IS IN PROCESS OF BECOMING READY |
-| 04h 00h DTLPWRSOMC LOGICAL UNIT NOT READY, CAUSE NOT REPORTABLE |
-| 04h 04h DTL O LOGICAL UNIT NOT READY, FORMAT IN PROGRESS |
-| 04h 02h DTLPWRSOMC LOGICAL UNIT NOT READY, INITIALIZING COMMAND REQUIRED |
-| 04h 03h DTLPWRSOMC LOGICAL UNIT NOT READY, MANUAL INTERVENTION REQUIRED |
-| 25h 00h DTLPWRSOMC LOGICAL UNIT NOT SUPPORTED |
-| 15h 01h DTL WRSOM MECHANICAL POSITIONING ERROR |
-| 53h 00h DTL WRSOM MEDIA LOAD OR EJECT FAILED |
-| 3Bh 0Dh M MEDIUM DESTINATION ELEMENT FULL |
-| 31h 00h DT W O MEDIUM FORMAT CORRUPTED |
-| 3Ah 00h DTL WRSOM MEDIUM NOT PRESENT |
-| 53h 02h DT WR OM MEDIUM REMOVAL PREVENTED |
-| 3Bh 0Eh M MEDIUM SOURCE ELEMENT EMPTY |
-| 43h 00h DTLPWRSOMC MESSAGE ERROR |
-| 3Fh 01h DTLPWRSOMC MICROCODE HAS BEEN CHANGED |
-| 1Dh 00h D W O MISCOMPARE DURING VERIFY OPERATION |
-| 11h 0Ah DT O MISCORRECTED ERROR |
-| 2Ah 01h DTL WRSOMC MODE PARAMETERS CHANGED |
-| 07h 00h DTL WRSOM MULTIPLE PERIPHERAL DEVICES SELECTED |
-| 11h 03h DT W SO MULTIPLE READ ERRORS |
-| 00h 00h DTLPWRSOMC NO ADDITIONAL SENSE INFORMATION |
-| 00h 15h R NO CURRENT AUDIO STATUS TO RETURN |
-| 32h 00h D W O NO DEFECT SPARE LOCATION AVAILABLE |
-| 11h 09h T NO GAP FOUND |
-| 01h 00h D W O NO INDEX/SECTOR SIGNAL |
-| 06h 00h D WR OM NO REFERENCE POSITION FOUND |
-+=============================================================================+
-
-
-
-
-
-
-
-Table 71: (continued)
-+=============================================================================+
-| ASC ASCQ DTLPWRSOMC DESCRIPTION |
-| --- ---- ----------------------------------------------------- |
-| 02h 00h D WR OM NO SEEK COMPLETE |
-| 03h 01h T NO WRITE CURRENT |
-| 28h 00h DTLPWRSOMC NOT READY TO READY TRANSITION, MEDIUM MAY HAVE CHANGED|
-| 5Ah 01h DT WR OM OPERATOR MEDIUM REMOVAL REQUEST |
-| 5Ah 00h DTLPWRSOM OPERATOR REQUEST OR STATE CHANGE INPUT (UNSPECIFIED) |
-| 5Ah 03h DT W O OPERATOR SELECTED WRITE PERMIT |
-| 5Ah 02h DT W O OPERATOR SELECTED WRITE PROTECT |
-| 61h 02h S OUT OF FOCUS |
-| 4Eh 00h DTLPWRSOMC OVERLAPPED COMMANDS ATTEMPTED |
-| 2Dh 00h T OVERWRITE ERROR ON UPDATE IN PLACE |
-| 3Bh 05h L PAPER JAM |
-| 1Ah 00h DTLPWRSOMC PARAMETER LIST LENGTH ERROR |
-| 26h 01h DTLPWRSOMC PARAMETER NOT SUPPORTED |
-| 26h 02h DTLPWRSOMC PARAMETER VALUE INVALID |
-| 2Ah 00h DTL WRSOMC PARAMETERS CHANGED |
-| 03h 00h DTL W SO PERIPHERAL DEVICE WRITE FAULT |
-| 50h 02h T POSITION ERROR RELATED TO TIMING |
-| 3Bh 0Ch S POSITION PAST BEGINNING OF MEDIUM |
-| 3Bh 0Bh S POSITION PAST END OF MEDIUM |
-| 15h 02h DT WR O POSITIONING ERROR DETECTED BY READ OF MEDIUM |
-| 29h 00h DTLPWRSOMC POWER ON, RESET, OR BUS DEVICE RESET OCCURRED |
-| 42h 00h D POWER-ON OR SELF-TEST FAILURE (SHOULD USE 40 NN) |
-| 1Ch 01h D O PRIMARY DEFECT LIST NOT FOUND |
-| 40h 00h D RAM FAILURE (SHOULD USE 40 NN) |
-| 15h 00h DTL WRSOM RANDOM POSITIONING ERROR |
-| 3Bh 0Ah S READ PAST BEGINNING OF MEDIUM |
-| 3Bh 09h S READ PAST END OF MEDIUM |
-| 11h 01h DT W SO READ RETRIES EXHAUSTED |
-| 14h 01h DT WR O RECORD NOT FOUND |
-| 14h 00h DTL WRSO RECORDED ENTITY NOT FOUND |
-| 18h 02h D WR O RECOVERED DATA - DATA AUTO-REALLOCATED |
-| 18h 05h D WR O RECOVERED DATA - RECOMMEND REASSIGNMENT |
-| 18h 06h D WR O RECOVERED DATA - RECOMMEND REWRITE |
-| 17h 05h D WR O RECOVERED DATA USING PREVIOUS SECTOR ID |
-| 18h 03h R RECOVERED DATA WITH CIRC |
-| 18h 01h D WR O RECOVERED DATA WITH ERROR CORRECTION & RETRIES APPLIED|
-| 18h 00h DT WR O RECOVERED DATA WITH ERROR CORRECTION APPLIED |
-| 18h 04h R RECOVERED DATA WITH L-EC |
-| 17h 03h DT WR O RECOVERED DATA WITH NEGATIVE HEAD OFFSET |
-| 17h 00h DT WRSO RECOVERED DATA WITH NO ERROR CORRECTION APPLIED |
-| 17h 02h DT WR O RECOVERED DATA WITH POSITIVE HEAD OFFSET |
-| 17h 01h DT WRSO RECOVERED DATA WITH RETRIES |
-| 17h 04h WR O RECOVERED DATA WITH RETRIES AND/OR CIRC APPLIED |
-| 17h 06h D W O RECOVERED DATA WITHOUT ECC - DATA AUTO-REALLOCATED |
-| 17h 07h D W O RECOVERED DATA WITHOUT ECC - RECOMMEND REASSIGNMENT |
-| 17h 08h D W O RECOVERED DATA WITHOUT ECC - RECOMMEND REWRITE |
-| 1Eh 00h D W O RECOVERED ID WITH ECC CORRECTION |
-| 3Bh 08h T REPOSITION ERROR |
-| 36h 00h L RIBBON, INK, OR TONER FAILURE |
-| 37h 00h DTL WRSOMC ROUNDED PARAMETER |
-| 5Ch 00h D O RPL STATUS CHANGE |
-| 39h 00h DTL WRSOMC SAVING PARAMETERS NOT SUPPORTED |
-| 62h 00h S SCAN HEAD POSITIONING ERROR |
-| 47h 00h DTLPWRSOMC SCSI PARITY ERROR |
-| 54h 00h P SCSI TO HOST SYSTEM INTERFACE FAILURE |
-| 45h 00h DTLPWRSOMC SELECT OR RESELECT FAILURE |
-+=============================================================================+
-
-
-
-
-
-
-
-Table 71: (concluded)
-+=============================================================================+
-| ASC ASCQ DTLPWRSOMC DESCRIPTION |
-| --- ---- ----------------------------------------------------- |
-| 3Bh 00h TL SEQUENTIAL POSITIONING ERROR |
-| 00h 03h T SETMARK DETECTED |
-| 3Bh 04h L SLEW FAILURE |
-| 09h 03h WR O SPINDLE SERVO FAILURE |
-| 5Ch 02h D O SPINDLES NOT SYNCHRONIZED |
-| 5Ch 01h D O SPINDLES SYNCHRONIZED |
-| 1Bh 00h DTLPWRSOMC SYNCHRONOUS DATA TRANSFER ERROR |
-| 55h 00h P SYSTEM RESOURCE FAILURE |
-| 33h 00h T TAPE LENGTH ERROR |
-| 3Bh 03h L TAPE OR ELECTRONIC VERTICAL FORMS UNIT NOT READY |
-| 3Bh 01h T TAPE POSITION ERROR AT BEGINNING-OF-MEDIUM |
-| 3Bh 02h T TAPE POSITION ERROR AT END-OF-MEDIUM |
-| 3Fh 00h DTLPWRSOMC TARGET OPERATING CONDITIONS HAVE CHANGED |
-| 5Bh 01h DTLPWRSOM THRESHOLD CONDITION MET |
-| 26h 03h DTLPWRSOMC THRESHOLD PARAMETERS NOT SUPPORTED |
-| 2Ch 01h S TOO MANY WINDOWS SPECIFIED |
-| 09h 00h DT WR O TRACK FOLLOWING ERROR |
-| 09h 01h WR O TRACKING SERVO FAILURE |
-| 61h 01h S UNABLE TO ACQUIRE VIDEO |
-| 57h 00h R UNABLE TO RECOVER TABLE-OF-CONTENTS |
-| 53h 01h T UNLOAD TAPE FAILURE |
-| 11h 00h DT WRSO UNRECOVERED READ ERROR |
-| 11h 04h D W O UNRECOVERED READ ERROR - AUTO REALLOCATE FAILED |
-| 11h 0Bh D W O UNRECOVERED READ ERROR - RECOMMEND REASSIGNMENT |
-| 11h 0Ch D W O UNRECOVERED READ ERROR - RECOMMEND REWRITE THE DATA |
-| 46h 00h DTLPWRSOMC UNSUCCESSFUL SOFT RESET |
-| 59h 00h O UPDATED BLOCK READ |
-| 61h 00h S VIDEO ACQUISITION ERROR |
-| 50h 00h T WRITE APPEND ERROR |
-| 50h 01h T WRITE APPEND POSITION ERROR |
-| 0Ch 00h T S WRITE ERROR |
-| 0Ch 02h D W O WRITE ERROR - AUTO REALLOCATION FAILED |
-| 0Ch 01h D W O WRITE ERROR RECOVERED WITH AUTO REALLOCATION |
-| 27h 00h DT W O WRITE PROTECTED |
-| |
-| 80h XXh \ |
-| THROUGH > VENDOR SPECIFIC. |
-| FFh XX / |
-| |
-| XXh 80h \ |
-| THROUGH > VENDOR SPECIFIC QUALIFICATION OF STANDARD ASC. |
-| XXh FFh / |
-| ALL CODES NOT SHOWN ARE RESERVED. |
-|-----------------------------------------------------------------------------|
-
-
-
-
-
-
-
-
-
-!!22.2 ASC and ASCQ in numerical order
-
-
-
-
-
-
-Table 364: ASC and ASCQ Assignments
-+=============================================================================+
-| D - DIRECT ACCESS DEVICE |
-| .T - SEQUENTIAL ACCESS DEVICE |
-| . L - PRINTER DEVICE |
-| . P - PROCESSOR DEVICE |
-| . .W - WRITE ONCE READ MULTIPLE DEVICE |
-| . . R - READ ONLY (CD-ROM) DEVICE |
-| . . S - SCANNER DEVICE |
-| . . .O - OPTICAL MEMORY DEVICE |
-| . . . M - MEDIA CHANGER DEVICE |
-| . . . C - COMMUNICATION DEVICE |
-| . . . . |
-| ASC ASCQ DTLPWRSOMC DESCRIPTION |
-| --- ---- ----------------------------------------------------- |
-| 00 00 DTLPWRSOMC NO ADDITIONAL SENSE INFORMATION |
-| 00 01 T FILEMARK DETECTED |
-| 00 02 T S END-OF-PARTITION/MEDIUM DETECTED |
-| 00 03 T SETMARK DETECTED |
-| 00 04 T S BEGINNING-OF-PARTITION/MEDIUM DETECTED |
-| 00 05 T S END-OF-DATA DETECTED |
-| 00 06 DTLPWRSOMC I/O PROCESS TERMINATED |
-| 00 11 R AUDIO PLAY OPERATION IN PROGRESS |
-| 00 12 R AUDIO PLAY OPERATION PAUSED |
-| 00 13 R AUDIO PLAY OPERATION SUCCESSFULLY COMPLETED |
-| 00 14 R AUDIO PLAY OPERATION STOPPED DUE TO ERROR |
-| 00 15 R NO CURRENT AUDIO STATUS TO RETURN |
-| 01 00 DW O NO INDEX/SECTOR SIGNAL |
-| 02 00 DWR OM NO SEEK COMPLETE |
-| 03 00 DTL W SO PERIPHERAL DEVICE WRITE FAULT |
-| 03 01 T NO WRITE CURRENT |
-| 03 02 T EXCESSIVE WRITE ERRORS |
-| 04 00 DTLPWRSOMC LOGICAL UNIT NOT READY, CAUSE NOT REPORTABLE |
-| 04 01 DTLPWRSOMC LOGICAL UNIT IS IN PROCESS OF BECOMING READY |
-| 04 02 DTLPWRSOMC LOGICAL UNIT NOT READY, INITIALIZING COMMAND REQUIRED |
-| 04 03 DTLPWRSOMC LOGICAL UNIT NOT READY, MANUAL INTERVENTION REQUIRED |
-| 04 04 DTL O LOGICAL UNIT NOT READY, FORMAT IN PROGRESS |
-| 05 00 DTL WRSOMC LOGICAL UNIT DOES NOT RESPOND TO SELECTION |
-| 06 00 DWR OM NO REFERENCE POSITION FOUND |
-| 07 00 DTL WRSOM MULTIPLE PERIPHERAL DEVICES SELECTED |
-| 08 00 DTL WRSOMC LOGICAL UNIT COMMUNICATION FAILURE |
-| 08 01 DTL WRSOMC LOGICAL UNIT COMMUNICATION TIME-OUT |
-| 08 02 DTL WRSOMC LOGICAL UNIT COMMUNICATION PARITY ERROR |
-| 09 00 DT WR O TRACK FOLLOWING ERROR |
-| 09 01 WR O TRA CKING SERVO FAILURE |
-| 09 02 WR O FOC US SERVO FAILURE |
-| 09 03 WR O SPI NDLE SERVO FAILURE |
-+=============================================================================+
-
-
-
-
-
-
-
-Table 364: (continued)
-+=============================================================================+
-| D - DIRECT ACCESS DEVICE |
-| .T - SEQUENTIAL ACCESS DEVICE |
-| . L - PRINTER DEVICE |
-| . P - PROCESSOR DEVICE |
-| . .W - WRITE ONCE READ MULTIPLE DEVICE |
-| . . R - READ ONLY (CD-ROM) DEVICE |
-| . . S - SCANNER DEVICE |
-| . . .O - OPTICAL MEMORY DEVICE |
-| . . . M - MEDIA CHANGER DEVICE |
-| . . . C - COMMUNICATION DEVICE |
-| . . . . |
-| ASC ASCQ DTLPWRSOMC DESCRIPTION |
-| --- ---- ----------------------------------------------------- |
-| 0A 00 DTLPWRSOMC ERROR LOG OVERFLOW |
-| 0B 00 |
-| 0C 00 T S WRITE ERROR |
-| 0C 01 D W O WRITE ERROR RECOVERED WITH AUTO REALLOCATION |
-| 0C 02 D W O WRITE ERROR - AUTO REALLOCATION FAILED |
-| 0D 00 |
-| 0E 00 |
-| 0F 00 |
-| 10 00 D W O ID CRC OR ECC ERROR |
-| 11 00 DT WRSO UNRECOVERED READ ERROR |
-| 11 01 DT W SO READ RETRIES EXHAUSTED |
-| 11 02 DT W SO ERROR TOO LONG TO CORRECT |
-| 11 03 DT W SO MULTIPLE READ ERRORS |
-| 11 04 D W O UNRECOVERED READ ERROR - AUTO REALLOCATE FAILED |
-| 11 05 WR O L-EC UNCORRECTABLE ERROR |
-| 11 06 WR O CIRC UNRECOVERED ERROR |
-| 11 07 W O DATA RESYCHRONIZATION ERROR |
-| 11 08 T INCOMPLETE BLOCK READ |
-| 11 09 T NO GAP FOUND |
-| 11 0A DT O MISCORRECTED ERROR |
-| 11 0B D W O UNRECOVERED READ ERROR - RECOMMEND REASSIGNMENT |
-| 11 0C D W O UNRECOVERED READ ERROR - RECOMMEND REWRITE THE DATA |
-| 12 00 D W O ADDRESS MARK NOT FOUND FOR ID FIELD |
-| 13 00 D W O ADDRESS MARK NOT FOUND FOR DATA FIELD |
-| 14 00 DTL WRSO RECORDED ENTITY NOT FOUND |
-| 14 01 DT WR O RECORD NOT FOUND |
-| 14 02 T FILEMARK OR SETMARK NOT FOUND |
-| 14 03 T END-OF-DATA NOT FOUND |
-| 14 04 T BLOCK SEQUENCE ERROR |
-| 15 00 DTL WRSOM RANDOM POSITIONING ERROR |
-| 15 01 DTL WRSOM MECHANICAL POSITIONING ERROR |
-| 15 02 DT WR O POSITIONING ERROR DETECTED BY READ OF MEDIUM |
-| 16 00 DW O DATA SYNCHRONIZATION MARK ERROR |
-| 17 00 DT WRSO RECOVERED DATA WITH NO ERROR CORRECTION APPLIED |
-| 17 01 DT WRSO RECOVERED DATA WITH RETRIES |
-| 17 02 DT WR O RECOVERED DATA WITH POSITIVE HEAD OFFSET |
-| 17 03 DT WR O RECOVERED DATA WITH NEGATIVE HEAD OFFSET |
-| 17 04 WR O RECOVERED DATA WITH RETRIES AND/OR CIRC APPLIED |
-| 17 05 D WR O RECOVERED DATA USING PREVIOUS SECTOR ID |
-| 17 06 D W O RECOVERED DATA WITHOUT ECC - DATA AUTO-REALLOCATED |
-| 17 07 D W O RECOVERED DATA WITHOUT ECC - RECOMMEND REASSIGNMENT |
-| 17 08 D W O RECOVERED DATA WITHOUT ECC - RECOMMEND REWRITE |
-| 18 00 DT WR O RECOVERED DATA WITH ERROR CORRECTION APPLIED |
-| 18 01 D WR O RECOVERED DATA WITH ERROR CORRECTION & RETRIES APPLIED|
-| 18 02 D WR O RECOVERED DATA - DATA AUTO-REALLOCATED |
-| 18 03 R RECOVERED DATA WITH CIRC |
-| 18 04 R RECOVERED DATA WITH LEC |
-| 18 05 D WR O RECOVERED DATA - RECOMMEND REASSIGNMENT |
-| 18 06 D WR O RECOVERED DATA - RECOMMEND REWRITE |
-+=============================================================================+
-
-
-
-
-
-
-
-Table 364: (continued)
-+=============================================================================+
-| D - DIRECT ACCESS DEVICE |
-| .T - SEQUENTIAL ACCESS DEVICE |
-| . L - PRINTER DEVICE |
-| . P - PROCESSOR DEVICE |
-| . .W - WRITE ONCE READ MULTIPLE DEVICE |
-| . . R - READ ONLY (CD-ROM) DEVICE |
-| . . S - SCANNER DEVICE |
-| . . .O - OPTICAL MEMORY DEVICE |
-| . . . M - MEDIA CHANGER DEVICE |
-| . . . C - COMMUNICATION DEVICE |
-| . . . . |
-| ASC ASCQ DTLPWRSOMC DESCRIPTION |
-| --- ---- ----------------------------------------------------- |
-| 19 00 D O DEFECT LIST ERROR |
-| 19 01 D O DEFECT LIST NOT AVAILABLE |
-| 19 02 D O DEFECT LIST ERROR IN PRIMARY LIST |
-| 19 03 D O DEFECT LIST ERROR IN GROWN LIST |
-| 1A 00 DTLPWRSOMC PARAMETER LIST LENGTH ERROR |
-| 1B 00 DTLPWRSOMC SYNCHRONOUS DATA TRANSFER ERROR |
-| 1C 00 D O DEFECT LIST NOT FOUND |
-| 1C 01 D O PRIMARY DEFECT LIST NOT FOUND |
-| 1C 02 D O GROWN DEFECT LIST NOT FOUND |
-| 1D 00 D W O MISCOMPARE DURING VERIFY OPERATION |
-| 1E 00 D W O RECOVERED ID WITH ECC |
-| 1F 00 |
-| 20 00 DTLPWRSOMC INVALID COMMAND OPERATION CODE |
-| 21 00 DT WR OM LOGICAL BLOCK ADDRESS OUT OF RANGE |
-| 21 01 M INVALID ELEMENT ADDRESS |
-| 22 00 D ILLEGAL FUNCTION (SHOULD USE 20 00, 24 00, OR 26 00) |
-| 23 00 |
-| 24 00 DTLPWRSOMC INVALID FIELD IN CDB |
-| 25 00 DTLPWRSOMC LOGICAL UNIT NOT SUPPORTED |
-| 26 00 DTLPWRSOMC INVALID FIELD IN PARAMETER LIST |
-| 26 01 DTLPWRSOMC PARAMETER NOT SUPPORTED |
-| 26 02 DTLPWRSOMC PARAMETER VALUE INVALID |
-| 26 03 DTLPWRSOMC THRESHOLD PARAMETERS NOT SUPPORTED |
-| 27 00 DT W O WRITE PROTECTED |
-| 28 00 DTLPWRSOMC NOT READY TO READY TRANSITION(MEDIUM MAY HAVE CHANGED)|
-| 28 01 M IMPORT OR EXPORT ELEMENT ACCESSED |
-| 29 00 DTLPWRSOMC POWER ON, RESET, OR BUS DEVICE RESET OCCURRED |
-| 2A 00 DTL WRSOMC PARAMETERS CHANGED |
-| 2A 01 DTL WRSOMC MODE PARAMETERS CHANGED |
-| 2A 02 DTL WRSOMC LOG PARAMETERS CHANGED |
-| 2B 00 DTLPWRSO C COPY CANNOT EXECUTE SINCE HOST CANNOT DISCONNECT |
-| 2C 00 DTLPWRSOMC COMMAND SEQUENCE ERROR |
-| 2C 01 S TOO MANY WINDOWS SPECIFIED |
-| 2C 02 S INVALID COMBINATION OF WINDOWS SPECIFIED |
-| 2D 00 T OVERWRITE ERROR ON UPDATE IN PLACE |
-| 2E 00 |
-| 2F 00 DTLPWRSOMC COMMANDS CLEARED BY ANOTHER INITIATOR |
-| 30 00 DT WR OM INCOMPATIBLE MEDIUM INSTALLED |
-| 30 01 DT WR O CANNOT READ MEDIUM - UNKNOWN FORMAT |
-| 30 02 DT WR O CANNOT READ MEDIUM - INCOMPATIBLE FORMAT |
-| 30 03 DT CLEANING CARTRIDGE INSTALLED |
-| 31 00 DT W O MEDIUM FORMAT CORRUPTED |
-| 31 01 D L O FORMAT COMMAND FAILED |
-| 32 00 D W O NO DEFECT SPARE LOCATION AVAILABLE |
-| 32 01 D W O DEFECT LIST UPDATE FAILURE |
-| 33 00 T TAPE LENGTH ERROR |
-| 34 00 |
-| 35 00 |
-| 36 00 L RIBBON, INK, OR TONER FAILURE |
-+=============================================================================+
-
-
-
-
-
-
-
-Table 364: (continued)
-+=============================================================================+
-| D - DIRECT ACCESS DEVICE |
-| .T - SEQUENTIAL ACCESS DEVICE |
-| . L - PRINTER DEVICE |
-| . P - PROCESSOR DEVICE |
-| . .W - WRITE ONCE READ MULTIPLE DEVICE |
-| . . R - READ ONLY (CD-ROM) DEVICE |
-| . . S - SCANNER DEVICE |
-| . . .O - OPTICAL MEMORY DEVICE |
-| . . . M - MEDIA CHANGER DEVICE |
-| . . . C - COMMUNICATION DEVICE |
-| . . . . |
-| ASC ASCQ DTLPWRSOMC DESCRIPTION |
-| --- ---- ----------------------------------------------------- |
-| 37 00 DTL WRSOMC ROUNDED PARAMETER |
-| 38 00 |
-| 39 00 DTL WRSOMC SAVING PARAMETERS NOT SUPPORTED |
-| 3A 00 DTL WRSOM MEDIUM NOT PRESENT |
-| 3B 00 TL SEQUENTIAL POSITIONING ERROR |
-| 3B 01 T TAPE POSITION ERROR AT BEGINNING-OF-MEDIUM |
-| 3B 02 T TAPE POSITION ERROR AT END-OF-MEDIUM |
-| 3B 03 L TAPE OR ELECTRONIC VERTICAL FORMS UNIT NOT READY |
-| 3B 04 L SLEW FAILURE |
-| 3B 05 L PAPER JAM |
-| 3B 06 L FAILED TO SENSE TOP-OF-FORM |
-| 3B 07 L FAILED TO SENSE BOTTOM-OF-FORM |
-| 3B 08 T REPOSITION ERROR |
-| 3B 09 S READ PAST END OF MEDIUM |
-| 3B 0A S READ PAST BEGINNING OF MEDIUM |
-| 3B 0B S POSITION PAST END OF MEDIUM |
-| 3B 0C S POSITION PAST BEGINNING OF MEDIUM |
-| 3B 0D M MEDIUM DESTINATION ELEMENT FULL |
-| 3B 0E M MEDIUM SOURCE ELEMENT EMPTY |
-| 3C 00 |
-| 3D 00 DTLPWRSOMC INVALID BITS IN IDENTIFY MESSAGE |
-| 3E 00 DTLPWRSOMC LOGICAL UNIT HAS NOT SELF-CONFIGURED YET |
-| 3F 00 DTLPWRSOMC TARGET OPERATING CONDITIONS HAVE CHANGED |
-| 3F 01 DTLPWRSOMC MICROCODE HAS BEEN CHANGED |
-| 3F 02 DTLPWRSOMC CHANGED OPERATING DEFINITION |
-| 3F 03 DTLPWRSOMC INQUIRY DATA HAS CHANGED |
-| 40 00 D RAM FAILURE (SHOULD USE 40 NN) |
-| 40 NN DTLPWRSOMC DIAGNOSTIC FAILURE ON COMPONENT NN (80H-FFH) |
-| 41 00 D DATA PATH FAILURE (SHOULD USE 40 NN) |
-| 42 00 D POWER-ON OR SELF-TEST FAILURE (SHOULD USE 40 NN) |
-| 43 00 DTLPWRSOMC MESSAGE ERROR |
-| 44 00 DTLPWRSOMC INTERNAL TARGET FAILURE |
-| 45 00 DTLPWRSOMC SELECT OR RESELECT FAILURE |
-| 46 00 DTLPWRSOMC UNSUCCESSFUL SOFT RESET |
-| 47 00 DTLPWRSOMC SCSI PARITY ERROR |
-| 48 00 DTLPWRSOMC INITIATOR DETECTED ERROR MESSAGE RECEIVED |
-| 49 00 DTLPWRSOMC INVALID MESSAGE ERROR |
-| 4A 00 DTLPWRSOMC COMMAND PHASE ERROR |
-| 4B 00 DTLPWRSOMC DATA PHASE ERROR |
-| 4C 00 DTLPWRSOMC LOGICAL UNIT FAILED SELF-CONFIGURATION |
-| 4D 00 |
-| 4E 00 DTLPWRSOMC OVERLAPPED COMMANDS ATTEMPTED |
-| 4F 00 |
-| 50 00 T WRITE APPEND ERROR |
-| 50 01 T WRITE APPEND POSITION ERROR |
-| 50 02 T POSITION ERROR RELATED TO TIMING |
-| 51 00 T O ERASE FAILURE |
-| 52 00 T CARTRIDGE FAULT |
-+=============================================================================+
-
-
-
-
-
-
-
-Table 364: (continued)
-+=============================================================================+
-| D - DIRECT ACCESS DEVICE |
-| .T - SEQUENTIAL ACCESS DEVICE |
-| . L - PRINTER DEVICE |
-| . P - PROCESSOR DEVICE |
-| . .W - WRITE ONCE READ MULTIPLE DEVICE |
-| . . R - READ ONLY (CD-ROM) DEVICE |
-| . . S - SCANNER DEVICE |
-| . . .O - OPTICAL MEMORY DEVICE |
-| . . . M - MEDIA CHANGER DEVICE |
-| . . . C - COMMUNICATION DEVICE |
-| . . . . |
-| ASC ASCQ DTLPWRSOMC DESCRIPTION |
-| --- ---- ----------------------------------------------------- |
-| 53 00 DTL WRSOM MEDIA LOAD OR EJECT FAILED |
-| 53 01 T UNLOAD TAPE FAILURE |
-| 53 02 DT WR OM MEDIUM REMOVAL PREVENTED |
-| 54 00 P SCSI TO HOST SYSTEM INTERFACE FAILURE |
-| 55 00 P SYSTEM RESOURCE FAILURE |
-| 56 00 |
-| 57 00 R UNABLE TO RECOVER TABLE-OF-CONTENTS |
-| 58 00 O GENERATION DOES NOT EXIST |
-| 59 00 O UPDATED BLOCK READ |
-| 5A 00 DTLPWRSOM OPERATOR REQUEST OR STATE CHANGE INPUT (UNSPECIFIED) |
-| 5A 01 DT WR OM OPERATOR MEDIUM REMOVAL REQUEST |
-| 5A 02 DT W O OPERATOR SELECTED WRITE PROTECT |
-| 5A 03 DT W O OPERATOR SELECTED WRITE PERMIT |
-| 5B 00 DTLPWRSOM LOG EXCEPTION |
-| 5B 01 DTLPWRSOM THRESHOLD CONDITION MET |
-| 5B 02 DTLPWRSOM LOG COUNTER AT MAXIMUM |
-| 5B 03 DTLPWRSOM LOG LIST CODES EXHAUSTED |
-| 5C 00 D O RPL STATUS CHANGE |
-| 5C 01 D O SPINDLES SYNCHRONIZED |
-| 5C 02 D O SPINDLES NOT SYNCHRONIZED |
-| 5D 00 |
-| 5E 00 |
-| 5F 00 |
-| 60 00 S LAMP FAILURE |
-| 61 00 S VIDEO ACQUISITION ERROR |
-| 61 01 S UNABLE TO ACQUIRE VIDEO |
-| 61 02 S OUT OF FOCUS |
-| 62 00 S SCAN HEAD POSITIONING ERROR |
-| 63 00 R END OF USER AREA ENCOUNTERED ON THIS TRACK |
-| 64 00 R ILLEGAL MODE FOR THIS TRACK |
-| 65 00 |
-| 66 00 |
-| 67 00 |
-| 68 00 |
-| 69 00 |
-| 6A 00 |
-| 6B 00 |
-| 6C 00 |
-| 6D 00 |
-| 6E 00 |
-| 6F 00 |
-+=============================================================================+
-
-
-
-
-
-
-
-Table 364: (concluded)
-+=============================================================================+
-| D - DIRECT ACCESS DEVICE |
-| .T - SEQUENTIAL ACCESS DEVICE |
-| . L - PRINTER DEVICE |
-| . P - PROCESSOR DEVICE |
-| . .W - WRITE ONCE READ MULTIPLE DEVICE |
-| . . R - READ ONLY (CD-ROM) DEVICE |
-| . . S - SCANNER DEVICE |
-| . . .O - OPTICAL MEMORY DEVICE |
-| . . . M - MEDIA CHANGER DEVICE |
-| . . . C - COMMUNICATION DEVICE |
-| . . . . |
-| ASC ASCQ DTLPWRSOMC DESCRIPTION |
-| --- ---- ----------------------------------------------------- |
-| 70 00 |
-| 71 00 |
-| 72 00 |
-| 73 00 |
-| 74 00 |
-| 75 00 |
-| 76 00 |
-| 77 00 |
-| 78 00 |
-| 79 00 |
-| 7A 00 |
-| 7B 00 |
-| 7C 00 |
-| 7D 00 |
-| 7E 00 |
-| 7F 00 |
-| |
-| 80 xxh \ |
-| THROUGH > VENDOR SPECIFIC. |
-| FF xxh / |
-| |
-| xxh 80 \ |
-| THROUGH > VENDOR SPECIFIC QUALIFICATION OF STANDARD ASC. |
-| xxh FF / |
-| ALL CODES NOT SHOWN OR BLANK ARE RESERVED. |
-+=============================================================================+
-
-
-
-
-
-----
-
-!!23. A SCSI command code quick reference
-
-
-
-
-
-Table 365 is a numerical order listing of the command operation codes.
-Table 365: SCSI-2 Operation Codes
-+=============================================================================+
-| D - DIRECT ACCESS DEVICE Device Column Key |
-| .T - SEQUENTIAL ACCESS DEVICE M = Mandatory |
-| . L - PRINTER DEVICE O = Optional |
-| . P - PROCESSOR DEVICE V = Vendor Specific|
-| . .W - WRITE ONCE READ MULTIPLE DEVICE R = Reserved |
-| . . R - READ ONLY (CD-ROM) DEVICE |
-| . . S - SCANNER DEVICE |
-| . . .O - OPTICAL MEMORY DEVICE |
-| . . . M - MEDIA CHANGER DEVICE |
-| . . . C - COMMUNICATION DEVICE |
-| . . . . |
-| OP DTLPWRSOMC Description |
-|----------+----------+-------------------------------------------------------|
-| 00 MMMMMMMMMM TEST UNIT READY |
-| 01 M REWIND |
-| 01 O V OO OO REZERO UNIT |
-| 02 VVVVVV V |
-| 03 MMMMMMMMMM REQUEST SENSE |
-| 04 O FORMAT |
-| 04 M O FORMAT UNIT |
-| 05 VMVVVV V READ BLOCK LIMITS |
-| 06 VVVVVV V |
-| 07 O INITIALIZE ELEMENT STATUS |
-| 07 OVV O OV REASSIGN BLOCKS |
-| 08 M GET MESSAGE(06) |
-| 08 OMV OO OV READ(06) |
-| 08 O RECEIVE |
-| 09 VVVVVV V |
-| 0A M PRINT |
-| 0A M SEND MESSAGE(06) |
-| 0A M SEND(06) |
-| 0A OM O OV WRITE(06) |
-| 0B O OO OV SEEK(06) |
-| 0B O SLEW AND PRINT |
-| 0C VVVVVV V |
-| 0D VVVVVV V |
-| 0E VVVVVV V |
-| 0F VOVVVV V READ REVERSE |
-| 10 O O SYNCHRONIZE BUFFER |
-| 10 VM VVV WRITE FILEMARKS |
-| 11 VMVVVV SPACE |
-| 12 MMMMMMMMMM INQUIRY |
-| 13 VOVVVV VERIFY(06) |
-| 14 VOOVVV RECOVER BUFFERED DATA |
-| 15 OMO OOOOOO MODE SELECT(06) |
-| 16 M MM MO RESERVE |
-| 16 MM M RESERVE UNIT |
-| 17 M MM MO RELEASE |
-| 17 MM M RELEASE UNIT |
-| 18 OOOOOOOO COPY |
-| 19 VMVVVV ERASE |
-| 1A OMO OOOOOO MODE SENSE(06) |
-| 1B O LOAD UNLOAD |
-| 1B O SCAN |
-| 1B O STOP PRINT |
-| 1B O OO O STOP START UNIT |
-+=============================================================================+
-
-
-
-
-
-
-
-Table 365: (continued)
-+=============================================================================+
-| D - DIRECT ACCESS DEVICE Device Column Key |
-| .T - SEQUENTIAL ACCESS DEVICE M = Mandatory |
-| . L - PRINTER DEVICE O = Optional |
-| . P - PROCESSOR DEVICE V = Vendor Specific|
-| . .W - WRITE ONCE READ MULTIPLE DEVICE R = Reserved |
-| . . R - READ ONLY (CD-ROM) DEVICE |
-| . . S - SCANNER DEVICE |
-| . . .O - OPTICAL MEMORY DEVICE |
-| . . . M - MEDIA CHANGER DEVICE |
-| . . . C - COMMUNICATION DEVICE |
-| . . . . |
-| OP DTLPWRSOMC Description |
-|----------+----------+-------------------------------------------------------|
-| 1C OOOOOOOOOO RECEIVE DIAGNOSTIC RESULTS |
-| 1D MMMMMMMMMM SEND DIAGNOSTIC |
-| 1E OO OO OO PREVENT ALLOW MEDIUM REMOVAL |
-| 1F |
-| 20 V VV V |
-| 21 V VV V |
-| 22 V VV V |
-| 23 V VV V |
-| 24 V VVM SET WINDOW |
-| 25 O GET WINDOW |
-| 25 M M M READ CAPACITY |
-| 25 M READ CD-ROM CAPACITY |
-| 26 V VV |
-| 27 V VV |
-| 28 O GET MESSAGE(10) |
-| 28 M MMMM READ(10) |
-| 29 V VV O READ GENERATION |
-| 2A O SEND MESSAGE(10) |
-| 2A O SEND(10) |
-| 2A M M M WRITE(10) |
-| 2B O LOCATE |
-| 2B O POSITION TO ELEMENT |
-| 2B O OO O SEEK(10) |
-| 2C V O ERASE(10) |
-| 2D V O O READ UPDATED BLOCK |
-| 2E O O O WRITE AND VERIFY(10) |
-| 2F O OO O VERIFY(10) |
-| 30 O OO O SEARCH DATA HIGH(10) |
-| 31 O OBJECT POSITION |
-| 31 O OO O SEARCH DATA EQUAL(10) |
-| 32 O OO O SEARCH DATA LOW(10) |
-| 33 O OO O SET LIMITS(10) |
-| 34 O GET DATA BUFFER STATUS |
-| 34 O OO O PRE-FETCH |
-| 34 O READ POSITION |
-| 35 O OO O SYNCHRONIZE CACHE |
-| 36 O OO O LOCK UNLOCK CACHE |
-| 37 O O READ DEFECT DATA(10) |
-| 38 O O MEDIUM SCAN |
-| 39 OOOOOOOO COMPARE |
-| 3A OOOOOOOO COPY AND VERIFY |
-| 3B OOOOOOOOOO WRITE BUFFER |
-| 3C OOOOOOOOOO READ BUFFER |
-| 3D O O UPDATE BLOCK |
-| 3E O OO O READ LONG |
-| 3F O O O WRITE LONG |
-+=============================================================================+
-
-
-
-
-
-
-
-Table 365: (continued)
-+=============================================================================+
-| D - DIRECT ACCESS DEVICE Device Column Key |
-| .T - SEQUENTIAL ACCESS DEVICE M = Mandatory |
-| . L - PRINTER DEVICE O = Optional |
-| . P - PROCESSOR DEVICE V = Vendor Specific|
-| . .W - WRITE ONCE READ MULTIPLE DEVICE R = Reserved |
-| . . R - READ ONLY (CD-ROM) DEVICE |
-| . . S - SCANNER DEVICE |
-| . . .O - OPTICAL MEMORY DEVICE |
-| . . . M - MEDIA CHANGER DEVICE |
-| . . . C - COMMUNICATION DEVICE |
-| . . . . |
-| OP DTLPWRSOMC Description |
-|----------+----------+-------------------------------------------------------|
-| 40 OOOOOOOOOO CHANGE DEFINITION |
-| 41 O WRITE SAME |
-| 42 O READ SUB-CHANNEL |
-| 43 O READ TOC |
-| 44 O READ HEADER |
-| 45 O PLAY AUDIO(10) |
-| 46 |
-| 47 O PLAY AUDIO MSF |
-| 48 O PLAY AUDIO TRACK INDEX |
-| 49 O PLAY TRACK RELATIVE(10) |
-| 4A |
-| 4B O PAUSE RESUME |
-| 4C OOOOOOOOOO LOG SELECT |
-| 4D OOOOOOOOOO LOG SENSE |
-| 4E |
-| 4F |
-| 50 |
-| 51 |
-| 52 |
-| 53 |
-| 54 |
-| 55 OOO OOOOOO MODE SELECT(10) |
-| 56 |
-| 57 |
-| 58 |
-| 59 |
-| 5A OOO OOOOOO MODE SENSE(10) |
-| 5B |
-| 5C |
-| 5D |
-| 5E |
-| 5F |
-+=============================================================================+
-
-
-
-
-
-
-
-Table 365: (concluded)
-+=============================================================================+
-| D - DIRECT ACCESS DEVICE Device Column Key |
-| .T - SEQUENTIAL ACCESS DEVICE M = Mandatory |
-| . L - PRINTER DEVICE O = Optional |
-| . P - PROCESSOR DEVICE V = Vendor Specific|
-| . .W - WRITE ONCE READ MULTIPLE DEVICE R = Reserved |
-| . . R - READ ONLY (CD-ROM) DEVICE |
-| . . S - SCANNER DEVICE |
-| . . .O - OPTICAL MEMORY DEVICE |
-| . . . M - MEDIA CHANGER DEVICE |
-| . . . C - COMMUNICATION DEVICE |
-| . . . . |
-| OP DTLPWRSOMC Description |
-|----------+----------+-------------------------------------------------------|
-| A0 |
-| A1 |
-| A2 |
-| A3 |
-| A4 |
-| A5 M MOVE MEDIUM |
-| A5 O PLAY AUDIO(12) |
-| A6 O EXCHANGE MEDIUM |
-| A7 |
-| A8 O GET MESSAGE(12) |
-| A8 OO O READ(12) |
-| A9 O PLAY TRACK RELATIVE(12) |
-| AA O SEND MESSAGE(12) |
-| AA O O WRITE(12) |
-| AB |
-| AC O ERASE(12) |
-| AD |
-| AE O O WRITE AND VERIFY(12) |
-| AF OO O VERIFY(12) |
-| B0 OO O SEARCH DATA HIGH(12) |
-| B1 OO O SEARCH DATA EQUAL(12) |
-| B2 OO O SEARCH DATA LOW(12) |
-| B3 OO O SET LIMITS(12) |
-| B4 |
-| B5 |
-| B5 O REQUEST VOLUME ELEMENT ADDRESS |
-| B6 |
-| B6 O SEND VOLUME TAG |
-| B7 O READ DEFECT DATA(12) |
-| B8 |
-| B8 O READ ELEMENT STATUS |
-| B9 |
-| BA |
-| BB |
-| BC |
-| BD |
-| BE |
-| BF |
-+=============================================================================+
-
-
-
-
-
-----
-
-!!24. Example programs
-
-
-Here is the C example program, which requests manufacturer/model and
-reports if a medium is loaded in the device.
-
-
-#define DEVICE "/dev/sgc"
-/* Example program to demonstrate the generic SCSI interface */
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <scsi/sg.h>
-#define SCSI_OFF sizeof(struct sg_header)
-static unsigned char cmd[[SCSI_OFF + 18]; /* SCSI command buffer */
-int fd; /* SCSI device/file descriptor */
-/* process a complete scsi cmd. Use the generic scsi interface. */
-static int handle_scsi_cmd(unsigned cmd_len, /* command length */
-unsigned in_size, /* input data size */
-unsigned char *i_buff, /* input buffer */
-unsigned out_size, /* output data size */
-unsigned char *o_buff /* output buffer */
-)
-{
-int status = ;
-struct sg_header *sg_hd;
-/* safety checks */
-if (!cmd_len) return -1; /* need a cmd_len != 0 */
-if (!i_buff) return -1; /* need an input buffer != NULL */
-#ifdef SG_BIG_BUFF
-if (SCSI_OFF + cmd_len + in_size > SG_BIG_BUFF) return -1;
-if (SCSI_OFF + out_size > SG_BIG_BUFF) return -1;
-#else
-if (SCSI_OFF + cmd_len + in_size > 4096) return -1;
-if (SCSI_OFF + out_size > 4096) return -1;
-#endif
-if (!o_buff) out_size = ;
-/* generic scsi device header construction */
-sg_hd = (struct sg_header *) i_buff;
-sg_hd->reply_len = SCSI_OFF + out_size;
-sg_hd->twelve_byte = cmd_len == 12;
-sg_hd->result = ;
-#if
-sg_hd->pack_len = SCSI_OFF + cmd_len + in_size; /* not necessary */
-sg_hd->pack_id; /* not used */
-sg_hd->other_flags; /* not used */
-#endif
-/* send command */
-status = write( fd, i_buff, SCSI_OFF + cmd_len + in_size );
-if ( status < 0 || status != SCSI_OFF + cmd_len + in_size ||
-sg_hd->result ) {
-/* some error happened */
-fprintf( stderr, "write(generic) result = 0x%x cmd = 0x%x\n",
-sg_hd->result, i_buff[[SCSI_OFF] );
-perror("");
-return status;
-}
-if (!o_buff) o_buff = i_buff; /* buffer pointer check */
-/* retrieve result */
-status = read( fd, o_buff, SCSI_OFF + out_size);
-if ( status < 0 || status != SCSI_OFF + out_size || sg_hd->result ) {
-/* some error happened */
-fprintf( stderr, "read(generic) result = 0x%x cmd = 0x%x\n",
-sg_hd->result, o_buff[[SCSI_OFF] );
-fprintf( stderr, "read(generic) sense "
-"%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x\n",
-sg_hd->sense_buffer[[], sg_hd->sense_buffer[[1],
-sg_hd->sense_buffer[[2], sg_hd->sense_buffer[[3],
-sg_hd->sense_buffer[[4], sg_hd->sense_buffer[[5],
-sg_hd->sense_buffer[[6], sg_hd->sense_buffer[[7],
-sg_hd->sense_buffer[[8], sg_hd->sense_buffer[[9],
-sg_hd->sense_buffer[[10], sg_hd->sense_buffer[[11],
-sg_hd->sense_buffer[[12], sg_hd->sense_buffer[[13],
-sg_hd->sense_buffer[[14], sg_hd->sense_buffer[[15]);
-if (status < )
-perror("");
-}
-/* Look if we got what we expected to get */
-if (status == SCSI_OFF + out_size) status = ; /* got them all */
-return status; /* 0 means no error */
-}
-#define INQUIRY_CMD 0x12
-#define INQUIRY_CMDLEN 6
-#define INQUIRY_REPLY_LEN 96
-#define INQUIRY_VENDOR 8 /* Offset in reply data to vendor name */
-/* request vendor brand and model */
-static unsigned char *Inquiry ( void )
-{
-unsigned char Inqbuffer[[ SCSI_OFF + INQUIRY_REPLY_LEN ];
-unsigned char cmdblk [[ INQUIRY_CMDLEN ] =
-{ INQUIRY_CMD, /* command */
-, /* lun/reserved */
-, /* page code */
-, /* reserved */
-INQUIRY_REPLY_LEN, /* allocation length */
-0 };/* reserved/flag/link */
-memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) );
-/*
-* +------------------+
-* | struct sg_header | <- cmd
-* +------------------+
-* | copy of cmdblk | <- cmd + SCSI_OFF
-* +------------------+
-*/
-if (handle_scsi_cmd(sizeof(cmdblk), , cmd,
-sizeof(Inqbuffer) - SCSI_OFF, Inqbuffer )) {
-fprintf( stderr, "Inquiry failed\n" );
-exit(2);
-}
-return (Inqbuffer + SCSI_OFF);
-}
-#define TESTUNITREADY_CMD
-#define TESTUNITREADY_CMDLEN 6
-#define ADD_SENSECODE 12
-#define ADD_SC_QUALIFIER 13
-#define NO_MEDIA_SC 0x3a
-#define NO_MEDIA_SCQ 0x00
-int !TestForMedium ( void )
-{
-/* request READY status */
-static unsigned char cmdblk [[TESTUNITREADY_CMDLEN] = {
-TESTUNITREADY_CMD, /* command */
-, /* lun/reserved */
-, /* reserved */
-, /* reserved */
-, /* reserved */
-};/* reserved */
-memcpy( cmd + SCSI_OFF, cmdblk, sizeof(cmdblk) );
-/*
-* +------------------+
-* | struct sg_header | <- cmd
-* +------------------+
-* | copy of cmdblk | <- cmd + SCSI_OFF
-* +------------------+
-*/
-if (handle_scsi_cmd(sizeof(cmdblk), , cmd,
-, NULL)) {
-fprintf (stderr, "Test unit ready failed\n");
-exit(2);
-}
-return
-*(((struct sg_header*)cmd)->sense_buffer +ADD_SENSECODE) !=
-NO_MEDIA_SC ||
-*(((struct sg_header*)cmd)->sense_buffer +ADD_SC_QUALIFIER) !=
-NO_MEDIA_SCQ;
-}
-void main( void )
-{
-fd = open(DEVICE, O_RDWR);
-if (fd < ) {
-fprintf( stderr, "Need read/write permissions for "DEVICE"
.\n" );
-exit(1);
-}
-/* print some fields of the Inquiry result */
-printf( "%s\n", Inquiry() + INQUIRY_VENDOR );
-/* look if medium is loaded */
-if (!!TestForMedium()) {
-printf("device is unloaded\n");
-} else {
-printf("device is loaded\n");
-}
-}
-
-
-----
+Describe
[HowToSCSIProgrammingHOWTO
] here.