IOFireWireAVCRequestSpace.cpp [plain text]
#include <IOKit/IOLib.h>
#include <IOKit/firewire/IOFireWireController.h>
#include "IOFireWireAVCRequestSpace.h"
#include "IOFireWireAVCConsts.h"
OSDefineMetaClassAndStructors(IOFireWireAVCRequestSpace, IOFWPseudoAddressSpace)
OSMetaClassDefineReservedUnused(IOFireWireAVCRequestSpace, 0);
OSMetaClassDefineReservedUnused(IOFireWireAVCRequestSpace, 1);
OSMetaClassDefineReservedUnused(IOFireWireAVCRequestSpace, 2);
OSMetaClassDefineReservedUnused(IOFireWireAVCRequestSpace, 3);
bool IOFireWireAVCRequestSpace::init(IOFireWireBus *bus, UInt32 subUnitType, UInt32 subUnitID,
FWWriteCallback writer, void * refcon)
{
if(!IOFWPseudoAddressSpace::initFixed(bus,
FWAddress(kCSRRegisterSpaceBaseAddressHi, kFCPCommandAddress),
512, NULL, writer, refcon))
return false;
fUnitAddr = IOAVCAddress(subUnitType, subUnitID);
return true;
}
IOFireWireAVCRequestSpace *
IOFireWireAVCRequestSpace::withSubUnit(IOFireWireBus *bus, UInt32 subUnitType, UInt32 subUnitID,
FWWriteCallback writer, void * refcon)
{
IOFireWireAVCRequestSpace *me;
me = new IOFireWireAVCRequestSpace;
if(me) {
if(!me->init(bus, subUnitType, subUnitID, writer, refcon)) {
me->release();
me = NULL;
}
}
return me;
}
UInt32 IOFireWireAVCRequestSpace::doWrite(UInt16 nodeID, IOFWSpeed &speed, FWAddress addr, UInt32 len,
const void *buf, IOFWRequestRefCon refcon)
{
const UInt8 *hdr = (UInt8 *)buf;
if(addr.addressHi != kCSRRegisterSpaceBaseAddressHi)
return kFWResponseAddressError;
if(addr.addressLo != kFCPCommandAddress)
return kFWResponseAddressError;
IOLog("IOFireWireAVCRequestSpace write, header %x len %d\n", *(const UInt32 *)buf, len);
if(hdr[0] & 0xf0)
return kFWResponseAddressError;
if (fUnitAddr != 0xEE)
if(hdr[1] != fUnitAddr)
return kFWResponseAddressError;
return fWriter(fRefCon, nodeID, speed, addr, len, buf, refcon);
}