ApplePCCard16ATA.cpp [plain text]
#include "ApplePCCard16ATA.h"
#if _CustomEnabler
#undef super
#define super IOPCCard16Enabler
OSDefineMetaClassAndStructors(ApplePCCard16ATAEnabler, IOPCCard16Enabler);
ApplePCCard16ATAEnabler *
ApplePCCard16ATAEnabler::withDevice(IOPCCard16Device *provider)
{
DLOG("ApplePCCard16ATAEnabler::withDevice entered\n");
ApplePCCard16ATAEnabler *me = new ApplePCCard16ATAEnabler;
if (me && !me->init(provider)) {
me->release();
return 0;
}
DLOG("ApplePCCard16ATAEnabler::withDevice exiting\n");
return me;
}
bool
ApplePCCard16ATAEnabler::sortConfigurations(void)
{
DLOG("ApplePCCard16ATAEnabler::sortConfigurations entered\n");
return super::sortConfigurations();
}
#endif
#define CardServices nub->cardServices
#undef super
#define super IOService
OSDefineMetaClassAndStructors(ApplePCCard16ATA, IOService);
bool
ApplePCCard16ATA::start(IOService * provider)
{
DLOG("ApplePCCard16ATA::start(provider=%p, this=%p) starting\n", provider, this);
nub = OSDynamicCast(IOPCCard16Device, provider);
if (!nub) {
DLOG("%s: provider is not of class IOPCCard16Device?\n", getName());
return false;
}
char *compatibleData = kApplePCCard16ATACompatibleValue;
this->IORegistryEntry::setProperty(kApplePCCard16ATACompatibleKey, (void *)compatibleData, sizeof(kApplePCCard16ATACompatibleValue));
#if _CustomEnabler
DLOG("ApplePCCard16ATA: Creating custom enabler\n");
ApplePCCard16ATAEnabler *customEnabler = ApplePCCard16ATAEnabler::withDevice(nub);
if (!customEnabler) DLOG("%s: ApplePCCard16ATAEnabler::withDevice(nub) failed\n", getName());
DLOG("ApplePCCard16ATA: Installing custom enabler\n");
bool success = nub->installEnabler(customEnabler);
if (!success) DLOG("%s: nub->installEnabler(customEnabler) failed\n", getName());
customEnabler->release(); #endif
if (!nub->configure()) {
stop(provider);
return false;
}
this->registerService();
DLOG("ApplePCCard16ATA::start(provider=%p, this=%p) ending\n", provider, this);
return true;
}
void
ApplePCCard16ATA::stop(IOService * provider)
{
DLOG("ApplePCCard16ATA::stop(provider=%p, this=%p) starting\n", provider, this);
if (nub != provider) {
DLOG("%s: nub != provider\n", getName());
return;
}
nub->unconfigure();
super::stop(provider);
}
IOReturn
ApplePCCard16ATA::message(UInt32 type, IOService * provider, void * argument)
{
UInt32 cs_arg = (UInt32) argument;
switch( type )
{
case kIOMessageServiceIsTerminated:
terminate();
provider->close(this);
break;
case kIOPCCardCSEventMessage:
DLOG("ApplePCCard16ATA::message, nub=%p, CS event received type=0x%x.\n", nub, (unsigned int)argument);
switch( cs_arg )
{
case CS_EVENT_EJECTION_REQUEST:
return kIOReturnBusy;
break;
case CS_EVENT_CARD_REMOVAL:
if( messageClient( kATARemovedEvent, getClient(), (void*) OSString::withCString
( kATAPCCardSocketString ), 0) != kIOReturnSuccess )
{
DLOG("ApplePCCard16ATA did not handle device ejection because there are no children.\n");
}
break;
default:
break;
}
break;
default:
return super::message( type, provider, argument);
break;
}
return kIOReturnSuccess;
}
IOMemoryMap * ApplePCCard16ATA::mapDeviceMemoryWithIndex (unsigned int index,
IOOptionBits options = 0)
{
return nub->mapDeviceMemoryWithIndex(index, options);
}