SCSI Definitions (scsidefs.h)


//***************************************************************************
//
// Name:    SCSIDEFS.H
//
// Description: SCSI definitions ('C' Language)
//
//***************************************************************************

//***************************************************************************
//       %%% TARGET STATUS VALUES %%%
//***************************************************************************
#define STATUS_GOOD    0x00   // Status Good
#define STATUS_CHKCOND    0x02   // Check Condition
#define STATUS_CONDMET    0x04   // Condition Met
#define STATUS_BUSY    0x08   // Busy
#define STATUS_INTERM    0x10   // Intermediate
#define STATUS_INTCDMET   0x14   // Intermediate-condition met
#define STATUS_RESCONF    0x18   // Reservation conflict
#define STATUS_COMTERM    0x22   // Command Terminated
#define STATUS_QFULL    0x28   // Queue full

//***************************************************************************
//      %%% SCSI MISCELLANEOUS EQUATES %%%
//***************************************************************************
#define MAXLUN      7    // Maximum Logical Unit Id
#define MAXTARG     7    // Maximum Target Id
#define MAX_SCSI_LUNS    64    // Maximum Number of SCSI LUNs
#define MAX_NUM_HA     8    // Maximum Number of SCSI HA's

//---------------------------------------------------------------------------
//
//       %%% SCSI COMMAND OPCODES %%%
//
//---------------------------------------------------------------------------
//***************************************************************************
//     %%% Commands for all Device Types %%%
//***************************************************************************
#define SCSI_CHANGE_DEF   0x40   // Change Definition (Optional)
#define SCSI_COMPARE    0x39   // Compare (O)
#define SCSI_COPY     0x18   // Copy (O)
#define SCSI_COP_VERIFY   0x3A   // Copy and Verify (O)
#define SCSI_INQUIRY    0x12   // Inquiry (MANDATORY)
#define SCSI_LOG_SELECT   0x4C   // Log Select (O)
#define SCSI_LOG_SENSE    0x4D   // Log Sense (O)
#define SCSI_MODE_SEL6    0x15   // Mode Select 6-byte (Device Specific)
#define SCSI_MODE_SEL10   0x55   // Mode Select 10-byte (Device Specific)
#define SCSI_MODE_SEN6    0x1A   // Mode Sense 6-byte (Device Specific)
#define SCSI_MODE_SEN10   0x5A   // Mode Sense 10-byte (Device Specific)
#define SCSI_READ_BUFF    0x3C   // Read Buffer (O)
#define SCSI_REQ_SENSE    0x03   // Request Sense (MANDATORY)
#define SCSI_SEND_DIAG    0x1D   // Send Diagnostic (O)
#define SCSI_TST_U_RDY    0x00   // Test Unit Ready (MANDATORY)
#define SCSI_WRITE_BUFF   0x3B   // Write Buffer (O)

//***************************************************************************
//     %%% Commands Unique to Direct Access Devices %%%
//***************************************************************************
#define SCSI_COMPARE    0x39   // Compare (O)
#define SCSI_FORMAT    0x04   // Format Unit (MANDATORY)
#define SCSI_LCK_UN_CAC   0x36   // Lock Unlock Cache (O)
#define SCSI_PREFETCH    0x34   // Prefetch (O)
#define SCSI_MED_REMOVL   0x1E   // Prevent/Allow medium Removal (O)
#define SCSI_READ6     0x08   // Read 6-byte (MANDATORY)
#define SCSI_READ10    0x28   // Read 10-byte (MANDATORY)
#define SCSI_RD_CAPAC    0x25   // Read Capacity (MANDATORY)
#define SCSI_RD_DEFECT    0x37   // Read Defect Data (O)
#define SCSI_READ_LONG    0x3E   // Read Long (O)
#define SCSI_REASS_BLK    0x07   // Reassign Blocks (O)
#define SCSI_RCV_DIAG    0x1C   // Receive Diagnostic Results (O)
#define SCSI_RELEASE    0x17   // Release Unit (MANDATORY)
#define SCSI_REZERO    0x01   // Rezero Unit (O)
#define SCSI_SRCH_DAT_E   0x31   // Search Data Equal (O)
#define SCSI_SRCH_DAT_H   0x30   // Search Data High (O)
#define SCSI_SRCH_DAT_L   0x32   // Search Data Low (O)
#define SCSI_SEEK6     0x0B   // Seek 6-Byte (O)
#define SCSI_SEEK10    0x2B   // Seek 10-Byte (O)
#define SCSI_SEND_DIAG    0x1D   // Send Diagnostics (MANDATORY)
#define SCSI_SET_LIMIT    0x33   // Set Limits (O)
#define SCSI_START_STP    0x1B   // Start/Stop Unit (O)
#define SCSI_SYNC_CACHE   0x35   // Synchronize Cache (O)
#define SCSI_VERIFY    0x2F   // Verify (O)
#define SCSI_WRITE6    0x0A   // Write 6-Byte (MANDATORY)
#define SCSI_WRITE10    0x2A   // Write 10-Byte (MANDATORY)
#define SCSI_WRT_VERIFY   0x2E   // Write and Verify (O)
#define SCSI_WRITE_LONG   0x3F   // Write Long (O)
#define SCSI_WRITE_SAME   0x41   // Write Same (O)

//***************************************************************************
//   %%% Commands Unique to Sequential Access Devices %%%
//***************************************************************************
#define SCSI_ERASE     0x19   // Erase (MANDATORY)
#define SCSI_LOAD_UN    0x1b   // Load/Unload (O)
#define SCSI_LOCATE    0x2B   // Locate (O)
#define SCSI_RD_BLK_LIM   0x05   // Read Block Limits (MANDATORY)
#define SCSI_READ_POS    0x34   // Read Position (O)
#define SCSI_READ_REV    0x0F   // Read Reverse (O)
#define SCSI_REC_BF_DAT   0x14   // Recover Buffer Data (O)
#define SCSI_RESERVE    0x16   // Reserve Unit (MANDATORY)
#define SCSI_REWIND    0x01   // Rewind (MANDATORY)
#define SCSI_SPACE     0x11   // Space (MANDATORY)
#define SCSI_VERIFY_T    0x13   // Verify (Tape) (O)
#define SCSI_WRT_FILE    0x10   // Write Filemarks (MANDATORY)

//***************************************************************************
//      %%% Commands Unique to Printer Devices %%%
//***************************************************************************
#define SCSI_PRINT     0x0A   // Print (MANDATORY)
#define SCSI_SLEW_PNT    0x0B   // Slew and Print (O)
#define SCSI_STOP_PNT    0x1B   // Stop Print (O)
#define SCSI_SYNC_BUFF    0x10   // Synchronize Buffer (O)

//***************************************************************************
//     %%% Commands Unique to Processor Devices %%%
//***************************************************************************
#define SCSI_RECEIVE    0x08   // Receive (O)
#define SCSI_SEND     0x0A   // Send (O)

//***************************************************************************
//    %%% Commands Unique to Write-Once Devices %%%
//***************************************************************************
#define SCSI_MEDIUM_SCN   0x38   // Medium Scan (O)
#define SCSI_SRCHDATE10   0x31   // Search Data Equal 10-Byte (O)
#define SCSI_SRCHDATE12   0xB1   // Search Data Equal 12-Byte (O)
#define SCSI_SRCHDATH10   0x30   // Search Data High 10-Byte (O)
#define SCSI_SRCHDATH12   0xB0   // Search Data High 12-Byte (O)
#define SCSI_SRCHDATL10   0x32   // Search Data Low 10-Byte (O)
#define SCSI_SRCHDATL12   0xB2   // Search Data Low 12-Byte (O)
#define SCSI_SET_LIM_10   0x33   // Set Limits 10-Byte (O)
#define SCSI_SET_LIM_12   0xB3   // Set Limits 10-Byte (O)
#define SCSI_VERIFY10    0x2F   // Verify 10-Byte (O)
#define SCSI_VERIFY12    0xAF   // Verify 12-Byte (O)
#define SCSI_WRITE12    0xAA   // Write 12-Byte (O)
#define SCSI_WRT_VER10    0x2E   // Write and Verify 10-Byte (O)
#define SCSI_WRT_VER12    0xAE   // Write and Verify 12-Byte (O)

//***************************************************************************
//      %%% Commands Unique to CD-ROM Devices %%%
//***************************************************************************
#define SCSI_PLAYAUD_10   0x45   // Play Audio 10-Byte (O)
#define SCSI_PLAYAUD_12   0xA5   // Play Audio 12-Byte 12-Byte (O)
#define SCSI_PLAYAUDMSF   0x47   // Play Audio MSF (O)
#define SCSI_PLAYA_TKIN   0x48   // Play Audio Track/Index (O)
#define SCSI_PLYTKREL10   0x49   // Play Track Relative 10-Byte (O)
#define SCSI_PLYTKREL12   0xA9   // Play Track Relative 12-Byte (O)
#define SCSI_READCDCAP    0x25   // Read CD-ROM Capacity (MANDATORY)
#define SCSI_READHEADER   0x44   // Read Header (O)
#define SCSI_SUBCHANNEL   0x42   // Read Subchannel (O)
#define SCSI_READ_TOC    0x43   // Read TOC (O)

//***************************************************************************
//      %%% Commands Unique to Scanner Devices %%%
//***************************************************************************
#define SCSI_GETDBSTAT    0x34   // Get Data Buffer Status (O)
#define SCSI_GETWINDOW    0x25   // Get Window (O)
#define SCSI_OBJECTPOS    0x31   // Object Postion (O)
#define SCSI_SCAN     0x1B   // Scan (O)
#define SCSI_SETWINDOW    0x24   // Set Window (MANDATORY)

//***************************************************************************
//    %%% Commands Unique to Optical Memory Devices %%%
//***************************************************************************
#define SCSI_UpdateBlk    0x3D   // Update Block (O)

//***************************************************************************
//    %%% Commands Unique to Medium Changer Devices %%%
//***************************************************************************
#define SCSI_EXCHMEDIUM   0xA6   // Exchange Medium (O)
#define SCSI_INITELSTAT   0x07   // Initialize Element Status (O)
#define SCSI_POSTOELEM    0x2B   // Position to Element (O)
#define SCSI_REQ_VE_ADD   0xB5   // Request Volume Element Address (O)
#define SCSI_SENDVOLTAG   0xB6   // Send Volume Tag (O)

//***************************************************************************
//     %%% Commands Unique to Communication Devices %%%
//***************************************************************************
#define SCSI_GET_MSG_6    0x08   // Get Message 6-Byte (MANDATORY)
#define SCSI_GET_MSG_10   0x28   // Get Message 10-Byte (O)
#define SCSI_GET_MSG_12   0xA8   // Get Message 12-Byte (O)
#define SCSI_SND_MSG_6    0x0A   // Send Message 6-Byte (MANDATORY)
#define SCSI_SND_MSG_10   0x2A   // Send Message 10-Byte (O)
#define SCSI_SND_MSG_12   0xAA   // Send Message 12-Byte (O)
//---------------------------------------------------------------------------
//
//       %%% END OF SCSI COMMAND OPCODES %%%
//
//---------------------------------------------------------------------------

//***************************************************************************
//      %%% Request Sense Data Format %%%
//***************************************************************************
typedef struct {
 BYTE  ErrorCode;    // Error Code (70H or 71H)
 BYTE  SegmentNum;    // Number of current segment descriptor
 BYTE  SenseKey;    // Sense Key(See bit definitions too)
 BYTE  InfoByte0;    // Information MSB
 BYTE  InfoByte1;    // Information MID
 BYTE  InfoByte2;    // Information MID
 BYTE  InfoByte3;    // Information LSB
 BYTE  AddSenLen;    // Additional Sense Length
 BYTE  ComSpecInf0;   // Command Specific Information MSB
 BYTE  ComSpecInf1;   // Command Specific Information MID
 BYTE  ComSpecInf2;   // Command Specific Information MID
 BYTE  ComSpecInf3;   // Command Specific Information LSB
 BYTE  AddSenseCode;   // Additional Sense Code
 BYTE  AddSenQual;    // Additional Sense Code Qualifier
 BYTE  FieldRepUCode;   // Field Replaceable Unit Code
 BYTE  SenKeySpec15;   // Sense Key Specific 15th byte
 BYTE  SenKeySpec16;   // Sense Key Specific 16th byte
 BYTE  SenKeySpec17;   // Sense Key Specific 17th byte
 BYTE  AddSenseBytes;   // Additional Sense Bytes
} SENSE_DATA_FMT;

//***************************************************************************
//       %%% REQUEST SENSE ERROR CODE %%%
//***************************************************************************
#define SERROR_CURRENT    0x70   // Current Errors
#define SERROR_DEFERED    0x71   // Deferred Errors

//***************************************************************************
//      %%% REQUEST SENSE BIT DEFINITIONS %%%
//***************************************************************************
#define SENSE_VALID    0x80   // Byte 0 Bit 7
#define SENSE_FILEMRK    0x80   // Byte 2 Bit 7
#define SENSE_EOM     0x40   // Byte 2 Bit 6
#define SENSE_ILI     0x20   // Byte 2 Bit 5

//***************************************************************************
//     %%% REQUEST SENSE SENSE KEY DEFINITIONS %%%
//***************************************************************************
#define KEY_NOSENSE    0x00   // No Sense
#define KEY_RECERROR    0x01   // Recovered Error
#define KEY_NOTREADY    0x02   // Not Ready
#define KEY_MEDIUMERR    0x03   // Medium Error
#define KEY_HARDERROR    0x04   // Hardware Error
#define KEY_ILLGLREQ    0x05   // Illegal Request
#define KEY_UNITATT    0x06   // Unit Attention
#define KEY_DATAPROT    0x07   // Data Protect
#define KEY_BLANKCHK    0x08   // Blank Check
#define KEY_VENDSPEC    0x09   // Vendor Specific
#define KEY_COPYABORT    0x0A   // Copy Abort
#define KEY_EQUAL     0x0C   // Equal (Search)
#define KEY_VOLOVRFLW    0x0D   // Volume Overflow
#define KEY_MISCOMP    0x0E   // Miscompare (Search)
#define KEY_RESERVED    0x0F   // Reserved

//***************************************************************************
//      %%% PERIPHERAL DEVICE TYPE DEFINITIONS %%%
//***************************************************************************
#define DTYPE_DASD     0x00   // Disk Device
#define DTYPE_SEQD     0x01   // Tape Device
#define DTYPE_PRNT     0x02   // Printer
#define DTYPE_PROC     0x03   // Processor
#define DTYPE_WORM     0x04   // Write-once read-multiple
#define DTYPE_CROM     0x05   // CD-ROM device
#define DTYPE_SCAN     0x06   // Scanner device
#define DTYPE_OPTI     0x07   // Optical memory device
#define DTYPE_JUKE     0x08   // Medium Changer device
#define DTYPE_COMM     0x09   // Communications device
#define DTYPE_RESL     0x0A   // Reserved (low)
#define DTYPE_RESH     0x1E   // Reserved (high)
#define DTYPE_UNKNOWN    0x1F   // Unknown or no device type

//***************************************************************************
//      %%% ANSI APPROVED VERSION DEFINITIONS %%%
//***************************************************************************
#define ANSI_MAYBE     0x0  // Device may or may not be ANSI approved stand
#define ANSI_SCSI1     0x1  // Device complies to ANSI X3.131-1986 (SCSI-1)
#define ANSI_SCSI2     0x2  // Device complies to SCSI-2
#define ANSI_RESLO     0x3  // Reserved (low)
#define ANSI_RESHI     0x7  // Reserved (high)