IOFireWireUserClient.h [plain text]
#ifndef _IOKIT_IOFIREWIREUSERCLIENT_H
#define _IOKIT_IOFIREWIREUSERCLIENT_H
#include <IOKit/IOUserClient.h>
#include <IOKit/firewire/IOFWIsoch.h>
#include <IOKit/firewire/IOLocalConfigDirectory.h>
#include <IOKit/firewire/IOFWAddressSpace.h>
#include <IOKit/firewire/IOFireWireNub.h>
#include <IOKit/firewire/IOFireWireFamilyCommon.h>
#include <IOKit/firewire/IOFireWireBus.h>
#ifndef Byte
typedef unsigned char Byte ;
#endif
#if IOFIREWIREUSERCLIENTDEBUG > 0
#define IOFireWireUserClientLog_(x...) IOLog(x)
#define IOFireWireUserClientLogIfNil_(x, y...) \
{ if ((void*)(x) == NULL) { IOFireWireUserClientLog_(y); } }
#define IOFireWireUserClientLogIfErr_(x, y...) \
{ if ((x) != 0) { IOFireWireUserClientLog_(y); } }
#define IOFireWireUserClientLogIfFalse_(x, y...) \
{ if (!(x)) { IOFireWireUserClientLog_(y); } }
#define IOFireWireUserClientLogIfTrue_(x, y...) \
{ if ((x)) { IOFireWireUserClientLog_(y) ; } }
#else
#define IOFireWireUserClientLog_(x...)
#define IOFireWireUserClientLogIfNil_(x, y...)
#define IOFireWireUserClientLogIfErr_(x, y...)
#define IOFireWireUserClientLogIfFalse_(x, y...)
#define IOFireWireUserClientLogIfTrue_(x, y...)
#endif
typedef struct AsyncRefHolder_t
{
OSAsyncReference asyncRef ;
void* userRefCon ;
void* obj ;
} AsyncRefHolder ;
class IOFireWireUserClientStatistics
{
public:
OSDictionary* dict ;
OSNumber* isochCallbacks ;
OSSet* pseudoAddressSpaces ;
} ;
class IOFireWireDevice;
class IOFireWireUserClient : public IOUserClient
{
OSDeclareDefaultStructors(IOFireWireUserClient)
private:
IOFireWireNub * fOwner;
task_t fTask;
IOExternalMethod fMethods[ kNumFireWireMethods ];
IOExternalAsyncMethod fAsyncMethods[ kNumFireWireAsyncMethods ];
IOLock* fSetLock ;
OSSet* fUserPseudoAddrSpaces ; OSSet* fUserPhysicalAddrSpaces ;
OSSet* fUserUnitDirectories ;
OSSet* fUserRemoteConfigDirectories ;
OSSet* fUserIsochChannels ;
OSSet* fUserIsochPorts ;
OSSet* fUserCommandObjects ;
mach_port_t fNotificationPort ;
UInt32 fNotificationRefCon ;
OSAsyncReference fBusResetAsyncNotificationRef ;
OSAsyncReference fBusResetDoneAsyncNotificationRef ;
IONotifier* fNotifier ;
IOService* fOpenClient ;
bool fUnsafeResets ;
public:
virtual void retain() const ;
static IOFireWireUserClient* withTask(
task_t owningTask);
virtual bool start(
IOService * provider );
virtual void stop( IOService * provider );
void deallocateSets() ;
virtual void free() ;
virtual IOReturn clientClose( void );
virtual IOReturn clientDied( void );
virtual IOReturn setProperties(
OSObject* properties ) ;
const task_t getOwningTask() const {return fTask;}
IOFireWireNub* getOwner() const { return fOwner; }
void initMethodTable() ;
void initIsochMethodTable() ;
void initAsyncMethodTable() ;
void initIsochAsyncMethodTable() ;
IOReturn userOpen() ;
IOReturn userOpenWithSessionRef(IOService* session) ;
IOReturn seize(IOOptionBits inFlags ) ;
IOReturn userClose() ;
inline static IOReturn sendAsyncResult(
OSAsyncReference reference,
IOReturn result,
void* args[],
UInt32 numArgs)
{ return IOUserClient::sendAsyncResult(reference, result, args, numArgs) ; }
inline static void setAsyncReference(
OSAsyncReference asyncRef,
mach_port_t wakePort,
void* callback,
void* refcon)
{ IOUserClient::setAsyncReference(asyncRef, wakePort, callback, refcon) ; }
virtual IOExternalMethod* getTargetAndMethodForIndex(
IOService ** target,
UInt32 index) ;
virtual IOExternalAsyncMethod* getAsyncTargetAndMethodForIndex(
IOService ** target,
UInt32 index) ;
virtual IOReturn registerNotificationPort(
mach_port_t port,
UInt32 , UInt32 refCon) ;
virtual IOReturn addObjectToSet(
OSObject* object,
OSSet* set) ;
virtual void removeObjectFromSet(
OSObject* object,
OSSet* set) ;
virtual IOReturn readQuad( const FWReadQuadParams* inParams, UInt32* outVal ) ;
virtual IOReturn read( const FWReadParams* inParams, IOByteCount* outBytesTransferred ) ;
virtual IOReturn writeQuad( const FWWriteQuadParams* inParams ) ;
virtual IOReturn write( const FWWriteParams* inParams, IOByteCount* outBytesTransferred ) ;
virtual IOReturn compareSwap( const FWCompareSwapParams* inParams, UInt64* oldVal) ;
virtual IOReturn busReset();
virtual IOReturn getGenerationAndNodeID(
UInt32* outGeneration,
UInt32* outNodeID) const ;
virtual IOReturn getLocalNodeID(
UInt32* outLocalNodeID) const ;
virtual IOReturn getResetTime(
AbsoluteTime* outResetTime) const ;
virtual IOReturn message(
UInt32 type,
IOService* provider,
void* argument );
virtual IOReturn getOSStringData(
FWKernOSStringRef inStringRef,
UInt32 inStringLen,
char* inStringBuffer,
UInt32* outStringLen) ;
virtual IOReturn getOSDataData(
FWKernOSDataRef inDataRef,
IOByteCount inDataLen,
char* inDataBuffer,
IOByteCount* outDataLen) ;
virtual IOReturn unitDirCreate(
FWKernUnitDirRef* outDir) ;
virtual IOReturn unitDirRelease(
FWKernUnitDirRef dir) ;
virtual IOReturn addEntry_Buffer(
FWKernUnitDirRef dir,
int key,
char* buffer,
UInt32 kr_size ) ;
virtual IOReturn addEntry_UInt32(
FWKernUnitDirRef inDir,
int key,
UInt32 value) ;
virtual IOReturn addEntry_FWAddr(
FWKernUnitDirRef dir,
int key,
FWAddress value ) ;
virtual IOReturn addEntry_UnitDir(
FWKernUnitDirRef dir,
int key,
FWKernUnitDirRef value) ;
virtual IOReturn publish(
FWKernUnitDirRef inDir ) ;
virtual IOReturn unpublish(
FWKernUnitDirRef inDir) ;
virtual IOReturn allocateAddressSpace(
FWAddrSpaceCreateParams* inParams,
FWKernAddrSpaceRef* outKernAddrSpaceRef) ;
virtual IOReturn releaseAddressSpace(
FWKernAddrSpaceRef inAddrSpace) ;
virtual IOReturn getPseudoAddressSpaceInfo(
FWKernAddrSpaceRef inAddrSpaceRef,
UInt32* outNodeID,
UInt32* outAddressHi,
UInt32* outAddressLo) ;
virtual IOReturn setAsyncRef_Packet(
OSAsyncReference asyncRef,
FWKernAddrSpaceRef inAddrSpaceRef,
void* inCallback,
void* inUserRefCon,
void*,
void*,
void*) ;
virtual IOReturn setAsyncRef_SkippedPacket(
OSAsyncReference asyncRef,
FWKernAddrSpaceRef inAddrSpaceRef,
void* inCallback,
void* inUserRefCon,
void*,
void*,
void*) ;
virtual IOReturn setAsyncRef_Read(
OSAsyncReference asyncRef,
FWKernAddrSpaceRef inAddrSpaceRef,
void* inCallback,
void* inUserRefCon,
void*,
void*,
void*) ;
virtual IOReturn setAsyncRef_BusReset(
OSAsyncReference asyncRef,
void* inCallback,
void* inUserRefCon,
void*,
void*,
void*,
void*) ;
virtual IOReturn setAsyncRef_BusResetDone(
OSAsyncReference asyncRef,
void* inCallback,
void* inUserRefCon,
void*,
void*,
void*,
void*) ;
virtual IOReturn clientCommandIsComplete(
FWKernAddrSpaceRef inAddrSpaceRef,
FWClientCommandID inCommandID,
IOReturn inResult ) ;
virtual IOReturn allocatePhysicalAddressSpace(
FWPhysicalAddrSpaceCreateParams* inParams,
FWKernPhysicalAddrSpaceRef* outKernAddrSpaceRef) ;
virtual IOReturn releasePhysicalAddressSpace(
IOFWUserClientPhysicalAddressSpace* inAddrSpace) ;
virtual IOReturn getPhysicalAddressSpaceSegmentCount(
IOFWUserClientPhysicalAddressSpace* inAddrSpace,
UInt32* outSegmentCount) ;
virtual IOReturn getPhysicalAddressSpaceSegments(
IOFWUserClientPhysicalAddressSpace* inAddrSpace,
UInt32 inSegmentCount,
UInt32* outSegmentCount,
IOPhysicalAddress segments[],
IOByteCount segmentLengths[]) ;
virtual IOReturn lazyAllocateUserCommand(
FWUserCommandSubmitParams* inParams,
IOFWUserCommand** outCommand) ;
virtual IOReturn userAsyncCommand_Submit(
OSAsyncReference asyncRef,
FWUserCommandSubmitParams* inParams,
FWUserCommandSubmitResult* outResult,
IOByteCount inParamsSize,
IOByteCount* outResultSize) ;
static void asyncReadWriteCommandCompletion(
void * refcon,
IOReturn status,
IOFireWireNub * device,
IOFWCommand * fwCmd);
virtual IOReturn configDirectoryCreate(
FWKernConfigDirectoryRef* outDirRef) ;
virtual IOReturn configDirectoryRelease(
FWKernConfigDirectoryRef dirRef) ;
virtual IOReturn configDirectoryUpdate(
FWKernConfigDirectoryRef dirRef,
UInt32 offset,
const UInt32*& romBase) ;
virtual IOReturn configDirectoryGetKeyType(
FWKernConfigDirectoryRef dirRef,
int key,
IOConfigKeyType* type);
virtual IOReturn configDirectoryGetKeyValue_UInt32(
FWKernConfigDirectoryRef inDirRef,
int key,
UInt32 wantText,
UInt32* outValue,
FWKernOSStringRef* outString,
UInt32* outStringLen);
virtual IOReturn configDirectoryGetKeyValue_Data( FWKernConfigDirectoryRef inDirRef, int key, UInt32 wantText,
FWGetKeyValueDataResults* results ) ;
virtual IOReturn configDirectoryGetKeyValue_ConfigDirectory(
FWKernConfigDirectoryRef inDirRef,
int key,
UInt32 wantText,
FWKernConfigDirectoryRef* outValue,
FWKernOSStringRef* outString,
UInt32* outStringLen);
virtual IOReturn configDirectoryGetKeyOffset_FWAddress( FWKernConfigDirectoryRef inDirRef, int key, UInt32 wantText,
FWGetKeyOffsetResults* results ) ;
virtual IOReturn configDirectoryGetIndexType(
FWKernConfigDirectoryRef inDirRef,
int index,
IOConfigKeyType* outType);
virtual IOReturn configDirectoryGetIndexKey(
FWKernConfigDirectoryRef inDirRef,
int index,
int* outKey);
virtual IOReturn configDirectoryGetIndexValue_UInt32(
FWKernConfigDirectoryRef inDirRef,
int index,
UInt32* outKey);
virtual IOReturn configDirectoryGetIndexValue_Data(
FWKernConfigDirectoryRef inDirRef,
int index,
FWKernOSDataRef* outDataRef,
IOByteCount* outDataLen);
virtual IOReturn configDirectoryGetIndexValue_String(
FWKernConfigDirectoryRef inDirRef,
int index,
FWKernOSStringRef* outString,
UInt32* outStringLen);
virtual IOReturn configDirectoryGetIndexValue_ConfigDirectory(
FWKernConfigDirectoryRef inDirRef,
int index,
FWKernConfigDirectoryRef* outDirRef);
virtual IOReturn configDirectoryGetIndexOffset_FWAddress(
FWKernConfigDirectoryRef inDirRef,
int index,
UInt32* addressHi,
UInt32* addressLo);
virtual IOReturn configDirectoryGetIndexOffset_UInt32(
FWKernConfigDirectoryRef inDirRef,
int index,
UInt32* outValue);
virtual IOReturn configDirectoryGetIndexEntry(
FWKernConfigDirectoryRef inDirRef,
int index,
UInt32* outValue);
virtual IOReturn configDirectoryGetSubdirectories(
FWKernConfigDirectoryRef inDirRef,
OSIterator** outIterator);
virtual IOReturn configDirectoryGetKeySubdirectories(
FWKernConfigDirectoryRef inDirRef,
int key,
OSIterator** outIterator);
virtual IOReturn configDirectoryGetType(
FWKernConfigDirectoryRef dirRef, int *outType) ;
virtual IOReturn configDirectoryGetNumEntries(
FWKernConfigDirectoryRef dirRef, int *outNumEntries) ;
virtual IOReturn isochPortAllocate(
FWIsochPortAllocateParams* inParams,
FWKernIsochPortRef* outPortRef) ;
virtual IOReturn isochPortRelease(
FWKernIsochPortRef inPortRef) ;
virtual IOReturn isochPortGetSupported(
FWKernIsochPortRef inPortRef,
IOFWSpeed* outMaxSpeed,
UInt32* outChanSupportedHi,
UInt32* outChanSupportedLo) ;
virtual IOReturn isochPortAllocatePort(
FWKernIsochPortRef inPortRef,
IOFWSpeed inSpeed,
UInt32 inChannel) ;
virtual IOReturn isochPortReleasePort(
FWKernIsochPortRef inPortRef) ;
virtual IOReturn isochPortStart(
FWKernIsochPortRef inPortRef) ;
virtual IOReturn isochPortStop(
FWKernIsochPortRef inPortRef) ;
virtual IOReturn localIsochPortAllocate(
FWLocalIsochPortAllocateParams* inParams,
FWKernIsochPortRef* outPortRef) ;
virtual IOReturn localIsochPortModifyJumpDCL(
FWKernIsochPortRef inPortRef,
UInt32 inJumpDCLCompilerData,
UInt32 inLabelDCLCompilerData) ;
virtual IOReturn localIsochPortModifyJumpDCLSize( FWKernIsochPortRef inPortRef, UInt32 inDCLCompilerData,
IOByteCount newSize ) ;
virtual IOReturn setAsyncRef_DCLCallProc(
OSAsyncReference asyncRef,
FWKernIsochPortRef inPortRef,
DCLCallCommandProcPtr inProc ) ;
static IOReturn isochChannelForceStopHandler(
void* refCon,
IOFWIsochChannel* isochChannelID,
UInt32 stopCondition) ;
virtual IOReturn isochChannelAllocate(
bool inDoIRM,
UInt32 inPacketSize,
IOFWSpeed inPrefSpeed,
FWKernIsochChannelRef* outIsochChannelRef) ;
virtual IOReturn isochChannelRelease(
FWKernIsochChannelRef inChannelRef) ;
virtual IOReturn isochChannelUserAllocateChannelBegin(
FWKernIsochChannelRef inChannelRef,
IOFWSpeed inSpeed,
UInt32 inAllowedChansHi,
UInt32 inAllowedChansLo,
IOFWSpeed* outSpeed,
UInt32* outChannel) ;
virtual IOReturn isochChannelUserReleaseChannelComplete(
FWKernIsochChannelRef inChannelRef) ;
virtual IOReturn setAsyncRef_IsochChannelForceStop(
OSAsyncReference asyncRef,
void* inCallback,
void* inUserRefCon,
void*,
void*,
void*,
void*) ;
virtual IOReturn userAsyncCommand_Release(
FWKernCommandRef inCommandRef) ;
virtual IOReturn userAsyncCommand_Cancel(
FWKernCommandRef inCommandRef,
IOReturn reason) { return kIOReturnUnsupported; }
const IOFireWireUserClientStatistics*
getStatistics() { return fStatistics ; }
IOFWReadCommand* createReadCommand(
UInt32 generation,
FWAddress devAddress,
IOMemoryDescriptor* hostMem,
FWDeviceCallback completion,
void * refcon ) const ;
IOFWReadQuadCommand* createReadQuadCommand(
UInt32 generation,
FWAddress devAddress,
UInt32 * quads,
int numQuads,
FWDeviceCallback completion,
void * refcon ) const ;
IOFWWriteCommand* createWriteCommand(
UInt32 generation,
FWAddress devAddress,
IOMemoryDescriptor* hostMem,
FWDeviceCallback completion,
void* refcon ) const ;
IOFWWriteQuadCommand* createWriteQuadCommand(
UInt32 generation,
FWAddress devAddress,
UInt32* quads,
int numQuads,
FWDeviceCallback completion,
void * refcon ) const ;
IOFWCompareAndSwapCommand* createCompareAndSwapCommand(
UInt32 generation,
FWAddress devAddress,
const UInt32 * cmpVal,
const UInt32 * newVal,
int size,
FWDeviceCallback completion,
void * refcon ) const ;
IOReturn firelog( const char* string, IOByteCount bufSize ) const ;
IOReturn getBusGeneration( UInt32* outGeneration ) ;
IOReturn getLocalNodeIDWithGeneration( UInt32 generation, UInt32* outLocalNodeID ) ;
IOReturn getRemoteNodeID( UInt32 generation, UInt32* outRemoteNodeID ) ;
IOReturn getSpeedToNode( UInt32 generation, UInt32* outSpeed ) ;
IOReturn getSpeedBetweenNodes( UInt32 generation, UInt32 fromNode, UInt32 toNode, UInt32* outSpeed ) ;
protected:
IOFireWireUserClientStatistics* fStatistics ;
};
#endif