AppleSCSIEmulatorAdapterUC.cpp [plain text]
#include "AppleSCSIEmulatorAdapterUC.h"
#include "AppleSCSIEmulatorAdapter.h"
#define DEBUG 1
#define DEBUG_ASSERT_COMPONENT_NAME_STRING "AdapterUC"
#if DEBUG
#define ADAPTER_UC_DEBUGGING_LEVEL 3
#endif
#include "DebugSupport.h"
#if ( ADAPTER_UC_DEBUGGING_LEVEL >= 1 )
#define PANIC_NOW(x) panic x
#else
#define PANIC_NOW(x)
#endif
#if ( ADAPTER_UC_DEBUGGING_LEVEL >= 2 )
#define ERROR_LOG(x) IOLog x; IOSleep(1)
#else
#define ERROR_LOG(x)
#endif
#if ( ADAPTER_UC_DEBUGGING_LEVEL >= 3 )
#define STATUS_LOG(x) IOLog x; IOSleep(1)
#else
#define STATUS_LOG(x)
#endif
#define super IOUserClient
OSDefineMetaClassAndStructors ( AppleSCSIEmulatorAdapterUserClient, IOUserClient );
#if 0
#pragma mark -
#pragma mark Public Methods
#pragma mark -
#endif
bool
AppleSCSIEmulatorAdapterUserClient::initWithTask (
task_t owningTask,
void * securityToken,
UInt32 type,
OSDictionary * properties )
{
bool result = false;
STATUS_LOG ( ( "AppleSCSIEmulatorAdapterUserClient::initWithTask called\n" ) );
result = super::initWithTask ( owningTask, securityToken, type, properties );
require ( result, ErrorExit );
fTask = owningTask;
result = true;
ErrorExit:
return result;
}
bool
AppleSCSIEmulatorAdapterUserClient::start ( IOService * provider )
{
bool result = false;
IOWorkLoop * workLoop = NULL;
STATUS_LOG ( ( "AppleSCSIEmulatorAdapterUserClient::start\n" ) );
require ( ( fProvider == 0 ), ErrorExit );
require ( super::start ( provider ), ErrorExit );
fProvider = provider;
STATUS_LOG ( ( "Creating command gate\n" ) );
fCommandGate = IOCommandGate::commandGate ( this );
require_nonzero ( fCommandGate, ErrorExit );
workLoop = getWorkLoop ( );
require_nonzero_action ( workLoop,
ErrorExit,
fCommandGate->release ( ) );
STATUS_LOG ( ( "Adding event source\n" ) );
workLoop->addEventSource ( fCommandGate );
STATUS_LOG ( ( "Opening provider\n" ) );
result = provider->open ( this, kSCSIEmulatorAdapterUserClientAccessMask, 0 );
require_action ( result,
ErrorExit,
workLoop->removeEventSource ( fCommandGate );
fCommandGate->release ( );
fCommandGate = NULL );
fWorkLoop = workLoop;
ErrorExit:
return result;
}
IOReturn
AppleSCSIEmulatorAdapterUserClient::clientClose ( void )
{
if ( fProvider != NULL )
{
if ( fProvider->isOpen ( this ) == true )
{
fProvider->close ( this, kSCSIEmulatorAdapterUserClientAccessMask );
}
detach ( fProvider );
fProvider = NULL;
}
return super::clientClose ( );
}
bool
AppleSCSIEmulatorAdapterUserClient::finalize ( IOOptionBits options )
{
clientClose ( );
return super::finalize ( options );
}
void
AppleSCSIEmulatorAdapterUserClient::free ( void )
{
if ( fWorkLoop != NULL )
{
fWorkLoop->removeEventSource ( fCommandGate );
fWorkLoop = NULL;
}
if ( fCommandGate != NULL )
{
fCommandGate->release ( );
fCommandGate = NULL;
}
super::free ( );
}
IOReturn
AppleSCSIEmulatorAdapterUserClient::externalMethod (
uint32_t selector,
IOExternalMethodArguments * args,
IOExternalMethodDispatch * dispatch,
OSObject * target,
void * reference )
{
IOReturn status = kIOReturnBadArgument;
require ( ( args->asyncWakePort == MACH_PORT_NULL ), ErrorExit );
require ( ( selector < kUserClientMethodCount ), ErrorExit );
if ( selector == kUserClientCreateLUN )
{
require ( ( args->structureInputSize == sizeof ( EmulatorTargetParamsStruct ) ), ErrorExit );
require ( ( args->structureOutputSize == 0 ), ErrorExit );
STATUS_LOG ( ( "args->structureInputSize = %u\n", args->structureInputSize ) );
status = ( ( AppleSCSIEmulatorAdapter * ) fProvider )->CreateLUN ( ( EmulatorTargetParamsStruct * ) args->structureInput, fTask );
}
else if ( selector == kUserClientDestroyLUN )
{
require ( ( args->scalarInputCount == 2 ), ErrorExit );
require ( ( args->scalarOutputCount == 0 ), ErrorExit );
STATUS_LOG ( ( "args->scalarInputCount = %u\n", args->scalarInputCount ) );
STATUS_LOG ( ( "args->scalarInput[0] = %qd, args->scalarInput[1] = %qd\n", args->scalarInput[0], args->scalarInput[1] ) );
status = ( ( AppleSCSIEmulatorAdapter * ) fProvider )->DestroyLUN ( args->scalarInput[0], args->scalarInput[1] );
}
else if ( selector == kUserClientDestroyTarget )
{
require ( ( args->scalarInputCount == 1 ), ErrorExit );
require ( ( args->scalarOutputCount == 0 ), ErrorExit );
STATUS_LOG ( ( "args->scalarInputCount = %u\n", args->scalarInputCount ) );
STATUS_LOG ( ( "args->scalarInput[0] = %qd\n", args->scalarInput[0] ) );
status = ( ( AppleSCSIEmulatorAdapter * ) fProvider )->DestroyTarget ( args->scalarInput[0] );
}
ErrorExit:
STATUS_LOG ( ( "externalMethod status = 0x%08x\n", status ) );
return status;
}