/****************************************************************************
*                                                                           *
* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY     *
* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE       *
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR     *
* PURPOSE.                                                                  *
*                                                                           *
* Copyright (C) 1993-95  Microsoft Corporation.  All Rights Reserved.       *
*                                                                           *
****************************************************************************/

//***************************************************************************
//
// 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)
