#ifndef _IOKIT_IOFWDCLPROGRAM_H
#define _IOKIT_IOFWDCLPROGRAM_H
#include <libkern/c++/OSObject.h>
#include <IOKit/firewire/IOFWIsoch.h>
#include <IOKit/firewire/IOFireWireBus.h>
#include <IOKit/IOMemoryCursor.h>
class IODCLProgram : public OSObject
{
OSDeclareAbstractStructors(IODCLProgram)
protected:
SInt32 fDCLTaskToKernel;
SInt32 fDataTaskToKernel;
IOByteCount fDataBase;
IOMemoryDescriptor *fDCLDesc;
IOMemoryDescriptor *fDataDesc;
IOMemoryCursor *fDataCursor;
IOFireWireBus::CallUserProc * fCallUser;
void *fCallRefCon;
struct ExpansionData { };
ExpansionData *reserved;
DCLCommandPtr convertDCLPtrToKernel(DCLCommandPtr dcl)
{if (dcl) return (DCLCommandPtr)((UInt32)dcl + fDCLTaskToKernel); else return dcl;};
DCLCommandPtr convertDCLPtrFromKernel(DCLCommandPtr dcl)
{if (dcl) return (DCLCommandPtr)((UInt32)dcl - fDCLTaskToKernel); else return dcl;};
void * convertDataPtrToKernel(void *ptr)
{if (ptr) return (void *)((UInt32)ptr + fDataTaskToKernel); else return ptr;};
virtual UInt32 getPhysicalSegs(void *addr, IOByteCount len,
IOMemoryCursor::PhysicalSegment segs[], UInt32 maxSegs);
void dumpDCL(DCLCommand *op);
virtual void free();
public:
virtual bool init(IOFireWireBus::DCLTaskInfo *info=NULL);
virtual IOReturn allocateHW(IOFWSpeed speed, UInt32 chan) = 0;
virtual IOReturn releaseHW() = 0;
virtual IOReturn compile(IOFWSpeed speed, UInt32 chan) = 0;
virtual IOReturn notify(UInt32 notificationType,
DCLCommandPtr *dclCommandList, UInt32 numDCLCommands) = 0;
virtual IOReturn start() = 0;
virtual void stop() = 0;
virtual IOReturn pause();
virtual IOReturn resume();
private:
OSMetaClassDeclareReservedUnused(IODCLProgram, 0);
OSMetaClassDeclareReservedUnused(IODCLProgram, 1);
OSMetaClassDeclareReservedUnused(IODCLProgram, 2);
OSMetaClassDeclareReservedUnused(IODCLProgram, 3);
};
#endif