IOATAStandardDriver.h [plain text]
#ifndef _IOATASTANDARDDRIVER_H
#define _IOATASTANDARDDRIVER_H
class IOATAStandardDriver : public IOATAStandardController
{
OSDeclareAbstractStructors( IOATAStandardDriver )
protected:
virtual void writeATAReg( UInt32 regIndex, UInt32 regValue ) = 0;
virtual UInt32 readATAReg( UInt32 regIndex ) = 0;
virtual bool selectTiming( ATAUnit deviceNum, ATATimingProtocol timingProtocol ) = 0;
virtual bool programDma( IOATAStandardCommand *cmd );
virtual bool startDma( IOATAStandardCommand *cmd );
virtual bool stopDma( IOATAStandardCommand *cmd, UInt32 *transferCount );
virtual bool resetDma();
virtual bool checkDmaActive();
virtual void newDeviceSelected( IOATAStandardDevice *newDevice );
virtual bool getProtocolsSupported( ATAProtocol *forProtocol );
virtual void interruptOccurred();
virtual void resetCommand( IOATAStandardCommand *cmd );
virtual void executeCommand( IOATAStandardCommand *cmd );
virtual void abortCommand( IOATAStandardCommand *cmd );
virtual void cancelCommand( IOATAStandardCommand *cmd );
private:
void processATAPioInt();
void processATADmaInt();
void processATAPIPioInt();
void processATAPIDmaInt();
void processATADmaQueuedInt();
ATAReturnCode readATAPIDevice( UInt32 n );
ATAReturnCode writeATAPIDevice( UInt32 n );
ATAReturnCode sendATAPIPacket( IOATAStandardCommand *cmd );
IOReturn getIOReturnCode( ATAReturnCode code );
void doProtocolSetRegs( IOATAStandardCommand *cmd );
void doATAReset( IOATAStandardCommand *cmd );
void checkATAResetComplete();
void doATAProtocolPio( IOATAStandardCommand *cmd );
void doATAProtocolDma( IOATAStandardCommand *cmd );
void doATAProtocolDmaQueued( IOATAStandardCommand *cmd );
void doATAPIProtocolPio( IOATAStandardCommand *cmd );
void doATAPIProtocolDma( IOATAStandardCommand *cmd );
void doProtocolNotSupported( IOATAStandardCommand *cmd );
bool selectDrive( UInt32 driveHeadReg );
void completeCmd( IOATAStandardCommand *cmd, ATAReturnCode returnCode, UInt32 bytesTransferred = 0 );
void completeCmd( IOATAStandardCommand *cmd );
void updateCmdStatus( IOATAStandardCommand *cmd, ATAReturnCode returnCode, UInt32 bytesTransferred );
bool waitForStatus( UInt32 statusBitsOn, UInt32 statusBitsOff, UInt32 timeoutmS );
bool waitForAltStatus( UInt32 statusBitsOn, UInt32 statusBitsOff, UInt32 timeoutmS );
ATAReturnCode waitForDRQ( UInt32 timeoutmS );
bool start(IOService *provider);
IOReturn setPowerState(unsigned long powerStateOrdinal, IOService* whatDevice);
protected:
IOATAStandardDevice *currentDevice;
ATAUnit currentUnit;
ATAProtocol currentProtocol;
private:
IOMemoryDescriptor *xferDesc;
bool xferIsWrite;
UInt32 xferCount;
UInt32 xferRemaining;
bool dmaActive;
IOTimerEventSource *resetPollEvent;
IOATAStandardCommand *resetCmd;
AbsoluteTime resetTimeout;
bool wakingUpFromSleep;
};
#endif