IOSCSIBlockCommandsBuilder.cpp [plain text]
#include <IOKit/scsi-commands/SCSICommandDefinitions.h>
#include "IOSCSIBlockCommandsDevice.h"
#define DEBUG 0
#define DEBUG_ASSERT_COMPONENT_NAME_STRING "SBC"
#if DEBUG
#define SCSI_SBC_DEVICE_DEBUGGING_LEVEL 0
#endif
#include "IOSCSIArchitectureModelFamilyDebugging.h"
#if 0
#pragma mark -
#pragma mark ₯ Block Commands Builders
#pragma mark -
#endif
bool
IOSCSIBlockCommandsDevice::ERASE_10 (
SCSITaskIdentifier request,
SCSICmdField1Bit ERA,
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 = GetSCSIBlockCommandObject ( )->ERASE_10 (
scsiRequest,
ERA,
RELADR,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::ERASE_12 (
SCSITaskIdentifier request,
SCSICmdField1Bit ERA,
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 = GetSCSIBlockCommandObject ( )->ERASE_12 (
scsiRequest,
ERA,
RELADR,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::FORMAT_UNIT(
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
IOByteCount defectListSize,
SCSICmdField1Bit FMTDATA,
SCSICmdField1Bit CMPLST,
SCSICmdField3Bit DEFECT_LIST_FORMAT,
SCSICmdField1Byte VENDOR_SPECIFIC,
SCSICmdField2Byte INTERLEAVE,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->FORMAT_UNIT (
scsiRequest,
dataBuffer,
defectListSize,
FMTDATA,
CMPLST,
DEFECT_LIST_FORMAT,
VENDOR_SPECIFIC,
INTERLEAVE,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::LOCK_UNLOCK_CACHE (
SCSITaskIdentifier request,
SCSICmdField1Bit LOCK,
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 = GetSCSIBlockCommandObject ( )->LOCK_UNLOCK_CACHE (
scsiRequest,
LOCK,
RELADR,
LOGICAL_BLOCK_ADDRESS,
NUMBER_OF_BLOCKS,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::MEDIUM_SCAN (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit WBS,
SCSICmdField1Bit ASA,
SCSICmdField1Bit RSD,
SCSICmdField1Bit PRA,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
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 = GetSCSIBlockCommandObject ( )->MEDIUM_SCAN (
scsiRequest,
dataBuffer,
WBS,
ASA,
RSD,
PRA,
RELADR,
LOGICAL_BLOCK_ADDRESS,
PARAMETER_LIST_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::PREFETCH (
SCSITaskIdentifier request,
SCSICmdField1Bit IMMED,
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 = GetSCSIBlockCommandObject ( )->PREFETCH (
scsiRequest,
IMMED,
RELADR,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::READ_6 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
UInt32 blockSize,
SCSICmdField21Bit LOGICAL_BLOCK_ADDRESS,
SCSICmdField1Byte TRANSFER_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
UInt32 requestedByteCount = 0;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
require_nonzero ( blockSize, ErrorExit );
if ( TRANSFER_LENGTH == 0 )
{
requestedByteCount = 256 * blockSize;
}
else
{
requestedByteCount = TRANSFER_LENGTH * blockSize;
}
status = GetSCSIBlockCommandObject ( )->READ_6 (
scsiRequest,
dataBuffer,
requestedByteCount,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::READ_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;
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
IOSCSIBlockCommandsDevice::READ_12 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
UInt32 blockSize,
SCSICmdField1Bit DPO,
SCSICmdField1Bit FUA,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField4Byte TRANSFER_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
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_12 (
scsiRequest,
dataBuffer,
requestedByteCount,
DPO,
FUA,
RELADR,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::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 = GetSCSIBlockCommandObject ( )->READ_CAPACITY (
scsiRequest,
dataBuffer,
RELADR,
LOGICAL_BLOCK_ADDRESS,
PMI,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::READ_DEFECT_DATA_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit PLIST,
SCSICmdField1Bit GLIST,
SCSICmdField3Bit DEFECT_LIST_FORMAT,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->READ_DEFECT_DATA_10 (
scsiRequest,
dataBuffer,
PLIST,
GLIST,
DEFECT_LIST_FORMAT,
ALLOCATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::READ_DEFECT_DATA_12 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit PLIST,
SCSICmdField1Bit GLIST,
SCSICmdField3Bit DEFECT_LIST_FORMAT,
SCSICmdField4Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->READ_DEFECT_DATA_12 (
scsiRequest,
dataBuffer,
PLIST,
GLIST,
DEFECT_LIST_FORMAT,
ALLOCATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::READ_GENERATION (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField1Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->READ_GENERATION (
scsiRequest,
dataBuffer,
RELADR,
LOGICAL_BLOCK_ADDRESS,
ALLOCATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::READ_LONG (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit CORRCT,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField2Byte BYTE_TRANSFER_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->READ_LONG (
scsiRequest,
dataBuffer,
CORRCT,
RELADR,
LOGICAL_BLOCK_ADDRESS,
BYTE_TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::READ_UPDATED_BLOCK_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit DPO,
SCSICmdField1Bit FUA,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField1Bit LATEST,
SCSICmdField15Bit GENERATION_ADDRESS,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->READ_UPDATED_BLOCK_10 (
scsiRequest,
dataBuffer,
fMediumBlockSize,
DPO,
FUA,
RELADR,
LOGICAL_BLOCK_ADDRESS,
LATEST,
GENERATION_ADDRESS,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::REASSIGN_BLOCKS (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->REASSIGN_BLOCKS (
scsiRequest,
dataBuffer,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::REBUILD (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit DPO,
SCSICmdField1Bit FUA,
SCSICmdField1Bit INTDATA,
SCSICmdField2Bit PORT_CONTROL,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField4Byte REBUILD_LENGTH,
SCSICmdField4Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->REBUILD (
scsiRequest,
dataBuffer,
DPO,
FUA,
INTDATA,
PORT_CONTROL,
LOGICAL_BLOCK_ADDRESS,
REBUILD_LENGTH,
PARAMETER_LIST_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::REGENERATE (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit DPO,
SCSICmdField1Bit FUA,
SCSICmdField1Bit INTDATA,
SCSICmdField2Bit PORT_CONTROL,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField4Byte REBUILD_LENGTH,
SCSICmdField4Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->REGENERATE (
scsiRequest,
dataBuffer,
DPO,
FUA,
INTDATA,
PORT_CONTROL,
LOGICAL_BLOCK_ADDRESS,
REBUILD_LENGTH,
PARAMETER_LIST_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::REZERO_UNIT (
SCSITaskIdentifier request,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->REZERO_UNIT (
scsiRequest,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::SEARCH_DATA_EQUAL_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit INVERT,
SCSICmdField1Bit SPNDAT,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField2Byte NUMBER_OF_BLOCKS_TO_SEARCH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->SEARCH_DATA_EQUAL_10 (
scsiRequest,
dataBuffer,
dataBuffer->getLength ( ),
INVERT,
SPNDAT,
RELADR,
LOGICAL_BLOCK_ADDRESS,
NUMBER_OF_BLOCKS_TO_SEARCH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::SEARCH_DATA_HIGH_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit INVERT,
SCSICmdField1Bit SPNDAT,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField2Byte NUMBER_OF_BLOCKS_TO_SEARCH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->SEARCH_DATA_HIGH_10 (
scsiRequest,
dataBuffer,
dataBuffer->getLength ( ),
INVERT,
SPNDAT,
RELADR,
LOGICAL_BLOCK_ADDRESS,
NUMBER_OF_BLOCKS_TO_SEARCH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::SEARCH_DATA_LOW_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit INVERT,
SCSICmdField1Bit SPNDAT,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField2Byte NUMBER_OF_BLOCKS_TO_SEARCH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->SEARCH_DATA_LOW_10 (
scsiRequest,
dataBuffer,
dataBuffer->getLength ( ),
INVERT,
SPNDAT,
RELADR,
LOGICAL_BLOCK_ADDRESS,
NUMBER_OF_BLOCKS_TO_SEARCH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::SEEK_6 (
SCSITaskIdentifier request,
SCSICmdField21Bit LOGICAL_BLOCK_ADDRESS,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->SEEK_6 (
scsiRequest,
LOGICAL_BLOCK_ADDRESS,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::SEEK_10 (
SCSITaskIdentifier request,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->SEEK_10 (
scsiRequest,
LOGICAL_BLOCK_ADDRESS,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::SET_LIMITS_10 (
SCSITaskIdentifier request,
SCSICmdField1Bit RDINH,
SCSICmdField1Bit WRINH,
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 = GetSCSIBlockCommandObject ( )->SET_LIMITS_10 (
scsiRequest,
RDINH,
WRINH,
LOGICAL_BLOCK_ADDRESS,
NUMBER_OF_BLOCKS,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::SET_LIMITS_12 (
SCSITaskIdentifier request,
SCSICmdField1Bit RDINH,
SCSICmdField1Bit WRINH,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField4Byte NUMBER_OF_BLOCKS,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->SET_LIMITS_12 (
scsiRequest,
RDINH,
WRINH,
LOGICAL_BLOCK_ADDRESS,
NUMBER_OF_BLOCKS,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::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
IOSCSIBlockCommandsDevice::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 = GetSCSIBlockCommandObject ( )->SYNCHRONIZE_CACHE (
scsiRequest,
IMMED,
RELADR,
LOGICAL_BLOCK_ADDRESS,
NUMBER_OF_BLOCKS,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::UPDATE_BLOCK (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->UPDATE_BLOCK (
scsiRequest,
dataBuffer,
fMediumBlockSize,
RELADR,
LOGICAL_BLOCK_ADDRESS,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::VERIFY_10 (
SCSITaskIdentifier request,
SCSICmdField1Bit DPO,
SCSICmdField1Bit BLKVFY,
SCSICmdField1Bit BYTCHK,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField2Byte VERIFICATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->VERIFY_10 (
scsiRequest,
DPO,
BLKVFY,
BYTCHK,
RELADR,
LOGICAL_BLOCK_ADDRESS,
VERIFICATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::VERIFY_12 (
SCSITaskIdentifier request,
SCSICmdField1Bit DPO,
SCSICmdField1Bit BLKVFY,
SCSICmdField1Bit BYTCHK,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField4Byte VERIFICATION_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->VERIFY_12 (
scsiRequest,
DPO,
BLKVFY,
BYTCHK,
RELADR,
LOGICAL_BLOCK_ADDRESS,
VERIFICATION_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::WRITE_6 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
UInt32 blockSize,
SCSICmdField2Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField1Byte TRANSFER_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
UInt32 requestedByteCount = 0;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
require_nonzero ( blockSize, ErrorExit );
if ( TRANSFER_LENGTH == 0 )
{
requestedByteCount = 256 * blockSize;
}
else
{
requestedByteCount = TRANSFER_LENGTH * blockSize;
}
status = GetSCSIBlockCommandObject ( )->WRITE_6 (
scsiRequest,
dataBuffer,
requestedByteCount,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::WRITE_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
UInt32 blockSize,
SCSICmdField1Bit DPO,
SCSICmdField1Bit FUA,
SCSICmdField1Bit EBP,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField2Byte TRANSFER_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
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 ( )->WRITE_10 (
scsiRequest,
dataBuffer,
requestedByteCount,
DPO,
FUA,
EBP,
RELADR,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::WRITE_12 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
UInt32 blockSize,
SCSICmdField1Bit DPO,
SCSICmdField1Bit FUA,
SCSICmdField1Bit EBP,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField4Byte TRANSFER_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
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 ( )->WRITE_12 (
scsiRequest,
dataBuffer,
requestedByteCount,
DPO,
FUA,
EBP,
RELADR,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::WRITE_AND_VERIFY_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
UInt32 blockSize,
SCSICmdField1Bit DPO,
SCSICmdField1Bit EBP,
SCSICmdField1Bit BYTCHK,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField2Byte TRANSFER_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
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 ( )->WRITE_AND_VERIFY_10 (
scsiRequest,
dataBuffer,
requestedByteCount,
DPO,
EBP,
BYTCHK,
RELADR,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::WRITE_AND_VERIFY_12 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
UInt32 blockSize,
SCSICmdField1Bit DPO,
SCSICmdField1Bit EBP,
SCSICmdField1Bit BYTCHK,
SCSICmdField1Bit RELADR,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField4Byte TRANSFER_LENGTH,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
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 ( )->WRITE_AND_VERIFY_12 (
scsiRequest,
dataBuffer,
requestedByteCount,
DPO,
EBP,
BYTCHK,
RELADR,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::WRITE_LONG (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
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 = GetSCSIBlockCommandObject ( )->WRITE_LONG (
scsiRequest,
dataBuffer,
RELADR,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::WRITE_SAME (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit PBDATA,
SCSICmdField1Bit LBDATA,
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 = GetSCSIBlockCommandObject ( )->WRITE_SAME (
scsiRequest,
dataBuffer,
PBDATA,
LBDATA,
RELADR,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::XDREAD (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
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 = GetSCSIBlockCommandObject ( )->XDREAD (
scsiRequest,
dataBuffer,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::XDWRITE (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit DPO,
SCSICmdField1Bit FUA,
SCSICmdField1Bit DISABLE_WRITE,
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 = GetSCSIBlockCommandObject ( )->XDWRITE (
scsiRequest,
dataBuffer,
DPO,
FUA,
DISABLE_WRITE,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::XDWRITE_EXTENDED (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit TABLE_ADDRESS,
SCSICmdField1Bit DPO,
SCSICmdField1Bit FUA,
SCSICmdField1Bit DISABLE_WRITE,
SCSICmdField2Bit PORT_CONTROL,
SCSICmdField4Byte LOGICAL_BLOCK_ADDRESS,
SCSICmdField4Byte SECONDARY_BLOCK_ADDRESS,
SCSICmdField4Byte TRANSFER_LENGTH,
SCSICmdField1Byte SECONDARY_ADDRESS,
SCSICmdField1Byte CONTROL )
{
SCSITask * scsiRequest = NULL;
bool status = false;
scsiRequest = OSDynamicCast ( SCSITask, request );
require_nonzero ( scsiRequest, ErrorExit );
require ( scsiRequest->ResetForNewTask ( ), ErrorExit );
status = GetSCSIBlockCommandObject ( )->XDWRITE_EXTENDED (
scsiRequest,
dataBuffer,
TABLE_ADDRESS,
DPO,
FUA,
DISABLE_WRITE,
PORT_CONTROL,
LOGICAL_BLOCK_ADDRESS,
SECONDARY_BLOCK_ADDRESS,
TRANSFER_LENGTH,
SECONDARY_ADDRESS,
CONTROL );
ErrorExit:
return status;
}
bool
IOSCSIBlockCommandsDevice::XPWRITE (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit DPO,
SCSICmdField1Bit FUA,
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 = GetSCSIBlockCommandObject ( )->XPWRITE (
scsiRequest,
dataBuffer,
DPO,
FUA,
LOGICAL_BLOCK_ADDRESS,
TRANSFER_LENGTH,
CONTROL );
ErrorExit:
return status;
}