#ifndef _IOATACONTROLLER_H
#define _IOATACONTROLLER_H
#include <IOKit/IOTypes.h>
#include <IOKit/IOBufferMemoryDescriptor.h>
#include <IOKit/IOCommandGate.h>
#include <IOKit/IOService.h>
#include <IOKit/IOWorkLoop.h>
#include "ATATimerEventSource.h"
class IOATADevice;
class IOATABusCommand;
class IOATABusInfo;
class IOATADevConfig;
class IOATAController : public IOService
{
OSDeclareDefaultStructors(IOATAController);
public:
virtual IOReturn provideBusInfo( IOATABusInfo* infoOut);
virtual IOReturn selectConfig( IOATADevConfig* configRequest, UInt32 unitNumber);
virtual IOReturn getConfig( IOATADevConfig* configRequest, UInt32 unitNumber);
virtual IOReturn executeCommand( IOATADevice* nub, IOATABusCommand* cmd);
virtual bool init(OSDictionary * properties);
virtual IOService* probe( IOService* provider, SInt32* score );
virtual bool start( IOService* provider );
protected:
enum {
kBusFree = 'free', kBusBusy = 'busy', kQueueOpen = '!lck', kQueueLocked = 'LOCK', kImmediateLocked = '!Imd', kImmediateOK = 'Immd' };
enum transState {
kATAInitial = 0x00, kATAStarted = 0x01, kATAPICmd = 0x02, kATADataTx = 0x03, kATAStatus = 0x04, kATAComplete = 0x05, kATADone = 0x06 };
struct ataDevInfo {
ataDeviceType type; atapiConfig packetSend; };
struct ataDoubleBuffer
{
IOPhysicalAddress physicalBuffer;
IOLogicalAddress logicalBuffer;
IOByteCount bufferSize;
};
IOService* _provider;
IOWorkLoop* _workLoop;
IOCommandGate* _cmdGate;
ATATimerEventSource* _timer;
queue_head_t _commandQueue;
IOATABusCommand* _currentCommand;
UInt32 _busState;
UInt32 _queueState;
UInt32 _immediateGate;
ataUnitID _selectedUnit;
ataDevInfo _devInfo[2];
IOATADevice* _nub[2];
ataDoubleBuffer _doubleBuffer;
IOATARegPtr8 _tfFeatureReg;
IOATARegPtr8 _tfSCountReg;
IOATARegPtr8 _tfSectorNReg;
IOATARegPtr8 _tfCylLoReg;
IOATARegPtr8 _tfCylHiReg;
IOATARegPtr8 _tfSDHReg;
IOATARegPtr8 _tfStatusCmdReg;
IOATARegPtr16 _tfDataReg;
IOATARegPtr8 _tfAltSDevCReg;
virtual bool allocateDoubleBuffer( void );
virtual void swapBytes16( UInt8* dataBuffer, IOByteCount length);
virtual IOReturn handleCommand( void * command,
void * param1 = 0,
void * param2 = 0,
void * param3 = 0);
virtual bool busCanDispatch( void );
virtual IOReturn dispatchNext( void );
virtual void completeIO( IOReturn commandResult );
virtual IOReturn enqueueCommand( IOATABusCommand* command);
virtual IOATABusCommand* dequeueFirstCommand( void );
virtual void executeEventCallouts( ataEventCode event, ataUnitID unit);
virtual IOReturn handleDeviceInterrupt( void );
virtual IOReturn startTimer( UInt32 inMS);
virtual void stopTimer( void );
virtual void handleTimeout( void );
virtual bool checkTimeout( void );
virtual IOReturn handleExecIO( void );
virtual IOReturn handleRegAccess( void );
virtual IOReturn handleBusReset(void);
virtual IOReturn handleQueueFlush( void );
virtual IOReturn asyncData(void);
virtual IOReturn asyncStatus(void);
virtual IOReturn asyncIO(void);
virtual IOReturn asyncCommand(void);
virtual IOReturn synchronousIO(void);
virtual IOReturn selectDevice( ataUnitID unit );
virtual IOReturn issueCommand( void );
virtual IOReturn writePacket( void );
virtual IOReturn softResetBus( bool doATAPI = false );
virtual IOReturn startDMA( void );
virtual IOReturn stopDMA( void );
virtual bool ATAPISlaveExists( void );
virtual UInt32 scanForDrives( void );
virtual bool waitForU8Status (UInt8 mask, UInt8 value);
virtual IOByteCount readATAPIByteCount( void );
virtual void handleOverrun( IOByteCount length);
virtual IOReturn registerAccess(bool isWrite);
virtual IOReturn txDataIn (IOLogicalAddress buf, IOByteCount length);
virtual IOReturn txDataOut (IOLogicalAddress buf, IOByteCount length);
virtual IOATAController::transState determineATAPIState(void);
virtual void selectIOTiming( ataUnitID unit );
virtual bool configureTFPointers(void);
virtual UInt16 bitSigToNumeric( UInt16 binary);
UInt16 readExtRegister( IOATARegPtr8 inRegister );
void writeExtRegister( IOATARegPtr8 inRegister, UInt16 inValue );
virtual void free();
private:
static void executeCommandAction(OSObject * owner,
void * arg0,
void * arg1,
void * arg2,
void * arg3);
static void timeoutOccured( OSObject *owner,
IOTimerEventSource *sender);
protected:
typedef struct ExpansionData
{
IOBufferMemoryDescriptor* _doubleBufferDesc;
} ExpansionData;
ExpansionData *reserved;
private:
OSMetaClassDeclareReservedUnused(IOATAController, 0);
OSMetaClassDeclareReservedUnused(IOATAController, 1);
OSMetaClassDeclareReservedUnused(IOATAController, 2);
OSMetaClassDeclareReservedUnused(IOATAController, 3);
OSMetaClassDeclareReservedUnused(IOATAController, 4);
OSMetaClassDeclareReservedUnused(IOATAController, 5);
OSMetaClassDeclareReservedUnused(IOATAController, 6);
OSMetaClassDeclareReservedUnused(IOATAController, 7);
OSMetaClassDeclareReservedUnused(IOATAController, 8);
OSMetaClassDeclareReservedUnused(IOATAController, 9);
OSMetaClassDeclareReservedUnused(IOATAController, 10);
OSMetaClassDeclareReservedUnused(IOATAController, 11);
OSMetaClassDeclareReservedUnused(IOATAController, 12);
OSMetaClassDeclareReservedUnused(IOATAController, 13);
OSMetaClassDeclareReservedUnused(IOATAController, 14);
OSMetaClassDeclareReservedUnused(IOATAController, 15);
OSMetaClassDeclareReservedUnused(IOATAController, 16);
OSMetaClassDeclareReservedUnused(IOATAController, 17);
OSMetaClassDeclareReservedUnused(IOATAController, 18);
OSMetaClassDeclareReservedUnused(IOATAController, 19);
OSMetaClassDeclareReservedUnused(IOATAController, 20);
};
#endif