IOUSBControllerUserClient.cpp [plain text]
#include <libkern/OSByteOrder.h>
#include <IOKit/assert.h>
#include <IOKit/IOLib.h>
#include <IOKit/IOMessage.h>
#include <IOKit/usb/IOUSBController.h>
#include <IOKit/usb/IOUSBControllerV2.h>
#include <IOKit/usb/IOUSBLog.h>
#include "IOUSBControllerUserClient.h"
#define super IOUserClient
OSDefineMetaClassAndStructors(IOUSBControllerUserClient, IOUserClient)
enum {
kMethodObjectThis = 0,
kMethodObjectOwner
};
const IOExternalMethod
IOUSBControllerUserClient::sMethods[kNumUSBControllerMethods] =
{
{ (IOService*)kMethodObjectThis, ( IOMethod ) &IOUSBControllerUserClient::open, kIOUCScalarIScalarO, 1, 0 },
{ (IOService*)kMethodObjectThis, ( IOMethod ) &IOUSBControllerUserClient::close, kIOUCScalarIScalarO, 0, 0 },
{ (IOService*)kMethodObjectThis, ( IOMethod ) &IOUSBControllerUserClient::EnableKernelLogger, kIOUCScalarIScalarO, 1, 0 },
{ (IOService*)kMethodObjectThis, ( IOMethod ) &IOUSBControllerUserClient::SetDebuggingLevel, kIOUCScalarIScalarO, 1, 0 },
{ (IOService*)kMethodObjectThis, ( IOMethod ) &IOUSBControllerUserClient::SetDebuggingType, kIOUCScalarIScalarO, 1, 0 },
{ (IOService*)kMethodObjectThis, ( IOMethod ) &IOUSBControllerUserClient::GetDebuggingLevel, kIOUCScalarIScalarO, 0, 1 },
{ (IOService*)kMethodObjectThis, ( IOMethod ) &IOUSBControllerUserClient::GetDebuggingType, kIOUCScalarIScalarO, 0, 1 },
{ (IOService*)kMethodObjectThis, ( IOMethod )&IOUSBControllerUserClient::SetTestMode, kIOUCScalarIScalarO, 2, 0 }
};
const IOItemCount
IOUSBControllerUserClient::sMethodCount = sizeof( IOUSBControllerUserClient::sMethods ) /
sizeof( IOUSBControllerUserClient::sMethods[ 0 ] );
void
IOUSBControllerUserClient::SetExternalMethodVectors()
{
fMethods = sMethods;
fNumMethods = kNumUSBControllerMethods;
}
IOExternalMethod *
IOUSBControllerUserClient::getTargetAndMethodForIndex(IOService **target, UInt32 index)
{
if (index < (UInt32)fNumMethods)
{
if ((IOService*)kMethodObjectThis == fMethods[index].object)
*target = this;
else if ((IOService*)kMethodObjectOwner == fMethods[index].object)
*target = fOwner;
else
return NULL;
return (IOExternalMethod *) &fMethods[index];
}
else
return NULL;
}
bool
IOUSBControllerUserClient::initWithTask(task_t owningTask, void *security_id, UInt32 type, OSDictionary * properties)
{
IOLog("IOUSBControllerUserClient::initWithTask(type %ld)\n", type);
if (!owningTask)
return false;
fTask = owningTask;
fOwner = NULL;
fGate = NULL;
fDead = false;
SetExternalMethodVectors();
return (super::initWithTask(owningTask, security_id , type, properties));
}
bool
IOUSBControllerUserClient::start( IOService * provider )
{
fOwner = OSDynamicCast(IOUSBController, provider);
IOLog("+IOUSBControllerUserClient::start (%p)\n", fOwner);
if (!fOwner)
return false;
if(!super::start(provider))
return false;
return true;
}
IOReturn
IOUSBControllerUserClient::open(bool seize)
{
IOOptionBits options = seize ? (IOOptionBits) kIOServiceSeize : 0;
IOLog("+IOUSBControllerUserClient::open\n");
if (!fOwner)
return kIOReturnNotAttached;
if (!fOwner->open(this, options))
return kIOReturnExclusiveAccess;
return kIOReturnSuccess;
}
IOReturn
IOUSBControllerUserClient::close()
{
IOLog("+IOUSBControllerUserClient::close\n");
if (!fOwner)
return kIOReturnNotAttached;
if (fOwner && (fOwner->isOpen(this)))
fOwner->close(this);
return kIOReturnSuccess;
}
IOReturn
IOUSBControllerUserClient::EnableKernelLogger(bool enable)
{
IOLog("+IOUSBControllerUserClient::EnableKernelLogger\n");
if (!fOwner)
return kIOReturnNotAttached;
KernelDebugEnable(enable);
return kIOReturnSuccess;
}
IOReturn
IOUSBControllerUserClient::SetDebuggingLevel(KernelDebugLevel inLevel)
{
IOLog("+IOUSBControllerUserClient::SetDebuggingLevel\n");
if (!fOwner)
return kIOReturnNotAttached;
KernelDebugSetLevel(inLevel);
return kIOReturnSuccess;
}
IOReturn
IOUSBControllerUserClient::SetDebuggingType(KernelDebuggingOutputType inType)
{
IOLog("+IOUSBControllerUserClient::SetDebuggingType\n");
if (!fOwner)
return kIOReturnNotAttached;
KernelDebugSetOutputType(inType);
return kIOReturnSuccess;
}
IOReturn
IOUSBControllerUserClient::GetDebuggingLevel(KernelDebugLevel * inLevel)
{
IOLog("+IOUSBControllerUserClient::GetDebuggingLevel\n");
if (!fOwner)
return kIOReturnNotAttached;
*inLevel = KernelDebugGetLevel();
return kIOReturnSuccess;
}
IOReturn
IOUSBControllerUserClient::GetDebuggingType(KernelDebuggingOutputType * inType)
{
IOLog("+IOUSBControllerUserClient::GetDebuggingLevel\n");
if (!fOwner)
return kIOReturnNotAttached;
*inType = KernelDebugGetOutputType();
return kIOReturnSuccess;
}
IOReturn
IOUSBControllerUserClient::SetTestMode(UInt32 mode, UInt32 port)
{
IOUSBControllerV2 *v2 = OSDynamicCast(IOUSBControllerV2, fOwner);
IOLog("+IOUSBControllerUserClient::SetTestMode");
if (!v2)
return kIOReturnNotAttached;
return v2->SetTestMode(mode, port);
}
void
IOUSBControllerUserClient::stop( IOService * provider )
{
IOLog("IOUSBControllerUserClient::stop\n");
super::stop( provider );
}
IOReturn
IOUSBControllerUserClient::clientClose( void )
{
IOLog("%s[%p]::clientClose isInactive = %d\n", getName(), this, isInactive());
if( !isInactive())
terminate();
return( kIOReturnSuccess );
}