IOSCSIPrimaryCommandsDevice.h [plain text]
#ifndef _IOKIT_IO_SCSI_PRIMARY_COMMANDS_DEVICE_H_
#define _IOKIT_IO_SCSI_PRIMARY_COMMANDS_DEVICE_H_
#if defined(KERNEL) && defined(__cplusplus)
#include <IOKit/IOLib.h>
#include <IOKit/IOService.h>
#include <IOKit/IOReturn.h>
#include <IOKit/IOMemoryDescriptor.h>
#include <IOKit/IOSyncer.h>
#include <IOKit/scsi-commands/SCSICommandDefinitions.h>
#include <IOKit/scsi-commands/SCSICmds_INQUIRY_Definitions.h>
#include <IOKit/scsi-commands/IOSCSIProtocolInterface.h>
enum
{
kSCSIServicesNotification_Suspend = 0x69000080,
kSCSIServicesNotification_Resume = 0x69000090
};
enum
{
kOneSecondTimeoutInMS = 1000,
kTenSecondTimeoutInMS = 10 * kOneSecondTimeoutInMS,
kThirtySecondTimeoutInMS = 30 * kOneSecondTimeoutInMS
};
enum
{
kModePageControlCurrentValues = 0x00,
kModePageControlChangeableValues = 0x01,
kModePageControlDefaultValues = 0x02,
kModePageControlSavedValues = 0x03
};
class SCSIPrimaryCommands;
class IOSCSIPrimaryCommandsDevice : public IOSCSIProtocolInterface
{
OSDeclareAbstractStructors ( IOSCSIPrimaryCommandsDevice )
private:
SCSIPrimaryCommands * fSCSIPrimaryCommandObject;
IOSCSIProtocolInterface * fProtocolDriver;
bool fProtocolAccessEnabled;
bool fDeviceAccessEnabled;
bool fDeviceAccessSuspended;
static bool ServerKeyswitchCallback ( void * target,
void * refCon,
IOService * newService );
static void TaskCallback ( SCSITaskIdentifier completedTask );
protected:
struct IOSCSIPrimaryCommandsDeviceExpansionData
{
IONotifier * fKeySwitchNotifier;
UInt8 fANSIVersion;
UInt32 fReadTimeoutDuration;
UInt32 fWriteTimeoutDuration;
};
IOSCSIPrimaryCommandsDeviceExpansionData * fIOSCSIPrimaryCommandsDeviceReserved;
#define fReadTimeoutDuration fIOSCSIPrimaryCommandsDeviceReserved->fReadTimeoutDuration
#define fWriteTimeoutDuration fIOSCSIPrimaryCommandsDeviceReserved->fWriteTimeoutDuration
UInt8 fDefaultInquiryCount;
OSDictionary * fDeviceCharacteristicsDictionary;
UInt32 fNumCommandsOutstanding;
virtual void free ( void );
void SetANSIVersion ( UInt8 );
IOReturn GetModeSense (
IOMemoryDescriptor * dataBuffer,
SCSICmdField6Bit PAGE_CODE,
SCSICmdField2Byte ALLOCATION_LENGTH,
bool * use10ByteModeSense );
bool fDeviceSupportsPowerConditions;
virtual SCSIPrimaryCommands * GetSCSIPrimaryCommandObject ( void );
virtual bool CreateCommandSetObjects ( void );
virtual void FreeCommandSetObjects ( void );
virtual void CheckPowerConditionsModePage ( void );
virtual IOSCSIProtocolInterface * GetProtocolDriver ( void );
virtual SCSITaskIdentifier GetSCSITask ( void );
virtual void ReleaseSCSITask ( SCSITaskIdentifier request );
SCSIServiceResponse SendCommand (
SCSITaskIdentifier request,
UInt32 timeoutDuration );
void SendCommand (
SCSITaskIdentifier request,
UInt32 timeoutDuration,
SCSITaskCompletion taskCompletion );
virtual bool InitializeDeviceSupport ( void ) = 0;
virtual void StartDeviceSupport ( void ) = 0;
virtual void SuspendDeviceSupport ( void ) = 0;
virtual void ResumeDeviceSupport ( void ) = 0;
virtual void StopDeviceSupport ( void ) = 0;
virtual void TerminateDeviceSupport ( void ) = 0;
virtual UInt32 GetNumberOfPowerStateTransitions ( void ) = 0;
virtual IOReturn VerifyDeviceState ( void );
virtual bool ClearPowerOnReset ( void );
virtual bool ClearNotReadyStatus ( void ) = 0;
bool IsProtocolAccessEnabled ( void );
bool IsDeviceAccessEnabled ( void );
bool IsDeviceAccessSuspended ( void );
bool ResetForNewTask(
SCSITaskIdentifier request );
bool SetTaskAttribute (
SCSITaskIdentifier request,
SCSITaskAttribute newAttribute );
SCSITaskAttribute GetTaskAttribute (
SCSITaskIdentifier request );
bool SetTaskState (
SCSITaskIdentifier request,
SCSITaskState newTaskState );
SCSITaskState GetTaskState (
SCSITaskIdentifier request );
bool SetTaskStatus (
SCSITaskIdentifier request,
SCSITaskStatus newStatus );
SCSITaskStatus GetTaskStatus (
SCSITaskIdentifier request );
bool SetCommandDescriptorBlock (
SCSITaskIdentifier request,
UInt8 cdbByte0,
UInt8 cdbByte1,
UInt8 cdbByte2,
UInt8 cdbByte3,
UInt8 cdbByte4,
UInt8 cdbByte5 );
bool SetCommandDescriptorBlock (
SCSITaskIdentifier request,
UInt8 cdbByte0,
UInt8 cdbByte1,
UInt8 cdbByte2,
UInt8 cdbByte3,
UInt8 cdbByte4,
UInt8 cdbByte5,
UInt8 cdbByte6,
UInt8 cdbByte7,
UInt8 cdbByte8,
UInt8 cdbByte9 );
bool SetCommandDescriptorBlock (
SCSITaskIdentifier request,
UInt8 cdbByte0,
UInt8 cdbByte1,
UInt8 cdbByte2,
UInt8 cdbByte3,
UInt8 cdbByte4,
UInt8 cdbByte5,
UInt8 cdbByte6,
UInt8 cdbByte7,
UInt8 cdbByte8,
UInt8 cdbByte9,
UInt8 cdbByte10,
UInt8 cdbByte11 );
bool SetCommandDescriptorBlock (
SCSITaskIdentifier request,
UInt8 cdbByte0,
UInt8 cdbByte1,
UInt8 cdbByte2,
UInt8 cdbByte3,
UInt8 cdbByte4,
UInt8 cdbByte5,
UInt8 cdbByte6,
UInt8 cdbByte7,
UInt8 cdbByte8,
UInt8 cdbByte9,
UInt8 cdbByte10,
UInt8 cdbByte11,
UInt8 cdbByte12,
UInt8 cdbByte13,
UInt8 cdbByte14,
UInt8 cdbByte15 );
bool SetDataTransferDirection (
SCSITaskIdentifier request,
UInt8 newDirection );
UInt8 GetDataTransferDirection (
SCSITaskIdentifier request );
bool SetRequestedDataTransferCount (
SCSITaskIdentifier request,
UInt64 newRequestedCount );
UInt64 GetRequestedDataTransferCount (
SCSITaskIdentifier request );
bool SetRealizedDataTransferCount (
SCSITaskIdentifier request,
UInt64 newRealizedDataCount );
UInt64 GetRealizedDataTransferCount (
SCSITaskIdentifier request );
bool SetDataBuffer (
SCSITaskIdentifier request,
IOMemoryDescriptor * newBuffer );
IOMemoryDescriptor * GetDataBuffer (
SCSITaskIdentifier request );
bool SetTimeoutDuration (
SCSITaskIdentifier request,
UInt32 newTimeout );
UInt32 GetTimeoutDuration (
SCSITaskIdentifier request );
bool SetTaskCompletionCallback (
SCSITaskIdentifier request,
SCSITaskCompletion newCallback );
void TaskCompletedNotification (
SCSITaskIdentifier request );
bool SetServiceResponse (
SCSITaskIdentifier request,
SCSIServiceResponse serviceResponse );
SCSIServiceResponse GetServiceResponse (
SCSITaskIdentifier request );
bool SetAutosenseCommand (
SCSITaskIdentifier request,
UInt8 cdbByte0,
UInt8 cdbByte1,
UInt8 cdbByte2,
UInt8 cdbByte3,
UInt8 cdbByte4,
UInt8 cdbByte5 );
bool GetAutoSenseData (
SCSITaskIdentifier request,
SCSI_Sense_Data * senseData ); bool GetAutoSenseData (
SCSITaskIdentifier request,
SCSI_Sense_Data * senseData,
UInt8 senseDataSize );
UInt8 GetAutoSenseDataSize (
SCSITaskIdentifier request );
bool SetApplicationLayerReference (
SCSITaskIdentifier request,
void * newReferenceValue );
void * GetApplicationLayerReference (
SCSITaskIdentifier request );
void IncrementOutstandingCommandsCount ( void );
static void sIncrementOutstandingCommandsCount (
IOSCSIPrimaryCommandsDevice * self );
virtual void HandleIncrementOutstandingCommandsCount ( void );
static OSObject * sGetOwnerForTask ( SCSITaskIdentifier request );
public:
bool init ( OSDictionary * propTable );
virtual bool start ( IOService * provider );
virtual void stop ( IOService * provider );
virtual IOReturn message ( UInt32 type, IOService * nub, void * arg );
virtual IOReturn setAggressiveness ( UInt32 type, UInt32 minutes );
virtual char * GetVendorString ( void );
virtual char * GetProductString ( void );
virtual char * GetRevisionString ( void );
OSDictionary * GetProtocolCharacteristicsDictionary ( void );
OSDictionary * GetDeviceCharacteristicsDictionary ( void );
UInt8 GetANSIVersion ( void );
virtual void ExecuteCommand ( SCSITaskIdentifier request );
SCSIServiceResponse AbortTask ( UInt8 theLogicalUnit, SCSITaggedTaskIdentifier theTag );
SCSIServiceResponse AbortTaskSet ( UInt8 theLogicalUnit );
SCSIServiceResponse ClearACA ( UInt8 theLogicalUnit );
SCSIServiceResponse ClearTaskSet ( UInt8 theLogicalUnit );
SCSIServiceResponse LogicalUnitReset ( UInt8 theLogicalUnit );
SCSIServiceResponse TargetReset ( void );
virtual SCSIServiceResponse AbortCommand ( SCSITaskIdentifier request );
virtual bool IsProtocolServiceSupported (
SCSIProtocolFeature feature,
void * serviceValue );
virtual bool HandleProtocolServiceFeature (
SCSIProtocolFeature feature,
void * serviceValue );
bool IsParameterValid (
SCSICmdField1Byte param,
SCSICmdField1Byte mask );
bool IsParameterValid (
SCSICmdField2Byte param,
SCSICmdField2Byte mask );
bool IsParameterValid (
SCSICmdField4Byte param,
SCSICmdField4Byte mask );
bool IsMemoryDescriptorValid (
IOMemoryDescriptor * dataBuffer );
bool IsMemoryDescriptorValid (
IOMemoryDescriptor * dataBuffer,
UInt64 requiredSize );
virtual bool CHANGE_DEFINITION (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit SAVE,
SCSICmdField7Bit DEFINITION_PARAMETER,
SCSICmdField1Byte PARAMETER_DATA_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool COMPARE (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit PAD,
SCSICmdField3Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool COPY (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit PAD,
SCSICmdField3Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool COPY_AND_VERIFY (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit BYTCHK,
SCSICmdField1Bit PAD,
SCSICmdField3Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool EXTENDED_COPY (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField4Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool INQUIRY (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit CMDDT,
SCSICmdField1Bit EVPD,
SCSICmdField1Byte PAGE_OR_OPERATION_CODE,
SCSICmdField1Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool LOG_SELECT (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit PCR,
SCSICmdField1Bit SP,
SCSICmdField2Bit PC,
SCSICmdField2Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool LOG_SENSE (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit PPC,
SCSICmdField1Bit SP,
SCSICmdField2Bit PC,
SCSICmdField6Bit PAGE_CODE,
SCSICmdField2Byte PARAMETER_POINTER,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool MODE_SELECT_6 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit PF,
SCSICmdField1Bit SP,
SCSICmdField1Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool MODE_SELECT_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit PF,
SCSICmdField1Bit SP,
SCSICmdField2Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool MODE_SENSE_6 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit DBD,
SCSICmdField2Bit PC,
SCSICmdField6Bit PAGE_CODE,
SCSICmdField1Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool MODE_SENSE_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit LLBAA,
SCSICmdField1Bit DBD,
SCSICmdField2Bit PC,
SCSICmdField6Bit PAGE_CODE,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool PERSISTENT_RESERVE_IN (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField5Bit SERVICE_ACTION,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool PERSISTENT_RESERVE_OUT (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField5Bit SERVICE_ACTION,
SCSICmdField4Bit SCOPE,
SCSICmdField4Bit TYPE,
SCSICmdField1Byte CONTROL );
virtual bool PREVENT_ALLOW_MEDIUM_REMOVAL (
SCSITaskIdentifier request,
SCSICmdField2Bit PREVENT,
SCSICmdField1Byte CONTROL );
virtual bool READ_BUFFER (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField4Bit MODE,
SCSICmdField1Byte BUFFER_ID,
SCSICmdField3Byte BUFFER_OFFSET,
SCSICmdField3Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool RECEIVE (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField3Byte TRANSFER_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool RECEIVE_DIAGNOSTICS_RESULTS (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit PCV,
SCSICmdField1Byte PAGE_CODE,
SCSICmdField2Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool RELEASE_6 (
SCSITaskIdentifier request,
SCSICmdField1Byte CONTROL );
virtual bool RELEASE_6 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit EXTENT,
SCSICmdField1Byte RESERVATION_IDENTIFICATION,
SCSICmdField1Byte CONTROL );
virtual bool RELEASE_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit THRDPTY,
SCSICmdField1Bit LONGID,
SCSICmdField1Byte THIRD_PARTY_DEVICE_ID,
SCSICmdField2Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool RELEASE_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit THRDPTY,
SCSICmdField1Bit LONGID,
SCSICmdField1Bit EXTENT,
SCSICmdField1Byte RESERVATION_IDENTIFICATION,
SCSICmdField1Byte THIRD_PARTY_DEVICE_ID,
SCSICmdField2Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool REPORT_DEVICE_IDENTIFIER (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField4Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool REPORT_LUNS (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField4Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool REQUEST_SENSE (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Byte ALLOCATION_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool RESERVE_6 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Byte CONTROL );
virtual bool RESERVE_6 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit EXTENT,
SCSICmdField1Byte RESERVATION_IDENTIFICATION,
SCSICmdField2Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool RESERVE_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit THRDPTY,
SCSICmdField1Bit LONGID,
SCSICmdField1Byte THIRD_PARTY_DEVICE_ID,
SCSICmdField2Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool RESERVE_10 (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit THRDPTY,
SCSICmdField1Bit LONGID,
SCSICmdField1Bit EXTENT,
SCSICmdField1Byte RESERVATION_IDENTIFICATION,
SCSICmdField1Byte THIRD_PARTY_DEVICE_ID,
SCSICmdField2Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool SEND (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField1Bit AER,
SCSICmdField3Byte TRANSFER_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool SEND_DIAGNOSTICS (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField3Bit SELF_TEST_CODE,
SCSICmdField1Bit PF,
SCSICmdField1Bit SELF_TEST,
SCSICmdField1Bit DEVOFFL,
SCSICmdField1Bit UNITOFFL,
SCSICmdField2Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool SET_DEVICE_IDENTIFIER (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField5Bit SERVICE_ACTION,
SCSICmdField4Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
virtual bool TEST_UNIT_READY (
SCSITaskIdentifier request,
SCSICmdField1Byte CONTROL );
virtual bool WRITE_BUFFER (
SCSITaskIdentifier request,
IOMemoryDescriptor * dataBuffer,
SCSICmdField4Bit MODE,
SCSICmdField1Byte BUFFER_ID,
SCSICmdField3Byte BUFFER_OFFSET,
SCSICmdField3Byte PARAMETER_LIST_LENGTH,
SCSICmdField1Byte CONTROL );
private:
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 1 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 2 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 3 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 4 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 5 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 6 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 7 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 8 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 9 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 10 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 11 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 12 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 13 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 14 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 15 );
OSMetaClassDeclareReservedUnused ( IOSCSIPrimaryCommandsDevice, 16 );
};
#endif
#endif