IOATAStandardController.h [plain text]
#ifndef _IOATASTANDARDCONTROLLER_H
#define _IOATASTANDARDCONTROLLER_H
#include <IOKit/IOWorkLoop.h>
#include <IOKit/IOCommandGate.h>
#include <IOKit/IOInterruptEventSource.h>
#include <IOKit/IOTimerEventSource.h>
#include <libkern/OSByteOrder.h>
#include <IOKit/IOMemoryCursor.h>
class IOATAStandardDevice;
class IOATAStandardCommand;
class IOATAStandardDriver;
class IOATAStandardController : public IOService
{
OSDeclareDefaultStructors(IOATAStandardController)
friend class IOATAStandardCommand;
friend class IOATAStandardDevice;
friend class IOATAStandardDriver;
public:
IOReturn reset();
protected:
void enableCommands();
void disableCommands();
void disableCommands( UInt32 disableTimeoutmS );
void rescheduleCommand( IOATAStandardCommand *forATACmd );
void resetStarted();
void resetOccurred();
IOATAStandardCommand *findCommandWithNexus( IOATAStandardDevice *forDevice, UInt32 tagValue = (UInt32)-1 );
void *getDeviceData( ATAUnit forUnit );
virtual IOWorkLoop *getWorkLoop() const;
UInt32 getCommandCount();
void setCommandLimit( IOATAStandardDevice *device, UInt32 commandLimit );
void suspendDevice( IOATAStandardDevice *forATADevice );
void resumeDevice( IOATAStandardDevice *forATADevice );
IOATAStandardDevice *selectDevice();
bool getTiming( ATAUnit unit, ATATimingProtocol *timingProtocol );
protected:
virtual bool configure( IOService *provider, ATAControllerInfo *controllerInfo ) = 0;
virtual bool getProtocolsSupported( ATAProtocol *protocolsSupported ) = 0;
virtual void executeCommand( IOATAStandardCommand *forATACmd ) = 0;
virtual void cancelCommand( IOATAStandardCommand *forATACmd ) = 0;
virtual void resetCommand( IOATAStandardCommand *forATACmd ) = 0;
virtual void abortCommand( IOATAStandardCommand *forATACmd ) = 0;
virtual bool calculateTiming( UInt32 deviceNum, ATATiming *timing ) = 0;
protected:
virtual bool allocateDevice( ATAUnit unit );
virtual void deallocateDevice( ATAUnit unit );
virtual void disableTimeoutOccurred();
virtual void enableControllerInterrupts();
virtual void disableControllerInterrupts();
public:
bool start( IOService *provider );
void free();
private:
void initQueues();
bool scanATABus();
void resetATABus();
bool createDeviceNubs();
bool probeDeviceNubs();
bool registerDeviceNubs();
bool initTimings();
bool matchNubWithPropertyTable( IOService *nub, OSDictionary *table );
bool resetBus();
bool initDevice( IOATAStandardDevice *device );
void releaseDevice( IOATAStandardDevice *device );
bool workLoopRequest( WorkLoopReqType type, UInt32 p1=0, UInt32 p2=0, UInt32 p3=0 );
void workLoopProcessRequest( WorkLoopRequest *workLoopReq, void *p1, void *p2, void *p3 );
void addDevice( IOATAStandardDevice *forDevice );
void deleteDevice( IOATAStandardDevice *forDevice );
void timer( IOTimerEventSource *);
void dispatchRequest();
void dispatch();
bool checkBusReset();
void completeCommand( IOATAStandardCommand *forATACmd );
bool createWorkLoop();
bool configureController();
IOATAStandardCommand *allocCommand( UInt32 clientDataSize );
private:
UInt32 sequenceNumber;
UInt32 commandCount;
UInt32 commandLimit;
UInt32 commandLimitSave;
UInt32 disableTimer;
bool commandDisable;
UInt32 busResetState;
IOATAStandardCommand *resetCmd;
UInt32 resetTimer;
IOATAStandardCommand *noDisconnectCmd;
ATAControllerInfo controllerInfo;
ATATarget *targets;
IOWorkLoop *workLoop;
IOTimerEventSource *timerEvent;
IOInterruptEventSource *dispatchEvent;
IOCommandGate *workLoopReqGate;
IOService *provider;
};
#endif