IOFireWireIPUnit.cpp [plain text]
#include "IOFireWireIPUnit.h"
#include "IOFireWireIP.h"
#include <IOKit/IOMessage.h>
#include <IOKit/firewire/IOFireWireBus.h>
#include <IOKit/firewire/IOFWAddressSpace.h>
#include <IOKit/firewire/IOConfigDirectory.h>
#include "ip_firewire.h"
OSDefineMetaClassAndStructors(IOFireWireIPUnit, IOService)
OSMetaClassDefineReservedUnused(IOFireWireIPUnit, 0);
OSMetaClassDefineReservedUnused(IOFireWireIPUnit, 1);
OSMetaClassDefineReservedUnused(IOFireWireIPUnit, 2);
OSMetaClassDefineReservedUnused(IOFireWireIPUnit, 3);
bool IOFireWireIPUnit::start(IOService *provider)
{
UInt32 value;
IOReturn ioStat = kIOReturnSuccess;
fDrb = NULL;
fDevice = OSDynamicCast(IOFireWireNub, provider);
if(!fDevice)
return false;
hwAddr = NULL;
buf = NULL;
dir = NULL;
fIPUnitState = false;
special = false;
fDevice->getConfigDirectoryRef(dir);
if(!dir){
IOLog("IOFireWireIPunit: directory creation failure\n");
return false;
}
ioStat = dir->getKeyValue(kConfigUnitSpecIdKey, value, NULL);
ioStat = dir->getKeyValue(kConfigUnitSwVersionKey, value, NULL);
if(ioStat == kIOReturnSuccess)
ioStat = dir->getKeyValue(kConfigUnitDependentInfoKey, buf, NULL);
if(ioStat == kIOReturnSuccess){
hwAddr = (IP1394_HDW_ADDR*)buf->getBytesNoCopy(0,sizeof(IP1394_HDW_ADDR));
if(hwAddr){
special = true;
}
}
if( !IOService::start(provider))
return (false);
registerService();
return true;
}
void IOFireWireIPUnit::free(void)
{
IOService::free();
}
bool IOFireWireIPUnit::matchPropertyTable(OSDictionary * table)
{
if (!IOService::matchPropertyTable(table)) return false;
bool res = true;
return res;
}
bool IOFireWireIPUnit::handleOpen( IOService * forClient, IOOptionBits options, void * arg )
{
bool ok = false;
if( !isOpen() )
{
ok = fDevice->open(this, options, arg);
if(ok)
ok = IOService::handleOpen(forClient, options, arg);
}
return ok;
}
void IOFireWireIPUnit::handleClose( IOService * forClient, IOOptionBits options )
{
if( isOpen( forClient ) )
{
IOService::handleClose(forClient, options);
fDevice->close(this, options);
}
}
IOReturn IOFireWireIPUnit::message(UInt32 type, IOService *provider, void *argument)
{
IOReturn res = kIOReturnUnsupported;
if( kIOReturnUnsupported == res )
{
switch (type)
{
case kIOMessageServiceIsTerminated:
if(fIPLocalNode != NULL)
fIPLocalNode->deviceDetach(this);
res = kIOReturnSuccess;
break;
case kIOMessageServiceIsSuspended:
res = kIOReturnSuccess;
break;
case kIOMessageServiceIsResumed:
res = kIOReturnSuccess;
updateDrb();
if(fIPLocalNode != NULL)
{
fIPLocalNode->updateBroadcastValues(true);
fIPLocalNode->updateLinkStatus();
}
break;
default: break;
}
}
return res;
}
void IOFireWireIPUnit::updateDrb()
{
if(fDrb == NULL)
return;
fDrb->maxSpeed = fDevice->FWSpeed();
fDrb->maxPayload = fDevice->maxPackLog(true);
}