#ifndef _IOKIT_IOCDBUSERCLIENT_H_
#define _IOKIT_IOCDBUSERCLIENT_H_
#include <IOKit/scsi/scsi-device/SCSIPublic.h>
#include <IOKit/scsi/scsi-device/SCSICommand.h>
enum IOCDBUserClientAsyncCommandCodes {
kIOCDBUserClientSetAsyncPort, kIOCDBUserClientNumAsyncCommands
};
enum IOCDBUserClientCommandCodes {
kIOCDBUserClientGetInquiryData, kIOCDBUserClientOpen, kIOCDBUserClientClose, kIOCDBUserClientAbort, kIOCDBUserClientReset, kIOCDBUserClientCommandAlloc, kIOCDBUserClientCommandExecute, kIOCDBUserClientCommandAbort, kIOCDBUserClientCommandFree, kIOCDBUserClientNumCommands
};
struct IOCDBResultSense {
SCSISenseData fSenseData;
SCSIResults fCDBResults; };
struct IOCDBCommandExecuteData {
CDBInfo cdbInfo;
int kernelHandle;
int sgEntries;
UInt32 timeoutMS;
UInt32 transferCount;
bool isWrite;
bool isSynch;
IOVirtualRange sgList[0];
};
#define kIOCDBCommandExecuteDataMaxSize 1024
#if KERNEL
#include <mach/mach_types.h>
#include <IOKit/IOUserClient.h>
class IOSCSIDevice;
class IOSCSICommand;
class IOSyncer;
class IOCommandGate;
struct CDBResults;
class IOCDBUserClient : public IOUserClient
{
OSDeclareDefaultStructors(IOCDBUserClient)
public:
enum constants { kMaxCommands = 32 };
struct commandData {
IOSyncer *fSyncher;
IOCDBUserClient *fCDBUserClient;
IOMemoryDescriptor *fResultSenseMem;
SCSIResults fResults;
OSAsyncReference fAsyncRef;
UInt32 fActiveSequenceNumber;
UInt32 fIsActive;
};
protected:
static const IOExternalMethod
sMethods[kIOCDBUserClientNumCommands];
static const IOExternalAsyncMethod
sAsyncMethods[kIOCDBUserClientNumAsyncCommands];
IOSCSICommand *fCommandPool[kMaxCommands];
IOSCSIDevice *fNub;
IOCommandGate *fGate;
const IOExternalMethod *fMethods;
const IOExternalAsyncMethod *fAsyncMethods;
task_t fClient;
mach_port_t fWakePort;
int fNumMethods, fNumAsyncMethods;
virtual bool
initWithTask(task_t owningTask, void *security_id, UInt32 type);
virtual IOReturn clientClose(void);
virtual bool start(IOService *provider);
virtual void setExternalMethodVectors();
virtual IOExternalMethod *
getTargetAndMethodForIndex(IOService **target, UInt32 index);
virtual IOExternalAsyncMethod *
getAsyncTargetAndMethodForIndex(IOService **target, UInt32 index);
virtual IOReturn setAsyncPort(OSAsyncReference asyncRef,
void *, void *, void *,
void *, void *, void *);
virtual IOReturn getInquiryData(void *vinSize, void *vBuf, void *voutSize,
void *, void *, void *);
virtual IOReturn open(void *, void *, void *,
void *, void *, void *);
virtual IOReturn close(void * = 0, void * = 0, void * = 0,
void * = 0, void * = 0, void *gated = 0);
virtual IOReturn abort(void *, void *, void *,
void *, void *, void *);
virtual IOReturn reset(void *, void *, void *,
void *, void *, void *);
virtual IOReturn
userCommandAlloc(void *vTarget, void *vCallback, void *voutCmd,
void *, void *, void *gated);
virtual IOReturn userCommandExecute(void *vIn, void *vOut, void *vInSize,
void *vOutSize, void *, void *gated);
virtual IOReturn userCommandAbort(void *vCmd, void *, void *,
void *, void *, void *gated);
virtual IOReturn userCommandFree(void *vCmd, void *, void *,
void *, void *, void *gated);
static void commandComplete(void *vCmd, void *vCmdData);
protected:
virtual IOSCSICommand *newCommand();
virtual IOSCSICommand *allocCommand(
void *vResSenseData, void *vTarget, void *vCallback);
virtual bool initCommand(IOSCSICommand *cmd,
void *vResSenseData, void *vTarget, void *vCallback);
virtual void freeCommand(IOSCSICommand *cmd);
virtual IOSCSICommand *getCommand(void *vCmd);
static IOReturn closeAction
(OSObject *self, void *, void *, void *, void *);
static IOReturn userCommandAllocAction
(OSObject *self, void *voutCmd, void *, void *, void *);
static IOReturn userCommandExecuteAction
(OSObject *self, void *vIn, void *vOut, void *vInSize, void *vOutSize);
static IOReturn userCommandAbortAction
(OSObject *self, void *vCmd, void *, void *, void *);
static IOReturn userCommandFreeAction
(OSObject *self, void *vCmd, void *, void *, void *);
};
#endif
#endif