#ifndef _DRV_AAPL_KAUAI_ATA_H
#define _DRV_AAPL_KAUAI_ATA_H
#include <IOKit/IOTypes.h>
#include <IOKit/ata/IOATATypes.h>
#include <IOKit/ata/IOATABusInfo.h>
#include <IOKit/ata/MacIOATA.h>
#include <IOKit/ppc/IODBDMA.h>
#include <IOKit/IOMemoryCursor.h>
#include <IOKit/IOBufferMemoryDescriptor.h>
#include <IOKit/IOPolledInterface.h>
#define __KAUAI_POLLED__
#define kPolledPropertyKey "has-safe-sleep"
class KauaiPolledAdapter;
class AppleKauaiATA : public MacIOATA
{
OSDeclareDefaultStructors(AppleKauaiATA)
public:
virtual bool init(OSDictionary* properties);
virtual IOService* probe( IOService* provider, SInt32* score );
virtual bool start( IOService* provider );
virtual IOWorkLoop* getWorkLoop() const;
virtual IOReturn selectConfig( IOATADevConfig* configRequest, UInt32 unitNumber);
virtual IOReturn getConfig( IOATADevConfig* configRequest, UInt32 unitNumber);
virtual IOReturn provideBusInfo( IOATABusInfo* infoOut);
protected:
struct ATABusTimings
{
UInt32 pioMWRegValue; UInt32 ultraRegValue; UInt8 ataPIOSpeedMode; UInt16 ataPIOCycleTime; UInt8 ataMultiDMASpeed; UInt16 ataMultiCycleTime; UInt16 ataUltraDMASpeedMode; };
volatile UInt32* _kauaiATAFCR; volatile UInt32* _ultraTimingControl; volatile UInt32* _autoPollingControl; volatile UInt32* _interruptPendingReg;
IOBufferMemoryDescriptor* dmaBuffer;
IOMemoryDescriptor* clientBuffer;
bool bufferRX;
bool rxFeatureOn;
bool ultra133;
ATABusTimings busTimings[2];
bool _needsResync;
IOService *myProvider;
virtual IOReturn selectIOTimerValue( IOATADevConfig* configRequest, UInt32 unitNumber);
virtual void selectIOTiming( ataUnitID unit );
virtual bool configureTFPointers(void);
virtual IOReturn handleDeviceInterrupt(void);
virtual IOReturn synchronousIO(void);
virtual IOReturn selectDevice( ataUnitID unit );
virtual void free();
virtual IOReturn handleBusReset(void);
virtual IOATAController::transState AppleKauaiATA::determineATAPIState(void);
virtual void processDMAInterrupt (void);
virtual bool allocDMAChannel(void);
virtual IOReturn handleExecIO( void );
virtual void completeIO( IOReturn commandResult );
virtual void activateDMAEngine(void);
virtual IOReturn createChannelCommands(void);
virtual void handleTimeout( void );
#ifdef __KAUAI_POLLED__
protected:
virtual IOReturn startTimer( UInt32 inMS);
virtual void stopTimer( void );
KauaiPolledAdapter* polledAdapter;
bool polledMode;
public:
void pollEntry( void );
void transitionFixup( void );
#endif
};
#ifdef __KAUAI_POLLED__
class KauaiPolledAdapter : public IOPolledInterface
{
OSDeclareDefaultStructors(KauaiPolledAdapter)
public:
virtual IOReturn probe(IOService * target);
virtual IOReturn open( IOOptionBits state, IOMemoryDescriptor * buffer);
virtual IOReturn close(IOOptionBits state);
virtual IOReturn startIO(uint32_t operation,
uint32_t bufferOffset,
uint64_t deviceOffset,
uint64_t length,
IOPolledCompletion completion) ;
virtual IOReturn checkForWork(void);
bool isPolling( void );
void setOwner( AppleKauaiATA* owner );
protected:
AppleKauaiATA* owner;
bool pollingActive;
};
#endif
#endif // _DRV_AAPL_KAUAI_ATA_H