#ifndef _DRV_CMD646_ATA_H
#define _DRV_CMD646_ATA_H
#include <IOKit/IOTypes.h>
#include <IOKit/pci/IOPCIDevice.h>
#include <IOKit/ata/IOATATypes.h>
#include <IOKit/ata/IOATABusInfo.h>
#include <IOKit/ata/IOPCIATA.h>
#include <IOKit/ppc/IODBDMA.h>
#include <IOKit/IOMemoryCursor.h>
#include <IOKit/IOFilterInterruptEventSource.h>
class CMD646ATA : public IOPCIATA
{
OSDeclareDefaultStructors(CMD646ATA)
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:
enum
{
kUltraDev0Mask = 0x31,
kUltraDev1Mask = 0xC2
};
enum{
kPCIStatusCmd = 0x04,
kPrimaryCmd = 0x10,
kPrimaryCntrl = 0x14,
kSecondCmd = 0x18,
kSecondCtrl = 0x1C,
kBusMaster = 0x20,
kCRNTL = 0x51,
kCMDTIM = 0x52,
kARTTIM0 = 0x53,
kDRWTIM0 = 0x54,
kARTTIM1 = 0x55,
kDRWTIM1 = 0x56,
kARTTIM23 = 0x57,
kDRWTIM2 = 0x58,
kDRWTIM3 = 0x5B,
kUDIDETCR0 = 0x73,
kUDIDETCR1 = 0x7B
};
struct ATABusTimings
{
UInt8 pioAddrSetupValue;
UInt8 pioActiveRecoveryValue;
UInt8 dmaAddrSetupValue;
UInt8 dmaActiveRecoveryValue;
UInt8 ultraTimingValue;
UInt8 ataPIOSpeedMode; UInt16 ataPIOCycleTime; UInt8 ataMultiDMASpeed; UInt16 ataMultiCycleTime; UInt16 ataUltraDMASpeedMode; };
ATABusTimings busTimings[2];
IOMemoryMap* ioBaseAddrMap[3];
IOFilterInterruptEventSource* _devIntSrc;
IOService* _cmdRoot;
IOPCIDevice* _pciNub;
volatile UInt8* _mrdModeReg; volatile UInt8* _udideTCR0; UInt8 currentActiveRecoveryValue[2];
virtual IOReturn selectIOTimerValue( IOATADevConfig* configRequest, UInt32 unitNumber);
virtual void selectIOTiming( ataUnitID unit );
virtual bool configureTFPointers(void);
virtual bool createDeviceInterrupt(void);
static void sDeviceInterruptOccurred(OSObject*, IOInterruptEventSource *, int count);
static bool sFilterInterrupt(OSObject *, IOFilterInterruptEventSource *);
virtual IOReturn handleDeviceInterrupt(void);
bool interruptIsValid( IOFilterInterruptEventSource* source);
virtual void handleTimeout( void );
virtual void free();
};
#endif // _DRV_CMD646_ATA_H