mscClass.h 3 KB
#ifndef	_MSC_CLASS_H_
#define	_MSC_CLASS_H_

#define	IN
#define	OUT
#define	INOUT

/*
	bulk cbw & csw
*/

#define	CBW_SIGNATURE	0x43425355
#define	CSW_SIGNATURE	0x53425355

#define	CBW_LUN_MASK		0x0F
#define	CBW_CBLEN_MASK		0x1F

#define	CBW_FLAG_DIR_OUT	0x00
#define	CBW_FLAG_DIR_IN		0x80

#define	MAX_CBWCB_LENGTH	0x10
typedef struct {
	U32 dSignature;
	U32	dTag;
	U32 dDataTransferLength;
	U8	bmFlags;
	U8	bLUN;
	U8	bCBLength;

	U8	*cdb;
}	MSC_BULK_CBW;
#define	CBW_LENGTH		0x1F
#define	CBW_CDB_START_POS	15


//	CSW status define
#define	CSW_CMD_PASS	0x00
#define	CSW_CMD_FAIL	0x01
#define	CSW_PHASE_ERR	0x02

typedef struct {
	U32 dSignature;
	U32 dTag;
	U32	dataResidue;
	U8	bStatus;
}	MSC_BULK_CSW;
#define	CSW_LENGTH	0x0D

/*
	reduced block command set
*/
#define	RBC_COMMAND_TEST_UNIT_READY					0x00
#define	RBC_COMMAND_REQUEST_SENSE					0x03
#define	RBC_COMMAND_FORMAT_UNIT						0x04
#define	RBC_COMMAND_INQUIRY							0x12
#define	RBC_COMMAND_MODE_SELECT_6					0x15
#define	RBC_COMMAND_RESERVE_6						0x16
#define	RBC_COMMAND_RELEASE_6						0x17
#define	RBC_COMMAND_MODE_SENSE_6					0x1A
#define	RBC_COMMAND_START_STOP_UNIT					0x1B
#define	RBC_COMMAND_PREVENT_ALLOW_MEDIUM_REMOVAL	0x1E
#define	RBC_COMMAND_READ_CAPACITY					0x25
#define	RBC_COMMAND_READ_10							0x28
#define	RBC_COMMAND_WRITE_10						0x2A
#define	RBC_COMMAND_VERIFY_10						0x2F
#define	RBC_COMMAND_SYNCHRONIZE_CACHE				0x35
#define	RBC_COMMAND_WRITE_BUFFER					0x3B
#define	RBC_COMMAND_PERSISTENT_RESERVE_IN			0x5E
#define	RBC_COMMAND_PERSISTENT_RESERVE_OUT			0x5F

#define	SCSI_CMD_MODE_SENSE_10						0x5A


//definition for MODE_SENSE
#define	PAGE_CONTROL_CURRENT		0x00
#define	PAGE_CONTROL_CHANGE			0x01
#define	PAGE_CONTROL_DEFAULT		0x02
#define	PAGE_CONTROL_SAVED			0x03

#define	WRITE_PROTECT_MASK			0x80

/*
	scsi sense key define
*/
#define	SCSI_SENSEKEY_NO_SENSE				0x00
#define	SCSI_SENSEKEY_RECOVERED_ERROR		0x01
#define	SCSI_SENSEKEY_NOT_READY				0x02
#define	SCSI_SENSEKEY_MEDIUM_ERROR			0x03
#define	SCSI_SENSEKEY_HARDWARE_ERROR		0x04
#define	SCSI_SENSEKEY_ILLEGAL_REQUEST		0x05
#define	SCSI_SENSEKEY_UNIT_ATTENTION		0x06
#define	SCSI_SENSEKEY_DATA_PROTECT			0x07
#define	SCSI_SENSEKEY_BLANK_CHECK			0x08
#define	SCSI_SENSEKEY_VENDOR_SPECIFIC		0x09
#define	SCSI_SENSEKEY_COPY_ABORTED			0x0A
#define	SCSI_SENSEKEY_ABORTED_COMMAND		0x0B
#define	SCSI_SENSEKEY_VOLUME_OVERFLOW		0x0D
#define	SCSI_SENSEKEY_MISCOMPARE			0x0E
#define	SCSI_SENSEKEY_RESERVED				0x0F

// additional sense code (ASC) & ASCQ
#define	SCSI_ASC_ASCQ_NO_ADDITIONAL_SENSE_INFO				(U16)0x0000
#define SCSI_ASC_ASCQ_MEDIUM_NOT_PRESENT					(U16)0x3A00
#define SCSI_ASC_ASCQ_INVALID_COMMAND_OPERATION_CODE		(U16)0x2000
#define SCSI_ASC_ASCQ_MEDIUM_MAY_HAVE_CHANGED				(U16)0x2800
#define SCSI_ASC_ASCQ_MEDIA_NOT_PRESENT						(U16)0x3A00

#define SCSI_ASC_ASCQ_MEDIUM_MANUALINTERVENTION_REQUIRED	(U16)0x0400
#define SCSI_ASC_ASCQ_MEDIA_OUTOFRANGE 						(U16)0x2100
#define SCSI_ASC_ASCQ_WRITE_PROTECTED  						(U16)0x2700
#define SCSI_ASC_ASCQ_MEDIUM_REMOVAL_PREVENTED  	        (U16)0x5302


#endif //_MSC_CLASS_H_