#ifndef _IOKIT_IOFWCOMMAND_H
#define _IOKIT_IOFWCOMMAND_H
#include <IOKit/IOCommand.h>
#include <IOKit/IOLib.h>
#include <IOKit/firewire/IOFWRegs.h>
class IOMemoryDescriptor;
class IOSyncer;
class IOFireWireBus;
class IOFireWireController;
class IOFireWireNub;
class IOFWAddressSpace; class IOFWCommand;
class IOFWBusCommand;
class IOCommandGate;
struct AsyncPendingTrans;
typedef void (*FWDeviceCallback)(void *refcon, IOReturn status, IOFireWireNub *device, IOFWCommand *fwCmd);
typedef void (*FWBusCallback)(void *refcon, IOReturn status, IOFireWireBus *bus, IOFWBusCommand *fwCmd);
struct IOFWCmdQ
{
IOFWCommand *fHead;
IOFWCommand *fTail;
bool executeQueue(bool all);
virtual void headChanged(IOFWCommand *oldHead);
};
class IOFWCommand : public IOCommand
{
OSDeclareAbstractStructors(IOFWCommand)
protected:
IOReturn fStatus;
IOFireWireController *fControl;
IOFWCommand * fQueuePrev;
IOFWCommand * fQueueNext;
IOFWCmdQ * fQueue;
UInt32 fTimeout; AbsoluteTime fDeadline; IOSyncer * fSyncWakeup;
UInt8 fSync;
UInt8 fCancelOnReset;
UInt8 spare[2];
struct ExpansionData { };
ExpansionData *reserved;
virtual IOReturn complete(IOReturn status);
virtual void updateTimer();
virtual IOReturn startExecution();
virtual IOReturn execute() = 0;
public:
virtual bool initWithController(IOFireWireController *control);
IOReturn getStatus() const { return fStatus; };
virtual IOReturn submit(bool queue = false);
virtual IOReturn cancel(IOReturn reason);
virtual void setHead(IOFWCmdQ &queue);
virtual void insertAfter(IOFWCommand &prev);
virtual void removeFromQ();
IOFWCommand *getPrevious() const
{ return fQueuePrev; };
IOFWCommand *getNext() const
{ return fQueueNext; };
const AbsoluteTime &getDeadline() const
{ return fDeadline; };
bool cancelOnReset() const
{ return fCancelOnReset; };
bool Busy() const
{ return fStatus == kIOReturnBusy || fStatus == kIOFireWirePending;};
friend class IOFWCmdQ;
private:
OSMetaClassDeclareReservedUnused(IOFWCommand, 0);
OSMetaClassDeclareReservedUnused(IOFWCommand, 1);
};
class IOFWBusCommand : public IOFWCommand
{
OSDeclareAbstractStructors(IOFWBusCommand)
protected:
FWBusCallback fComplete;
void * fRefCon;
struct ExpansionData { };
ExpansionData *reserved;
virtual IOReturn complete(IOReturn status);
virtual bool initWithController(IOFireWireController *control,
FWBusCallback completion=NULL, void *refcon=NULL);
virtual IOReturn reinit(FWBusCallback completion, void *refcon);
private:
OSMetaClassDeclareReservedUnused(IOFWBusCommand, 0);
};
class IOFWDelayCommand : public IOFWBusCommand
{
OSDeclareDefaultStructors(IOFWDelayCommand)
struct ExpansionData { };
ExpansionData *reserved;
protected:
virtual IOReturn execute();
public:
virtual bool initWithDelay(IOFireWireController *control, UInt32 uSecs,
FWBusCallback completion, void *refcon);
virtual IOReturn reinit(UInt32 uSecs, FWBusCallback completion, void *refcon);
private:
OSMetaClassDeclareReservedUnused(IOFWDelayCommand, 0);
};
class IOFWUserReadQuadletCommand ;
class IOFWUserWriteCommand ;
class IOFWAsyncCommand : public IOFWCommand
{
friend class IOFWUserReadQuadletCommand ;
friend class IOFWUserWriteCommand ;
OSDeclareAbstractStructors(IOFWAsyncCommand)
protected:
IOFireWireNub * fDevice;
FWDeviceCallback fComplete;
void * fRefCon;
IOMemoryDescriptor *fMemDesc;
AsyncPendingTrans * fTrans;
UInt32 fAddressHi;
UInt32 fAddressLo;
IOByteCount fBytesTransferred;
int fSize;
int fSpeed;
int fMaxPack;
int fCurRetries;
int fMaxRetries;
UInt32 fGeneration; UInt16 fNodeID;
bool fFailOnReset;
bool fWrite;
struct ExpansionData { };
ExpansionData *reserved;
virtual IOReturn complete(IOReturn status);
virtual bool initAll(IOFireWireNub *device, FWAddress devAddress,
IOMemoryDescriptor *hostMem,
FWDeviceCallback completion, void *refcon, bool failOnReset);
virtual bool initAll(IOFireWireController *control,
UInt32 generation, FWAddress devAddress,
IOMemoryDescriptor *hostMem,
FWDeviceCallback completion, void *refcon);
virtual IOReturn reinit(FWAddress devAddress, IOMemoryDescriptor *hostMem,
FWDeviceCallback completion, void *refcon, bool failOnReset);
virtual IOReturn reinit(UInt32 generation, FWAddress devAddress, IOMemoryDescriptor *hostMem,
FWDeviceCallback completion, void *refcon);
public:
virtual void setGeneration(UInt32 generation)
{ fGeneration = generation; }
virtual void gotPacket(int rcode, const void* data, int size) = 0;
virtual void gotAck(int ackCode);
IOReturn updateGeneration();
IOReturn updateNodeID(UInt32 generation, UInt16 nodeID);
IOByteCount getBytesTransferred() const
{ return fBytesTransferred; };
FWAddress getAddress() const
{ return FWAddress(fAddressHi, fAddressLo, fNodeID); }
bool failOnReset() const
{ return fFailOnReset; }
IOFireWireNub * getDevice() const
{ return fDevice; }
IOReturn setMaxPacket(UInt32 maxBytes)
{
if(fStatus == kIOReturnBusy || fStatus == kIOFireWirePending)
return fStatus;
fMaxPack = maxBytes;
return kIOReturnSuccess;
}
private:
OSMetaClassDeclareReservedUnused(IOFWAsyncCommand, 0);
OSMetaClassDeclareReservedUnused(IOFWAsyncCommand, 1);
OSMetaClassDeclareReservedUnused(IOFWAsyncCommand, 2);
OSMetaClassDeclareReservedUnused(IOFWAsyncCommand, 3);
};
class IOFWReadCommand : public IOFWAsyncCommand
{
OSDeclareDefaultStructors(IOFWReadCommand)
protected:
virtual void gotPacket(int rcode, const void* data, int size);
virtual IOReturn execute();
public:
virtual bool initAll(IOFireWireNub *device, FWAddress devAddress,
IOMemoryDescriptor *hostMem,
FWDeviceCallback completion, void *refcon, bool failOnReset);
virtual bool initAll(IOFireWireController *control,
UInt32 generation, FWAddress devAddress,
IOMemoryDescriptor *hostMem,
FWDeviceCallback completion, void *refcon);
virtual IOReturn reinit(FWAddress devAddress, IOMemoryDescriptor *hostMem,
FWDeviceCallback completion=NULL, void *refcon=NULL,
bool failOnReset=false);
virtual IOReturn reinit(UInt32 generation, FWAddress devAddress, IOMemoryDescriptor *hostMem,
FWDeviceCallback completion=NULL, void *refcon=NULL);
private:
OSMetaClassDeclareReservedUnused(IOFWReadCommand, 0);
OSMetaClassDeclareReservedUnused(IOFWReadCommand, 1);
};
class IOFWReadQuadCommand : public IOFWAsyncCommand
{
OSDeclareDefaultStructors(IOFWReadQuadCommand)
protected:
UInt32 * fQuads;
virtual void gotPacket(int rcode, const void* data, int size);
virtual IOReturn execute();
public:
virtual bool initAll(IOFireWireNub *device, FWAddress devAddress,
UInt32 *quads, int numQuads,
FWDeviceCallback completion, void *refcon, bool failOnReset);
virtual bool initAll(IOFireWireController *control,
UInt32 generation, FWAddress devAddress,
UInt32 *quads, int numQuads,
FWDeviceCallback completion, void *refcon);
virtual IOReturn reinit(FWAddress devAddress, UInt32 *quads, int numQuads,
FWDeviceCallback completion=NULL, void *refcon=NULL,
bool failOnReset=false);
virtual IOReturn reinit(UInt32 generation, FWAddress devAddress, UInt32 *quads, int numQuads,
FWDeviceCallback completion=NULL, void *refcon=NULL);
private:
OSMetaClassDeclareReservedUnused(IOFWReadQuadCommand, 0);
OSMetaClassDeclareReservedUnused(IOFWReadQuadCommand, 1);
};
class IOFWWriteCommand : public IOFWAsyncCommand
{
OSDeclareDefaultStructors(IOFWWriteCommand)
virtual IOReturn execute();
protected:
int fPackSize;
virtual void gotPacket(int rcode, const void* data, int size);
public:
virtual bool initAll(IOFireWireNub *device, FWAddress devAddress,
IOMemoryDescriptor *hostMem,
FWDeviceCallback completion, void *refcon, bool failOnReset);
virtual bool initAll(IOFireWireController *control,
UInt32 generation, FWAddress devAddress,
IOMemoryDescriptor *hostMem,
FWDeviceCallback completion, void *refcon);
virtual IOReturn reinit(FWAddress devAddress, IOMemoryDescriptor *hostMem,
FWDeviceCallback completion=NULL, void *refcon=NULL,
bool failOnReset=false);
virtual IOReturn reinit(UInt32 generation, FWAddress devAddress, IOMemoryDescriptor *hostMem,
FWDeviceCallback completion=NULL, void *refcon=NULL);
private:
OSMetaClassDeclareReservedUnused(IOFWWriteCommand, 0);
OSMetaClassDeclareReservedUnused(IOFWWriteCommand, 1);
};
class IOFWWriteQuadCommand : public IOFWAsyncCommand
{
OSDeclareDefaultStructors(IOFWWriteQuadCommand)
public:
enum {
kMaxWriteQuads = 8
};
protected:
UInt32 fQuads[kMaxWriteQuads];
UInt32 * fQPtr;
int fPackSize;
virtual void gotPacket(int rcode, const void* data, int size);
virtual IOReturn execute();
public:
virtual bool initAll(IOFireWireNub *device, FWAddress devAddress,
UInt32 *quads, int numQuads,
FWDeviceCallback completion, void *refcon, bool failOnReset);
virtual bool initAll(IOFireWireController *control,
UInt32 generation, FWAddress devAddress,
UInt32 *quads, int numQuads,
FWDeviceCallback completion, void *refcon);
virtual IOReturn reinit(FWAddress devAddress, UInt32 *quads, int numQuads,
FWDeviceCallback completion=NULL, void *refcon=NULL,
bool failOnReset=false);
virtual IOReturn reinit(UInt32 generation, FWAddress devAddress, UInt32 *quads, int numQuads,
FWDeviceCallback completion=NULL, void *refcon=NULL);
private:
OSMetaClassDeclareReservedUnused(IOFWWriteQuadCommand, 0);
OSMetaClassDeclareReservedUnused(IOFWWriteQuadCommand, 1);
};
class IOFWCompareAndSwapCommand : public IOFWAsyncCommand
{
OSDeclareDefaultStructors(IOFWCompareAndSwapCommand)
protected:
UInt32 fInputVals[4];
UInt32 fOldVal[2];
struct ExpansionData { };
ExpansionData *reserved;
virtual void gotPacket(int rcode, const void* data, int size);
virtual IOReturn execute();
public:
virtual bool initAll(IOFireWireNub *device, FWAddress devAddress,
const UInt32 *cmpVal, const UInt32 *newVal, int size,
FWDeviceCallback completion, void *refcon, bool failOnReset);
virtual bool initAll(IOFireWireController *control,
UInt32 generation, FWAddress devAddress,
const UInt32 *cmpVal, const UInt32 *newVal, int size,
FWDeviceCallback completion, void *refcon);
virtual IOReturn reinit(FWAddress devAddress, const UInt32 *cmpVal, const UInt32 *newVal, int size,
FWDeviceCallback completion=NULL, void *refcon=NULL, bool failOnReset=false);
virtual IOReturn reinit(UInt32 generation, FWAddress devAddress,
const UInt32 *cmpVal, const UInt32 *newVal, int size,
FWDeviceCallback completion=NULL, void *refcon=NULL);
virtual bool locked(UInt32 *oldVal);
private:
OSMetaClassDeclareReservedUnused(IOFWCompareAndSwapCommand, 0);
OSMetaClassDeclareReservedUnused(IOFWCompareAndSwapCommand, 1);
OSMetaClassDeclareReservedUnused(IOFWCompareAndSwapCommand, 2);
OSMetaClassDeclareReservedUnused(IOFWCompareAndSwapCommand, 3);
};
#endif