IOSCSIMultimediaCommandsBuilder.cpp [plain text]
#include <IOKit/scsi-commands/SCSICommandDefinitions.h>
#include "IOSCSIMultimediaCommandsDevice.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 ₯ 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;
}