#ifndef __MacSCSICommand__
#define __MacSCSICommand__
struct SCSI_6_Byte_Command {
unsigned char opcode;
unsigned char lbn3;
unsigned char lbn2;
unsigned char lbn1;
unsigned char len;
unsigned char ctrl;
};
typedef struct SCSI_6_Byte_Command SCSI_6_Byte_Command;
struct SCSI_10_Byte_Command {
unsigned char opcode;
unsigned char lun;
unsigned char lbn4;
unsigned char lbn3;
unsigned char lbn2;
unsigned char lbn1;
unsigned char pad;
unsigned char len2;
unsigned char len1;
unsigned char ctrl;
};
typedef struct SCSI_10_Byte_Command SCSI_10_Byte_Command;
struct SCSI_12_Byte_Command {
unsigned char opcode;
unsigned char lun;
unsigned char lbn4;
unsigned char lbn3;
unsigned char lbn2;
unsigned char lbn1;
unsigned char len4;
unsigned char len3;
unsigned char len2;
unsigned char len1;
unsigned char pad;
unsigned char ctrl;
};
typedef struct SCSI_12_Byte_Command SCSI_12_Byte_Command;
union SCSI_Command {
SCSI_6_Byte_Command scsi6;
SCSI_10_Byte_Command scsi10;
SCSI_12_Byte_Command scsi12;
unsigned char scsi[12];
};
typedef union SCSI_Command SCSI_Command, *SCSI_CommandPtr;
struct SCSI_Capacity_Data {
unsigned char lbn4;
unsigned char lbn3;
unsigned char lbn2;
unsigned char lbn1;
unsigned char len4;
unsigned char len3;
unsigned char len2;
unsigned char len1;
};
typedef struct SCSI_Capacity_Data SCSI_Capacity_Data;
struct SCSI_Inquiry_Data {
unsigned char devType;
unsigned char devTypeMod;
unsigned char version;
unsigned char format;
unsigned char length;
unsigned char reserved5;
unsigned char reserved6;
unsigned char flags;
unsigned char vendor[8];
unsigned char product[16];
unsigned char revision[4];
unsigned char vendorSpecific[20];
unsigned char moreReserved[40];
};
typedef struct SCSI_Inquiry_Data SCSI_Inquiry_Data;
enum {
kScsiInquiryRMB = 0x80
};
enum {
kScsiInquiryRelAdr = 0x80,
kScsiInquiryWBus32 = 0x40,
kScsiInquiryWBus16 = 0x20,
kScsiInquirySync = 0x10,
kScsiInquiryLinked = 0x08,
kScsiInquiryReserved = 0x04,
kScsiInquiryCmdQue = 0x02,
kScsiInquirySftRe = 0x01
};
enum {
kScsiDevTypeDirect = 0,
kScsiDevTypeSequential,
kScsiDevTypePrinter,
kScsiDevTypeProcessor,
kScsiDevTypeWorm,
kScsiDevTypeCDROM,
kScsiDevTypeScanner,
kScsiDevTypeOptical,
kScsiDevTypeChanger,
kScsiDevTypeComm,
kScsiDevTypeGraphicArts0A,
kScsiDevTypeGraphicArts0B,
kScsiDevTypeFirstReserved,
kScsiDevTypeUnknownOrMissing = 0x1F,
kScsiDevTypeMask = 0x1F
};
enum {
kScsiDevTypeQualifierConnected = 0x00,
kScsiDevTypeQualifierNotConnected = 0x20,
kScsiDevTypeQualifierReserved = 0x40,
kScsiDevTypeQualifierMissing = 0x60,
kScsiDevTypeQualifierVendorSpecific = 0x80,
kScsiDevTypeQualifierMask = 0xE0
};
#define kScsiDevTypeMissing \
(kScsiDevTypeUnknownOrMissing | kScsiDevTypeQualifierMissing)
struct SCSI_Sense_Data {
unsigned char errorCode;
unsigned char segmentNumber;
unsigned char senseKey;
unsigned char info[4];
unsigned char additionalSenseLength;
unsigned char reservedForCopy[4];
unsigned char additionalSenseCode;
unsigned char additionalSenseQualifier;
unsigned char fruCode;
unsigned char senseKeySpecific[2];
unsigned char additional[101];
};
typedef struct SCSI_Sense_Data SCSI_Sense_Data;
#define kScsiSenseHasLBN 0x80
#define kScsiSenseInfoValid 0x70
#define kScsiSenseInfoMask 0x70
#define kScsiSenseKeyMask 0x0F
#define kScsiSenseILI 0x20
#define kScsiSenseEOM 0x40
#define kScsiSenseFileMark 0x80
#define kScsiSenseNone 0x00
#define kScsiSenseRecoveredErr 0x01
#define kScsiSenseNotReady 0x02
#define kScsiSenseMediumErr 0x03
#define kScsiSenseHardwareErr 0x04
#define kScsiSenseIllegalReq 0x05
#define kScsiSenseUnitAtn 0x06
#define kScsiSenseDataProtect 0x07
#define kScsiSenseBlankCheck 0x08
#define kScsiSenseVendorSpecific 0x09
#define kScsiSenseCopyAborted 0x0a
#define kScsiSenseAbortedCmd 0x0b
#define kScsiSenseEqual 0x0c
#define kScsiSenseVolumeOverflow 0x0d
#define kScsiSenseMiscompare 0x0e
#define kScsiSenseCurrentErr 0x70
#define kScsiSenseDeferredErr 0x71
struct SCSI_ModeParamHeader {
unsigned char modeDataLength;
unsigned char mediumType;
unsigned char deviceSpecific;
unsigned char blockDescriptorLength;
};
typedef struct SCSI_ModeParamHeader SCSI_ModeParamHeader;
struct SCSI_ModeParamBlockDescriptor {
unsigned char densityCode;
unsigned char numberOfBlocks[3];
unsigned char reserved;
unsigned char blockLength[3];
};
typedef struct SCSI_ModeParamBlockDescriptor SCSI_ModeParamBlockDescriptor;
union SCSI_ModeParamPage {
unsigned char data[1];
struct {
unsigned char code;
unsigned char length;
} page;
};
typedef union SCSI_ModeParamPage SCSI_ModeParamPage;
struct SCSI_LogSenseParamHeader {
unsigned char pageCode;
unsigned char reserved;
unsigned char pageLength[2];
};
typedef struct SCSI_LogSenseParamHeader SCSI_LogSenseParamHeader;
union SCSI_LogSenseParamPage {
unsigned char data[1];
struct {
unsigned char parameterCode[2];
unsigned char flags;
unsigned char parameterLength;
} page;
};
typedef union SCSI_LogSenseParamPage SCSI_LogSenseParamPage;
#define kScsiStatusGood 0x00
#define kScsiStatusCheckCondition 0x02
#define kScsiStatusConditionMet 0x04
#define kScsiStatusBusy 0x08
#define kScsiStatusIntermediate 0x10
#define kScsiStatusResConflict 0x18
#define kScsiStatusQueueFull 0x28
#define kScsiStatusReservedMask 0x3e
#define kScsiCmdChangeDefinition 0x40
#define kScsiCmdCompare 0x39
#define kScsiCmdCopy 0x18
#define kScsiCmdCopyAndVerify 0x3a
#define kScsiCmdInquiry 0x12
#define kScsiCmdLogSelect 0x4c
#define kScsiCmdLogSense 0x4d
#define kScsiCmdModeSelect10 0x55
#define kScsiCmdModeSelect6 0x15
#define kScsiCmdModeSense10 0x5a
#define kScsiCmdModeSense6 0x1a
#define kScsiCmdReadBuffer 0x3c
#define kScsiCmdRecvDiagResult 0x1c
#define kScsiCmdRequestSense 0x03
#define kScsiCmdSendDiagnostic 0x1d
#define kScsiCmdTestUnitReady 0x00
#define kScsiCmdWriteBuffer 0x3b
#define kScsiCmdFormatUnit 0x04
#define kSCSICmdCopy 0x18
#define kSCSICmdCopyAndVerify 0x3a
#define kScsiCmdLockUnlockCache 0x36
#define kScsiCmdPrefetch 0x34
#define kScsiCmdPreventAllowRemoval 0x1e
#define kScsiCmdRead6 0x08
#define kScsiCmdRead10 0x28
#define kScsiCmdReadCapacity 0x25
#define kScsiCmdReadDefectData 0x37
#define kScsiCmdReadLong 0x3e
#define kScsiCmdReassignBlocks 0x07
#define kScsiCmdRelease 0x17
#define kScsiCmdReserve 0x16
#define kScsiCmdRezeroUnit 0x01
#define kScsiCmdSearchDataEql 0x31
#define kScsiCmdSearchDataHigh 0x30
#define kScsiCmdSearchDataLow 0x32
#define kScsiCmdSeek6 0x0b
#define kScsiCmdSeek10 0x2b
#define kScsiCmdSetLimits 0x33
#define kScsiCmdStartStopUnit 0x1b
#define kScsiCmdSynchronizeCache 0x35
#define kScsiCmdVerify 0x2f
#define kScsiCmdWrite6 0x0a
#define kScsiCmdWrite10 0x2a
#define kScsiCmdWriteAndVerify 0x2e
#define kScsiCmdWriteLong 0x3f
#define kScsiCmdWriteSame 0x41
#define kScsiCmdRewind 0x01
#define kScsiCmdWriteFilemarks 0x10
#define kScsiCmdSpace 0x11
#define kScsiCmdLoadUnload 0x1B
#define kScsiCmdReadCDTableOfContents 0x43
#define kScsiMsgAbort 0x06
#define kScsiMsgAbortTag 0x0d
#define kScsiMsgBusDeviceReset 0x0c
#define kScsiMsgClearQueue 0x0e
#define kScsiMsgCmdComplete 0x00
#define kScsiMsgDisconnect 0x04
#define kScsiMsgIdentify 0x80
#define kScsiMsgIgnoreWideResdue 0x23
#define kScsiMsgInitiateRecovery 0x0f
#define kScsiMsgInitiatorDetectedErr 0x05
#define kScsiMsgLinkedCmdComplete 0x0a
#define kScsiMsgLinkedCmdCompleteFlag 0x0b
#define kScsiMsgParityErr 0x09
#define kScsiMsgRejectMsg 0x07
#define kScsiMsgModifyDataPtr 0x00
#define kScsiMsgNop 0x08
#define kScsiMsgHeadOfQueueTag 0x21
#define kScsiMsgOrderedQueueTag 0x22
#define kScsiMsgSimpleQueueTag 0x20
#define kScsiMsgReleaseRecovery 0x10
#define kScsiMsgRestorePointers 0x03
#define kScsiMsgSaveDataPointers 0x02
#define kScsiMsgSyncXferReq 0x01
#define kScsiMsgWideDataXferReq 0x03
#define kScsiMsgTerminateIOP 0x11
#define kScsiMsgExtended 0x01
#define kScsiMsgEnableDisconnectMask 0x40
#define kScsiMsgTwoByte 0x20
#define kScsiMsgTwoByteMin 0x20
#define kScsiMsgTwoByteMax 0x2f
#define kScsiNormalCompletionTime (500L)
#define kScsiDATCompletionTime (60L * 1000L);
#define kScsiSpinUpCompletionTime (90L * 1000L)
#endif