IOFWUserPseudoAddressSpace.h [plain text]
#ifndef __IOFWUserClientPsduAddrSpace_H__
#define __IOFWUserClientPsduAddrSpace_H__
#import <IOKit/firewire/IOFireWireFamilyCommon.h>
#import <IOKit/firewire/IOFWAddressSpace.h>
#import "IOFireWireLibPriv.h"
#import "IOFWRingBufferQ.h"
using namespace IOFireWireLib ;
typedef union IOFWPacketHeader_t
{
typedef enum
{
kFree = 0,
kStopPacket = 'stop',
kBadPacket = ' bad',
kIncomingPacket = 'pckt',
kSkippedPacket = 'skip',
kReadPacket = 'read',
kLockPacket = 'lock'
} QueueTag ;
struct
{
QueueTag type ;
IOFWPacketHeader_t* next ;
OSAsyncReference64* whichAsyncRef ;
UInt32 argCount ;
io_user_reference_t headerSize ; io_user_reference_t headerOffset ;
io_user_reference_t args[9] ;
} CommonHeader ;
struct
{
QueueTag type ;
IOFWPacketHeader_t* next ;
OSAsyncReference64* whichAsyncRef ;
UInt32 argCount ;
io_user_reference_t headerSize ; io_user_reference_t headerOffset ;
io_user_reference_t commandID ; io_user_reference_t packetSize ; io_user_reference_t packetOffset ; io_user_reference_t nodeID ;
io_user_reference_t speed ;
io_user_reference_t addrHi ;
io_user_reference_t addrLo ;
io_user_reference_t isLock ;
io_user_reference_t generation ;
io_user_reference_t reqrefcon ;
} IncomingPacket ;
struct SkippedPacket_t
{
QueueTag type ;
IOFWPacketHeader_t* next ;
OSAsyncReference64* whichAsyncRef ;
UInt32 argCount ;
io_user_reference_t headerSize ; io_user_reference_t headerOffset ;
io_user_reference_t commandID ; io_user_reference_t skippedPacketCount ;
} SkippedPacket ;
struct ReadPacket_t
{
QueueTag type ;
IOFWPacketHeader_t* next ;
OSAsyncReference64* whichAsyncRef ;
UInt32 argCount ;
io_user_reference_t headerSize ; io_user_reference_t headerOffset ;
io_user_reference_t commandID ; io_user_reference_t packetSize ; io_user_reference_t packetOffset ; io_user_reference_t nodeID ;
io_user_reference_t speed ;
io_user_reference_t addrHi ;
io_user_reference_t addrLo ;
io_user_reference_t reqrefcon ;
io_user_reference_t generation ;
} ReadPacket ;
public:
IOFWPacketHeader_t() ;
} IOFWPacketHeader ;
io_user_reference_t& IOFWPacketHeaderGetSize(IOFWPacketHeader_t* hdr) ;
io_user_reference_t& IOFWPacketHeaderGetOffset(IOFWPacketHeader_t* hdr) ;
void InitIncomingPacketHeader(
IOFWPacketHeader_t* header,
IOFWPacketHeader_t* next,
const IOByteCount len,
const IOByteCount offset,
OSAsyncReference64* ref,
UInt16 nodeID,
const IOFWSpeed& speed,
const FWAddress& addr,
const bool isLock = false) ; inline void InitSkippedPacketHeader(
IOFWPacketHeader* header,
const union IOFWPacketHeader_t* next,
const IOByteCount offset,
OSAsyncReference64* ref) ;
inline void InitReadPacketHeader(
IOFWPacketHeader* header,
IOFWPacketHeader* next,
UInt32 len,
UInt32 offset,
OSAsyncReference64* ref,
void* refCon,
UInt16 nodeID,
IOFWSpeed& speed,
FWAddress addr,
IOFWRequestRefCon reqrefcon) ;
inline void InitLockPacketHeader(
IOFWPacketHeader* header,
IOFWPacketHeader* next,
IOByteCount len,
IOByteCount offset,
OSAsyncReference64* ref,
UInt16 nodeID,
IOFWSpeed& speed,
FWAddress addr,
const UInt32 generation,
IOFWRequestRefCon reqrefcon) ;
inline Boolean IsSkippedPacketHeader(const union IOFWPacketHeader_t* header) ;
inline Boolean IsFreePacketHeader(const union IOFWPacketHeader_t* header) ;
class IOFireWireUserClient ;
class IOFWUserPseudoAddressSpace: public IOFWPseudoAddressSpace
{
OSDeclareDefaultStructors(IOFWUserPseudoAddressSpace)
public:
#if IOFIREWIREUSERCLIENTDEBUG > 0
virtual bool serialize(OSSerialize *s) const;
#endif
virtual void free() ;
static void exporterCleanup( const OSObject * self );
virtual void deactivate() ;
bool completeInit( IOFireWireUserClient* userclient, AddressSpaceCreateParams* params ) ;
bool initPseudo( IOFireWireUserClient* userclient, AddressSpaceCreateParams* params ) ;
bool initFixed( IOFireWireUserClient* userclient, AddressSpaceCreateParams* params ) ;
virtual UInt32 doLock(
UInt16 nodeID,
IOFWSpeed & speed,
FWAddress addr,
UInt32 inLen,
const UInt32 * newVal,
UInt32 & outLen,
UInt32 * oldVal,
UInt32 type,
IOFWRequestRefCon refcon) ;
UInt32 doPacket(
UInt16 nodeID,
IOFWSpeed& speed,
FWAddress addr,
UInt32 len,
const void* buf,
IOFWRequestRefCon reqrefcon,
IOFWPacketHeader::QueueTag tag,
UInt32* oldVal = NULL) ;
const FWAddress& getBase() { return fAddress ; }
const UInt32 getUserRefCon() { return fUserRefCon ;}
const IOFireWireUserClient& getUserClient() { return *fUserClient ;}
static UInt32 pseudoAddrSpaceReader(
void* refCon,
UInt16 nodeID,
IOFWSpeed& speed,
FWAddress addr,
UInt32 len,
IOMemoryDescriptor** buf,
IOByteCount* offset,
IOFWRequestRefCon reqrefcon) ;
static UInt32 pseudoAddrSpaceWriter(
void* refCon,
UInt16 nodeID,
IOFWSpeed& speed,
FWAddress addr,
UInt32 len,
const void* buf,
IOFWRequestRefCon reqrefcon) ;
void setAsyncRef_Packet(
OSAsyncReference64 inAsyncRef) ;
void setAsyncRef_SkippedPacket(
OSAsyncReference64 inAsyncRef) ;
void setAsyncRef_Read(
OSAsyncReference64 inAsyncRef) ;
void clientCommandIsComplete(
FWClientCommandID inCommandID,
IOReturn inResult ) ;
void sendPacketNotification(
IOFWPacketHeader* inPacketHeader) ;
private:
IOFWRingBufferQ * fPacketQueue; IOLock* fLock ;
mach_vm_address_t fUserRefCon ;
IOFireWireUserClient* fUserClient ;
IOFWPacketHeader* fLastWrittenHeader ;
IOFWPacketHeader* fLastReadHeader ;
FWAddress fAddress ;
OSAsyncReference64 fSkippedPacketAsyncNotificationRef ;
OSAsyncReference64 fPacketAsyncNotificationRef ;
OSAsyncReference64 fReadAsyncNotificationRef ;
bool fWaitingForUserCompletion ;
bool fUserLocks ;
UInt32 fFlags ;
Boolean fPacketQueuePrepared ;
Boolean fBackingStorePrepared ;
} ;
#endif //__IOFWUserClientPsduAddrSpace_H__