SCSITaskUserClientIniter.cpp [plain text]
#include <libkern/c++/OSArray.h>
#include <libkern/c++/OSDictionary.h>
#include <IOKit/IOKitKeys.h>
#include <IOKit/scsi/IOSCSIProtocolInterface.h>
#include <IOKit/scsi/IOSCSIPeripheralDeviceNub.h>
#include "SCSITaskLib.h"
#include "SCSITaskLibPriv.h"
#include "SCSITaskUserClientIniter.h"
#define SCSI_TASK_USER_CLIENT_INITER_DEBUGGING_LEVEL 0
#if ( SCSI_TASK_USER_CLIENT_INITER_DEBUGGING_LEVEL >= 1 )
#define PANIC_NOW(x) IOPanic x
#else
#define PANIC_NOW(x)
#endif
#if ( SCSI_TASK_USER_CLIENT_INITER_DEBUGGING_LEVEL >= 2 )
#define ERROR_LOG(x) IOLog x
#else
#define ERROR_LOG(x)
#endif
#if ( SCSI_TASK_USER_CLIENT_INITER_DEBUGGING_LEVEL >= 3 )
#define STATUS_LOG(x) IOLog x
#else
#define STATUS_LOG(x)
#endif
#define super IOService
OSDefineMetaClassAndStructors ( SCSITaskUserClientIniter, IOService );
bool
SCSITaskUserClientIniter::start ( IOService * provider )
{
OSDictionary * mergeProperties = NULL;
IOSCSIPeripheralDeviceNub * nub = NULL;
UInt32 deviceType = 0;
bool status = false;
bool doMerge = false;
OSString * matchKey = NULL;
STATUS_LOG ( ( "SCSITaskUserClientIniter::start called\n" ) );
if ( !super::start ( provider ) )
return status;
matchKey = OSString::withCString ( kSCSITaskUserClientIniterKey );
if ( matchKey != NULL )
{
OSString * key = ( OSString * ) provider->getProperty ( kIOMatchCategoryKey );
if ( key != NULL )
{
if ( matchKey->isEqualTo ( key ) )
{
doMerge = true;
}
}
matchKey->release ( );
matchKey = NULL;
}
nub = OSDynamicCast ( IOSCSIPeripheralDeviceNub, provider );
if ( nub != NULL )
{
STATUS_LOG ( ( "provider's classname = %s\n", provider->getName ( ) ) );
deviceType = ( ( OSNumber * ) nub->getProperty ( kIOPropertySCSIPeripheralDeviceType ) )->unsigned32BitValue ( );
switch ( deviceType )
{
case 0x00000000:
case 0x00000005:
case 0x00000007:
case 0x0000000E:
doMerge = false;
break;
default:
break;
}
STATUS_LOG ( ( "deviceType = %ld\n", deviceType ) );
}
if ( doMerge )
{
mergeProperties = OSDynamicCast ( OSDictionary, getProperty ( "IOProviderMergeProperties" ) );
if ( mergeProperties != NULL )
{
UInt32 uid[3];
uid[0] = ( UInt32 ) provider;
IOGetTime ( ( mach_timespec * ) &uid[1] );
STATUS_LOG ( ( "merging properties\n" ) );
provider->setProperty ( kIOPropertySCSITaskUserClientInstanceGUID, &uid[0], sizeof ( uid ) );
provider->setProperty ( kIOUserClientClassKey, mergeProperties->getObject ( kIOUserClientClassKey ) );
provider->setProperty ( kIOCFPlugInTypesKey, mergeProperties->getObject ( kIOCFPlugInTypesKey ) );
provider->setProperty ( kIOPropertySCSITaskDeviceCategory, mergeProperties->getObject ( kIOPropertySCSITaskDeviceCategory ) );
status = true;
}
}
STATUS_LOG ( ( "status = %d\n", status ) );
return status;
}