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/SCSIPrimaryCommands.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 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;
};
IOSCSIPrimaryCommandsDeviceExpansionData * fIOSCSIPrimaryCommandsDeviceReserved;
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 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 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 );
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 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