IOSCSIMultimediaCommandsBuilder.cpp [plain text]
#include <IOKit/scsi-commands/SCSICommandDefinitions.h>
#include "IOSCSIMultimediaCommandsDevice.h"
#include "SCSIMultimediaCommands.h"
#include "SCSIBlockCommands.h"
#define INCLUDE_OBSOLETE_APIS 1
#define DEBUG 0
#define DEBUG_ASSERT_COMPONENT_NAME_STRING "MMC"
#include "IOSCSIArchitectureModelFamilyDebugging.h"
#if 0
#pragma mark -
#pragma mark ₯ Command Builder Utility methods
#pragma mark -
#endif
bool
IOSCSIMultimediaCommandsDevice::GetBlockSize (
UInt32 * requestedByteCount,
SCSICmdField3Bit EXPECTED_SECTOR_TYPE,
SCSICmdField1Bit SYNC,
SCSICmdField2Bit HEADER_CODES,
SCSICmdField1Bit USER_DATA,
SCSICmdField1Bit EDC_ECC,
SCSICmdField2Bit ERROR_FIELD,
SCSICmdField3Bit SUBCHANNEL_SELECTION_BITS )
{
bool result = false;
UInt32 userDataSize = 0;
UInt32 edcEccSize = 0;
UInt32 headerSize = 0;
UInt32 subHeaderSize = 0;
UInt32 syncSize = 0;
check ( requestedByteCount );
require ( ( EXPECTED_SECTOR_TYPE < 6 ), ErrorExit );
require ( IsParameterValid ( SYNC, kSCSICmdFieldMask1Bit ), ErrorExit );
require ( IsParameterValid ( HEADER_CODES,
kSCSICmdFieldMask2Bit ), ErrorExit );
require ( IsParameterValid ( USER_DATA,
kSCSICmdFieldMask1Bit ), ErrorExit );
require ( IsParameterValid ( EDC_ECC, kSCSICmdFieldMask1Bit ), ErrorExit );
require ( IsParameterValid ( ERROR_FIELD,
kSCSICmdFieldMask2Bit ), ErrorExit );
switch ( ( SYNC << 4 ) | ( HEADER_CODES << 2 ) | ( USER_DATA << 1 ) | EDC_ECC )
{
case 0x00: case 0x01: case 0x05: case 0x09: case 0x0D: case 0x10: case 0x11: case 0x12: case 0x13: case 0x15: case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1D: {
return false;
}
case 0x02: case 0x03: case 0x04: case 0x08: case 0x0A: case 0x0B: case 0x0C: case 0x0E: case 0x0F: case 0x14: case 0x1E: case 0x1F: {
break;
}
case 0x06: case 0x07: case 0x16: case 0x17: case 0x1C: {
require ( ( EXPECTED_SECTOR_TYPE < 4 ), ErrorExit );
break;
}
default:
{
goto ErrorExit;
}
}
headerSize = 4;
syncSize = 12;
switch ( EXPECTED_SECTOR_TYPE )
{
case 0: case 1: {
break;
}
case 2: {
userDataSize = 2048;
edcEccSize = 288;
subHeaderSize = 0;
break;
}
case 3: {
userDataSize = 2048 + 288;
edcEccSize = 0;
subHeaderSize = 0;
break;
}
case 4: {
userDataSize = 2048;
edcEccSize = 280;
subHeaderSize = 8;
break;
}
case 5: {
userDataSize = 2048 + 280;
edcEccSize = 0;
subHeaderSize = 8;
break;
}
default:
{
goto ErrorExit;
}
}
if ( ( EXPECTED_SECTOR_TYPE == 0 ) || ( EXPECTED_SECTOR_TYPE == 1 ) )
{
*requestedByteCount = 2352;
}
else
{
*requestedByteCount = 0;
if ( SYNC )
{
*requestedByteCount += syncSize;
}
if ( HEADER_CODES & 0x01 )
{
*requestedByteCount += headerSize;
}
if ( HEADER_CODES & 0x02 )
{
*requestedByteCount += subHeaderSize;
}
if ( USER_DATA )
{
*requestedByteCount += userDataSize;
}
if ( EDC_ECC )
{
*requestedByteCount += edcEccSize;
}
}
if ( ( ERROR_FIELD & 0x03 ) == 0x01 )
{
*requestedByteCount += C2_ERROR_BLOCK_DATA_SIZE;
}
else if ( ( ERROR_FIELD & 0x03 ) == 0x02 )
{
*requestedByteCount += C2_AND_BLOCK_ERROR_BITS_SIZE;
}
require ( ( ERROR_FIELD == 0 ), ErrorExit );
if ( SUBCHANNEL_SELECTION_BITS != 0 )
{
*requestedByteCount += SUBCHANNEL_DATA_SIZE;
}
result = true;
ErrorExit:
return result;
}
SCSICmdField4Byte
IOSCSIMultimediaCommandsDevice::ConvertMSFToLBA (
SCSICmdField3Byte MSF )
{
SCSICmdField4Byte LBA = 0;
LBA = MSF >> 16; LBA *= SECONDS_IN_A_MINUTE; LBA += ( MSF >> 8 ) & 0xFF; LBA *= FRAMES_IN_A_SECOND; LBA += MSF & 0xFF;
require_action ( ( LBA >= LBA_0_OFFSET ), ErrorExit, LBA = 0 );
LBA -= LBA_0_OFFSET;
ErrorExit:
return LBA;
}
#if 0
#pragma mark -
#pragma mark ₯ Multimedia Commands Builders
#pragma mark -
#endif
bool
IOSCSIMultimediaCommandsDevice::BLANK (
SCSITaskIdentifier request,
SCSICmdField1Bit IMMED,
SCSICmdField3Bit BLANKING_TYPE,
SCSICmdField4Byte START_ADDRESS_TRACK_NUMBER,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->BLANK (
scsiRequest,
IMMED,
BLANKING_TYPE,
START_ADDRESS_TRACK_NUMBER,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::CLOSE_TRACK_SESSION (
SCSITaskIdentifier request,
SCSICmdField1Bit IMMED,
SCSICmdField1Bit SESSION,
SCSICmdField1Bit TRACK,
SCSICmdField2Byte TRACK_NUMBER,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->CLOSE_TRACK_SESSION (
scsiRequest,
IMMED,
SESSION,
TRACK,
TRACK_NUMBER,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::FORMAT_UNIT (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
IOByteCount parameterListSize,
SCSICmdField1Bit FMT_DATA,
SCSICmdField1Bit CMP_LIST,
SCSICmdField3Bit FORMAT_CODE,
SCSICmdField2Byte INTERLEAVE_VALUE,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->FORMAT_UNIT (
scsiRequest,
dataBuffer,
parameterListSize,
FMT_DATA,
CMP_LIST,
FORMAT_CODE,
INTERLEAVE_VALUE,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::GET_CONFIGURATION (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField2Bit RT,
SCSICmdField2Byte STARTING_FEATURE_NUMBER,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->GET_CONFIGURATION (
scsiRequest,
dataBuffer,
RT,
STARTING_FEATURE_NUMBER,
ALLOCATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::GET_EVENT_STATUS_NOTIFICATION (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit IMMED,
SCSICmdField1Byte NOTIFICATION_CLASS_REQUEST,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->GET_EVENT_STATUS_NOTIFICATION (
scsiRequest,
dataBuffer,
IMMED,
NOTIFICATION_CLASS_REQUEST,
ALLOCATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::GET_PERFORMANCE (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField2Bit TOLERANCE,
SCSICmdField1Bit WRITE,
SCSICmdField2Bit EXCEPT,
SCSICmdField4Byte STARTING_LBA,
SCSICmdField2Byte MAXIMUM_NUMBER_OF_DESCRIPTORS,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->GET_PERFORMANCE (
scsiRequest,
dataBuffer,
TOLERANCE,
WRITE,
EXCEPT,
STARTING_LBA,
MAXIMUM_NUMBER_OF_DESCRIPTORS,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::LOAD_UNLOAD_MEDIUM (
SCSITaskIdentifier request,
SCSICmdField1Bit IMMED,
SCSICmdField1Bit LO_UNLO,
SCSICmdField1Bit START,
SCSICmdField1Byte SLOT,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->LOAD_UNLOAD_MEDIUM (
scsiRequest,
IMMED,
LO_UNLO,
START,
SLOT,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::MECHANISM_STATUS (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->MECHANISM_STATUS (
scsiRequest,
dataBuffer,
ALLOCATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::PAUSE_RESUME (
SCSITaskIdentifier request,
SCSICmdField1Bit RESUME,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->PAUSE_RESUME (
scsiRequest,
RESUME,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::PLAY_AUDIO_10 (
SCSITaskIdentifier request,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte STARTING_LOGICAL_BLOCK_ADDRESS,
SCSICmdField2Byte PLAY_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->PLAY_AUDIO_10 (
scsiRequest,
RELADR,
STARTING_LOGICAL_BLOCK_ADDRESS,
PLAY_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::PLAY_AUDIO_12 (
SCSITaskIdentifier request,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte STARTING_LOGICAL_BLOCK_ADDRESS,
SCSICmdField4Byte PLAY_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->PLAY_AUDIO_12 (
scsiRequest,
RELADR,
STARTING_LOGICAL_BLOCK_ADDRESS,
PLAY_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::PLAY_AUDIO_MSF (
SCSITaskIdentifier request,
SCSICmdField3Byte STARTING_MSF,
SCSICmdField3Byte ENDING_MSF,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->PLAY_AUDIO_MSF (
scsiRequest,
STARTING_MSF,
ENDING_MSF,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::PLAY_CD (
SCSITaskIdentifier request,
SCSICmdField3Bit EXPECTED_SECTOR_TYPE,
SCSICmdField1Bit CMSF,
SCSICmdField4Byte STARTING_LOGICAL_BLOCK_ADDRESS,
SCSICmdField4Byte PLAY_LENGTH_IN_BLOCKS,
SCSICmdField1Bit SPEED,
SCSICmdField1Bit PORT2,
SCSICmdField1Bit PORT1,
SCSICmdField1Bit COMPOSITE,
SCSICmdField1Bit AUDIO,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->PLAY_CD (
scsiRequest,
EXPECTED_SECTOR_TYPE,
CMSF,
STARTING_LOGICAL_BLOCK_ADDRESS,
PLAY_LENGTH_IN_BLOCKS,
SPEED,
PORT2,
PORT1,
COMPOSITE,
AUDIO,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::READ_BUFFER_CAPACITY (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->READ_BUFFER_CAPACITY (
scsiRequest,
dataBuffer,
ALLOCATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::READ_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
UInt32 blockSize,
SCSICmdField1Bit DPO,
SCSICmdField1Bit FUA,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField2Byte TRANSFER_LENGTH,
SCSICmdField1Byte CONTROL )
{
bool status = false;
SCSITask * scsiRequest = NULL;
UInt64 requestedByteCount = 0;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
require_nonzero ( blockSize, ErrorExit );
requestedByteCount = TRANSFER_LENGTH * blockSize;
status = GetSCSIBlockCommandObject ( )->READ_10 (
scsiRequest,
dataBuffer,
requestedByteCount,
DPO,
FUA,
RELADR,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::READ_CD (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField3Bit EXPECTED_SECTOR_TYPE,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte STARTING_LOGICAL_BLOCK_ADDRESS,
SCSICmdField3Byte TRANSFER_LENGTH,
SCSICmdField1Bit SYNC,
SCSICmdField2Bit HEADER_CODES,
SCSICmdField1Bit USER_DATA,
SCSICmdField1Bit EDC_ECC,
SCSICmdField2Bit ERROR_FIELD,
SCSICmdField3Bit SUBCHANNEL_SELECTION_BITS,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->READ_CD (
scsiRequest,
dataBuffer,
EXPECTED_SECTOR_TYPE,
RELADR,
STARTING_LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
SYNC,
HEADER_CODES,
USER_DATA,
EDC_ECC,
ERROR_FIELD,
SUBCHANNEL_SELECTION_BITS,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::READ_CD_MSF (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField3Bit EXPECTED_SECTOR_TYPE,
SCSICmdField3Byte STARTING_MSF,
SCSICmdField3Byte ENDING_MSF,
SCSICmdField1Bit SYNC,
SCSICmdField2Bit HEADER_CODES,
SCSICmdField1Bit USER_DATA,
SCSICmdField1Bit EDC_ECC,
SCSICmdField2Bit ERROR_FIELD,
SCSICmdField3Bit SUBCHANNEL_SELECTION_BITS,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->READ_CD_MSF (
scsiRequest,
dataBuffer,
EXPECTED_SECTOR_TYPE,
STARTING_MSF,
ENDING_MSF,
SYNC,
HEADER_CODES,
USER_DATA,
EDC_ECC,
ERROR_FIELD,
SUBCHANNEL_SELECTION_BITS,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::READ_CAPACITY (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField1Bit PMI,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->READ_CAPACITY (
scsiRequest,
dataBuffer,
RELADR,
LOGICAL_BLOCK_ADDRESS,
PMI,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::READ_DISC_INFORMATION (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->READ_DISC_INFORMATION (
scsiRequest,
dataBuffer,
ALLOCATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::READ_DVD_STRUCTURE (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField4Byte ADDRESS,
SCSICmdField1Byte LAYER_NUMBER,
SCSICmdField1Byte FORMAT,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField2Bit AGID,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->READ_DVD_STRUCTURE (
scsiRequest,
dataBuffer,
ADDRESS,
LAYER_NUMBER,
FORMAT,
ALLOCATION_LENGTH,
AGID,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::READ_FORMAT_CAPACITIES (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->READ_FORMAT_CAPACITIES (
scsiRequest,
dataBuffer,
ALLOCATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::READ_HEADER (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit MSF,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->READ_HEADER (
scsiRequest,
dataBuffer,
MSF,
LOGICAL_BLOCK_ADDRESS,
ALLOCATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
#ifdef INCLUDE_OBSOLETE_APIS
bool
IOSCSIMultimediaCommandsDevice::READ_MASTER_CUE (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Byte SHEET_NUMBER,
SCSICmdField3Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->READ_MASTER_CUE (
scsiRequest,
dataBuffer,
SHEET_NUMBER,
ALLOCATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
#endif
bool
IOSCSIMultimediaCommandsDevice::READ_SUB_CHANNEL (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit MSF,
SCSICmdField1Bit SUBQ,
SCSICmdField1Byte SUB_CHANNEL_PARAMETER_LIST,
SCSICmdField1Byte TRACK_NUMBER,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->READ_SUB_CHANNEL (
scsiRequest,
dataBuffer,
MSF,
SUBQ,
SUB_CHANNEL_PARAMETER_LIST,
TRACK_NUMBER,
ALLOCATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::READ_TOC_PMA_ATIP (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit MSF,
SCSICmdField4Bit FORMAT,
SCSICmdField1Byte TRACK_SESSION_NUMBER,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->READ_TOC_PMA_ATIP (
scsiRequest,
dataBuffer,
MSF,
FORMAT,
TRACK_SESSION_NUMBER,
ALLOCATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::READ_TRACK_INFORMATION (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField2Bit ADDRESS_NUMBER_TYPE,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS_TRACK_SESSION_NUMBER,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->READ_TRACK_INFORMATION (
scsiRequest,
dataBuffer,
ADDRESS_NUMBER_TYPE,
LOGICAL_BLOCK_ADDRESS_TRACK_SESSION_NUMBER,
ALLOCATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::REPAIR_TRACK (
SCSITaskIdentifier request,
SCSICmdField2Byte TRACK_NUMBER,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->REPAIR_TRACK (
scsiRequest,
TRACK_NUMBER,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::REPORT_KEY (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField2Bit AGID,
SCSICmdField6Bit KEY_FORMAT,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->REPORT_KEY (
scsiRequest,
dataBuffer,
LOGICAL_BLOCK_ADDRESS,
ALLOCATION_LENGTH,
AGID,
KEY_FORMAT,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::RESERVE_TRACK (
SCSITaskIdentifier request,
SCSICmdField4Byte RESERVATION_SIZE,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->RESERVE_TRACK (
scsiRequest,
RESERVATION_SIZE,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::SCAN (
SCSITaskIdentifier request,
SCSICmdField1Bit DIRECT,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte SCAN_STARTING_ADDRESS_FIELD,
SCSICmdField2Bit TYPE,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->SCAN (
scsiRequest,
DIRECT,
RELADR,
SCAN_STARTING_ADDRESS_FIELD,
TYPE,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::SEND_CUE_SHEET (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField3Byte CUE_SHEET_SIZE,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->SEND_CUE_SHEET (
scsiRequest,
dataBuffer,
CUE_SHEET_SIZE,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::SEND_DVD_STRUCTURE (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Byte FORMAT,
SCSICmdField2Byte STRUCTURE_DATA_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->SEND_DVD_STRUCTURE (
scsiRequest,
dataBuffer,
FORMAT,
STRUCTURE_DATA_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::SEND_EVENT (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit IMMED,
SCSICmdField2Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->SEND_EVENT (
scsiRequest,
dataBuffer,
IMMED,
PARAMETER_LIST_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::SEND_KEY (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField2Byte PARAMETER_LIST_LENGTH,
SCSICmdField2Bit AGID,
SCSICmdField6Bit KEY_FORMAT,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->SEND_KEY (
scsiRequest,
dataBuffer,
PARAMETER_LIST_LENGTH,
AGID,
KEY_FORMAT,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::SEND_OPC_INFORMATION (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit DO_OPC,
SCSICmdField2Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->SEND_OPC_INFORMATION (
scsiRequest,
dataBuffer,
DO_OPC,
PARAMETER_LIST_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::SET_CD_SPEED (
SCSITaskIdentifier request,
SCSICmdField2Byte LOGICAL_UNIT_READ_SPEED,
SCSICmdField2Byte LOGICAL_UNIT_WRITE_SPEED,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->SET_CD_SPEED (
scsiRequest,
LOGICAL_UNIT_READ_SPEED,
LOGICAL_UNIT_WRITE_SPEED,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::SET_READ_AHEAD (
SCSITaskIdentifier request,
SCSICmdField4Byte TRIGGER_LOGICAL_BLOCK_ADDRESS,
SCSICmdField4Byte READ_AHEAD_LOGICAL_BLOCK_ADDRESS,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->SET_READ_AHEAD (
scsiRequest,
TRIGGER_LOGICAL_BLOCK_ADDRESS,
READ_AHEAD_LOGICAL_BLOCK_ADDRESS,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::SET_STREAMING (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField2Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->SET_STREAMING (
scsiRequest,
dataBuffer,
PARAMETER_LIST_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::START_STOP_UNIT (
SCSITaskIdentifier request,
SCSICmdField1Bit IMMED,
SCSICmdField4Bit POWER_CONDITIONS,
SCSICmdField1Bit LOEJ,
SCSICmdField1Bit START,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->START_STOP_UNIT (
scsiRequest,
IMMED,
POWER_CONDITIONS,
LOEJ,
START,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::STOP_PLAY_SCAN (
SCSITaskIdentifier request,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->STOP_PLAY_SCAN (
scsiRequest,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::SYNCHRONIZE_CACHE (
SCSITaskIdentifier request,
SCSICmdField1Bit IMMED,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField2Byte NUMBER_OF_BLOCKS,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->SYNCHRONIZE_CACHE (
scsiRequest,
IMMED,
RELADR,
LOGICAL_BLOCK_ADDRESS,
NUMBER_OF_BLOCKS,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::WRITE_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
UInt32 blockSize,
SCSICmdField1Bit DPO,
SCSICmdField1Bit FUA,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField2Byte TRANSFER_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->WRITE_10 (
scsiRequest,
dataBuffer,
blockSize,
DPO,
FUA,
RELADR,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIMultimediaCommandsDevice::WRITE_AND_VERIFY_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
UInt32 blockSize,
SCSICmdField1Bit DPO,
SCSICmdField1Bit BYT_CHK,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField4Byte TRANSFER_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIMultimediaCommandObject ( )->WRITE_AND_VERIFY_10 (
scsiRequest,
dataBuffer,
blockSize,
DPO,
BYT_CHK,
RELADR,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}