/* File: ATA.h Contains: ATA (PC/AT Attachment) Interfaces Version: Technology: System 7.5 Release: QuickTime 6.0.2 Copyright: (c) 1995-2001 by Apple Computer, Inc., all rights reserved Bugs?: For bug reports, consult the following page on the World Wide Web: http://developer.apple.com/bugreporter/ */ #ifndef __ATA__ #define __ATA__ #ifndef __MACTYPES__ #include #endif #ifndef __MIXEDMODE__ #include #endif #if PRAGMA_ONCE #pragma once #endif #ifdef __cplusplus extern "C" { #endif #if PRAGMA_IMPORT #pragma import on #endif #if PRAGMA_STRUCT_ALIGN #pragma options align=mac68k #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(push, 2) #elif PRAGMA_STRUCT_PACK #pragma pack(2) #endif /* This is the structure used for the AT Interface core routines below */ enum { kATATrap = 0xAAF1, /* Manager trap number */ kATAPBVers1 = 0x01, /* parameter block version number 1*/ kATAPBVers2 = 0x02, /* parameter block version number for structures*/ kATAPBVers3 = 0x03, /* parameter block version for ATA times*/ kATADefaultBlockSize = 512 /* default block size*/ }; /* Used to determine the presence of traps*/ enum { kFSMTrap = 0xAC, mDQEChanged = 1 /* DQE has changed */ }; /* Task file definition ooo Error Register ooo*/ enum { bATABadBlock = 7, /* bit number of bad block error bit*/ bATAUncorrectable = 6, /* bit number of uncorrectable error bit*/ bATAMediaChanged = 5, /* bit number of media changed indicator*/ bATAIDNotFound = 4, /* bit number of ID not found error bit*/ bATAMediaChangeReq = 3, /* bit number of media changed request*/ bATACommandAborted = 2, /* bit number of command abort bit*/ bATATrack0NotFound = 1, /* bit number of track not found*/ bATAAddressNotFound = 0, /* bit number of address mark not found*/ mATABadBlock = 1 << bATABadBlock, /* Bad Block Detected*/ mATAUncorrectable = 1 << bATAUncorrectable, /* Uncorrectable Data Error*/ mATAMediaChanged = 1 << bATAMediaChanged, /* Media Changed Indicator (for removable)*/ mATAIDNotFound = 1 << bATAIDNotFound, /* ID Not Found*/ mATAMediaChangeReq = 1 << bATAMediaChangeReq, /* Media Change Requested (NOT IMPLEMENTED)*/ mATACommandAborted = 1 << bATACommandAborted, /* Aborted Command*/ mATATrack0NotFound = 1 << bATATrack0NotFound, /* Track 0 Not Found*/ mATAAddressNotFound = 1 << bATAAddressNotFound /* Address Mark Not Found*/ }; /* Task file definition ooo Features register ooo*/ enum { bATAPIuseDMA = 0, /* bit number of useDMA bit (ATAPI)*/ mATAPIuseDMA = 1 << bATAPIuseDMA }; /* Task file definition ooo ataTFSDH Register ooo*/ enum { mATAHeadNumber = 0x0F, /* Head Number (bits 0-3) */ mATASectorSize = 0xA0, /* bit 7=1; bit 5 = 01 (512 sector size) */ mATADriveSelect = 0x10, /* Drive (0 = master, 1 = slave) */ mATALBASelect = 0x40 /* LBA mode bit (0 = chs, 1 = LBA)*/ }; /* Task file definition ooo Status Register ooo*/ enum { bATABusy = 7, /* bit number of BSY bit*/ bATADriveReady = 6, /* bit number of drive ready bit*/ bATAWriteFault = 5, /* bit number of write fault bit*/ bATASeekComplete = 4, /* bit number of seek complete bit*/ bATADataRequest = 3, /* bit number of data request bit*/ bATADataCorrected = 2, /* bit number of data corrected bit*/ bATAIndex = 1, /* bit number of index mark*/ bATAError = 0, /* bit number of error bit*/ mATABusy = 1 << bATABusy, /* Unit is busy*/ mATADriveReady = 1 << bATADriveReady, /* Unit is ready*/ mATAWriteFault = 1 << bATAWriteFault, /* Unit has a write fault condition*/ mATASeekComplete = 1 << bATASeekComplete, /* Unit seek complete*/ mATADataRequest = 1 << bATADataRequest, /* Unit data request*/ mATADataCorrected = 1 << bATADataCorrected, /* Data corrected*/ mATAIndex = 1 << bATAIndex, /* Index mark - NOT USED*/ mATAError = 1 << bATAError /* Error condition - see error register*/ }; /* Task file definition ooo Device Control Register ooo*/ enum { bATADCROne = 3, /* bit number of always one bit*/ bATADCRReset = 2, /* bit number of reset bit*/ bATADCRnIntEnable = 1, /* bit number of interrupt disable*/ mATADCROne = 1 << bATADCROne, /* always one bit*/ mATADCRReset = 1 << bATADCRReset, /* Reset (1 = reset)*/ mATADCRnIntEnable = 1 << bATADCRnIntEnable /* Interrupt Disable(0 = enabled)*/ }; /* ATA Command Opcode definition*/ enum { kATAcmdWORetry = 0x01, /* Without I/O retry option*/ kATAcmdNOP = 0x0000, /* NOP operation - media detect*/ kATAcmdRecal = 0x0010, /* Recalibrate command */ kATAcmdRead = 0x0020, /* Read command */ kATAcmdReadLong = 0x0022, /* Read Long command*/ kATAcmdWrite = 0x0030, /* Write command */ kATAcmdWriteLong = 0x0032, /* Write Long*/ kATAcmdWriteVerify = 0x003C, /* Write verify*/ kATAcmdReadVerify = 0x0040, /* Read Verify command */ kATAcmdFormatTrack = 0x0050, /* Format Track command */ kATAcmdSeek = 0x0070, /* Seek command */ kATAcmdDiagnostic = 0x0090, /* Drive Diagnostic command */ kATAcmdInitDrive = 0x0091, /* Init drive parameters command */ kATAcmdReadMultiple = 0x00C4, /* Read multiple*/ kATAcmdWriteMultiple = 0x00C5, /* Write multiple*/ kATAcmdSetRWMultiple = 0x00C6, /* Set Multiple for Read/Write Multiple*/ kATAcmdReadDMA = 0x00C8, /* Read DMA (with retries)*/ kATAcmdWriteDMA = 0x00CA, /* Write DMA (with retries)*/ kATAcmdMCAcknowledge = 0x00DB, /* Acknowledge media change - removable*/ kATAcmdDoorLock = 0x00DE, /* Door lock*/ kATAcmdDoorUnlock = 0x00DF, /* Door unlock*/ kATAcmdStandbyImmed = 0x00E0, /* Standby Immediate*/ kATAcmdIdleImmed = 0x00E1, /* Idle Immediate*/ kATAcmdStandby = 0x00E2, /* Standby*/ kATAcmdIdle = 0x00E3, /* Idle*/ kATAcmdReadBuffer = 0x00E4, /* Read sector buffer command */ kATAcmdCheckPowerMode = 0x00E5, /* Check power mode command <04/04/94>*/ kATAcmdSleep = 0x00E6, /* Sleep*/ kATAcmdWriteBuffer = 0x00E8, /* Write sector buffer command */ kATAcmdWriteSame = 0x00E9, /* Write same data to multiple sectors*/ kATAcmdDriveIdentify = 0x00EC, /* Identify Drive command */ kATAcmdMediaEject = 0x00ED, /* Media Eject*/ kATAcmdSetFeatures = 0x00EF /* Set Features*/ }; /* Set feature command opcodes*/ enum { kATAEnableWriteCache = 0x02, /* Enable write cache*/ kATASetTransferMode = 0x03, /* Set transfer mode*/ kATASetPIOMode = 0x08, /* PIO Flow Control Tx Mode bit*/ kATAEnableECC = 0x88, /* ECC enable*/ kATAEnableRetry = 0x99, /* Retry enable*/ kATAEnableReadAhead = 0xAA /* Read look-ahead enable*/ }; /* -------------------------------------------------------------------------------- enums for dealing with device IDs */ enum { kATABusIDMask = 0x000000FF, kATADeviceIDMask = 0x0000FF00, kATADeviceIDClippingMask = 0x0000FFFF, kMinBusID = 0x00000000, kMaxBusID = 0x000000FE }; enum { kATAStartIterateDeviceID = 0xFFFF, kATAEndIterateDeviceID = 0xFF }; /*--------------------------------------------------------------------------------*/ /* Device Register Images (8 bytes) */ struct ataTaskFile { UInt8 ataTFFeatures; /* <-> Error(R) or ataTFFeatures(W) register image */ UInt8 ataTFCount; /* <-> Sector count/remaining */ UInt8 ataTFSector; /* <-> Sector start/finish */ UInt8 ataTFReserved; /* reserved */ UInt16 ataTFCylinder; /* <-> ataTFCylinder (Big endian) */ UInt8 ataTFSDH; /* <-> ataTFSDH register image*/ UInt8 ataTFCommand; /* <-> Status(R) or Command(W) register image */ }; typedef struct ataTaskFile ataTaskFile; /* ATA Manager Function Code Definition*/ enum { kATAMgrNOP = 0x00, /* No Operation*/ kATAMgrExecIO = 0x01, /* Execute ATA I/O*/ kATAMgrBusInquiry = 0x03, /* Bus Inquiry*/ kATAMgrQRelease = 0x04, /* I/O Queue Release*/ kATAMgrAbort = 0x10, /* Abort command*/ kATAMgrBusReset = 0x11, /* Reset ATA bus*/ kATAMgrRegAccess = 0x12, /* Register Access*/ kATAMgrDriveIdentify = 0x13, /* Drive Identify */ kATAMgrDriverLoad = 0x82, /* Load driver from either Media, ROM, etc.*/ kATAMgrDriveRegister = 0x85, /* Register a driver <4/18/94>*/ kATAMgrFindDriverRefnum = 0x86, /* lookup a driver refnum <4/18/94>*/ kATAMgrRemoveDriverRefnum = 0x87, /* De-register a driver <4/18/94>*/ kATAMgrModifyEventMask = 0x88, /* Modify driver event mask*/ kATAMgrDriveEject = 0x89, /* Eject the drive <8/1/94>*/ kATAMgrGetDrvConfiguration = 0x8A, /* Get device configuration <8/6/94>*/ kATAMgrSetDrvConfiguration = 0x8B, /* Set device configuration <8/6/94>*/ kATAMgrGetLocationIcon = 0x8C, /* Get card location icon */ kATAMgrManagerInquiry = 0x90, /* Manager Inquiry*/ kATAMgrManagerInit = 0x91, /* Manager initialization*/ kATAMgrManagerShutdown = 0x92, /* Manager ShutDown*/ /* note: functions 0x93 to 0x97 are reserved*/ kATAMgrFindSpecialDriverRefnum = 0x98, /* lookup a driver refnum; driverloader,notify-all or ROM driver.*/ kATAMgrNextAvailable = 0x99 }; /* used in the ataDrvrFlags field for kATAMgrDriveRegister,kATAMgrRemoveDriverRefnum & kATAMgrFindSpecialDriverRefnum*/ enum { kATANotifyAllDriver = 0, /* Notify-All driver*/ kATADriverLoader = 1, /* Driver loader driver */ kATAROMDriver = 2 /* ROM driver*/ }; /* 'ATAFlags' field of the PB header definition*/ enum { bATAFlagUseConfigSpeed = 15, /* bit number of use default speed flag*/ bATAFlagByteSwap = 14, /* bit number of byte swap flag*/ bATAFlagIORead = 13, /* bit number of I/O read flag*/ bATAFlagIOWrite = 12, /* bit number of I/O write flag*/ bATAFlagImmediate = 11, /* bit number of immediate flag*/ bATAFlagQLock = 10, /* bit number of que lock on error*/ bATAFlagReserved1 = 9, /* reserved*/ bATAFlagUseScatterGather = 8, /* bit numbers of scatter gather*/ bATAFlagUseDMA = 7, /* bit number of use DMA flag*/ bATAFlagProtocolATAPI = 5, /* bit number of ATAPI protocol*/ bATAFlagReserved2 = 4, /* reserved*/ bATAFlagTFRead = 3, /* bit number of register update*/ bATAFlagLEDEnable = 0, /* bit number of LED enable*/ mATAFlagUseConfigSpeed = 1 << bATAFlagUseConfigSpeed, mATAFlagByteSwap = 1 << bATAFlagByteSwap, /* Swap data bytes (read - after; write - before)*/ mATAFlagIORead = 1 << bATAFlagIORead, /* Read (in) operation*/ mATAFlagIOWrite = 1 << bATAFlagIOWrite, /* Write (out) operation*/ mATAFlagImmediate = 1 << bATAFlagImmediate, /* Head of Que; Immediate operation*/ mATAFlagQLock = 1 << bATAFlagQLock, /* Manager queue lock on error (freeze the queue)*/ mATAFlagUseScatterGather = 1 << bATAFlagUseScatterGather, /* Scatter gather enable*/ mATAFlagUseDMA = 1 << bATAFlagUseDMA, mATAFlagProtocolATAPI = 1 << bATAFlagProtocolATAPI, /* ATAPI protocol indicator*/ mATAFlagTFRead = 1 << bATAFlagTFRead, /* update reg block request upon detection of an error*/ mATAFlagLEDEnable = 1 << bATAFlagLEDEnable /* socket LED enable*/ }; /* These are legacy ATAFlags definitions, which will go away in the future*/ enum { bATAFlagScatterGather1 = bATAFlagReserved1, /* 9*/ bATAFlagScatterGather0 = bATAFlagUseScatterGather, /* 8*/ bATAFlagProtocol1 = bATAFlagProtocolATAPI, /* 5*/ bATAFlagProtocol0 = bATAFlagReserved2, /* 4*/ mATAFlagScatterGather1 = 1 << bATAFlagScatterGather1, mATAFlagScatterGather0 = mATAFlagUseScatterGather, mATAFlagScatterGathers = mATAFlagScatterGather1 + mATAFlagScatterGather0, mATAFlagProtocol1 = mATAFlagProtocolATAPI, mATAFlagProtocol0 = 1 << bATAFlagProtocol0, mATAFlagProtocols = mATAFlagProtocol1 + mATAFlagProtocol0 }; typedef CALLBACK_API( void , ATACallbackProcPtr )(void *ataPB); typedef STACK_UPP_TYPE(ATACallbackProcPtr) ATACallbackUPP; #if OPAQUE_UPP_TYPES #if CALL_NOT_IN_CARBON EXTERN_API(ATACallbackUPP) NewATACallbackUPP (ATACallbackProcPtr userRoutine); EXTERN_API(void) DisposeATACallbackUPP (ATACallbackUPP userUPP); EXTERN_API(void) InvokeATACallbackUPP (void * ataPB, ATACallbackUPP userUPP); #endif /* CALL_NOT_IN_CARBON */ #else enum { uppATACallbackProcInfo = 0x000000C0 }; /* pascal no_return_value Func(4_bytes) */ #define NewATACallbackUPP(userRoutine) (ATACallbackUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppATACallbackProcInfo, GetCurrentArchitecture()) #define DisposeATACallbackUPP(userUPP) DisposeRoutineDescriptor(userUPP) #define InvokeATACallbackUPP(ataPB, userUPP) CALL_ONE_PARAMETER_UPP((userUPP), uppATACallbackProcInfo, (ataPB)) #endif /* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */ #define NewATACallbackProc(userRoutine) NewATACallbackUPP(userRoutine) #define CallATACallbackProc(userRoutine, ataPB) InvokeATACallbackUPP(ataPB, userRoutine) /* structure which defines the ATA bus/device ID, part of the Device 0/1 Software Guide see p 19 : Although ataPBDeviceID remains defined as a 32-bit number, drivers and applications can typecast it to the ataDeviceID structure to determine the bus number and device number for a specific ATA or ATAPI device */ struct ataDeviceID { UInt16 Reserved; /* The upperword is reserved (0)*/ UInt8 devNum; /* device number (0 or 1)*/ UInt8 busNum; /* bus number*/ }; typedef struct ataDeviceID ataDeviceID; struct ataPBHeader { /* Start of cloned common header ataPBHdr */ struct ataPBHeader * ataPBLink; /* a pointer to the next entry in the queue */ UInt16 ataPBQType; /* type byte for safety check*/ UInt8 ataPBVers; /* -->: parameter block version number*/ UInt8 ataPBReserved; /* Reserved */ Ptr ataPBReserved2; /* Reserved */ ATACallbackUPP ataPBCallbackPtr; /* -->: Completion Routine Pointer*/ OSErr ataPBResult; /* <--: Returned result */ UInt8 ataPBFunctionCode; /* -->: Manager Function Code */ UInt8 ataPBIOSpeed; /* -->: I/O Timing Class */ UInt16 ataPBFlags; /* -->: Various control options */ SInt16 ataPBReserved3; /* Reserved */ UInt32 ataPBDeviceID; /* -->: Device identifier (see ataDeviceID) */ UInt32 ataPBTimeOut; /* -->: Transaction timeout value in msec */ Ptr ataPBClientPtr1; /* Client's storage Ptr 1 */ Ptr ataPBClientPtr2; /* Client's storage Ptr 2 */ UInt16 ataPBState; /* Reserved for Manager; Initialize to 0 */ UInt16 ataPBSemaphores; /* Used internally by the manager*/ SInt32 ataPBReserved4; /* Reserved */ /* End of cloned common header ataPBHdr*/ }; typedef struct ataPBHeader ataPBHeader; /* data request entry structure (16 bytes)*/ struct IOBlock { UInt8 * ataPBBuffer; /* -->: Data buffer pointer*/ UInt32 ataPBByteCount; /* -->: Data transfer length in bytes*/ }; typedef struct IOBlock IOBlock; /* For ATAPI devices the ExtendedPB field is a pointer to the Command Packet record which exists of an array of words structured as follows... <06/15/94> */ struct ATAPICmdPacket { SInt16 atapiPacketSize; /* Size of command packet in bytes <06/15/94>*/ SInt16 atapiCommandByte[8]; /* The command packet itself <06/15/94>*/ }; typedef struct ATAPICmdPacket ATAPICmdPacket; /* Manager parameter block structure (96 bytes)*/ struct ataIOPB { /* Start of cloned common header ataPBHdr*/ ataPBHeader * ataPBLink; /* a pointer to the next entry in the queue */ UInt16 ataPBQType; /* type byte for safety check*/ UInt8 ataPBVers; /* -->: parameter block version number; Must be 0x01*/ UInt8 ataPBReserved; /* Reserved */ Ptr ataPBReserved2; /* Reserved */ ATACallbackUPP ataPBCallbackPtr; /* -->: Completion Routine Pointer*/ OSErr ataPBResult; /* <--: Returned result */ UInt8 ataPBFunctionCode; /* -->: Manager Function Code */ UInt8 ataPBIOSpeed; /* -->: I/O Timing Class */ UInt16 ataPBFlags; /* -->: Various control options */ SInt16 ataPBReserved3; /* Reserved */ UInt32 ataPBDeviceID; /* -->: Device identifier (see ataDeviceID) */ UInt32 ataPBTimeOut; /* -->: Transaction timeout value in msec */ Ptr ataPBClientPtr1; /* Client's storage Ptr 1 */ Ptr ataPBClientPtr2; /* Client's storage Ptr 2 */ UInt16 ataPBState; /* Reserved for Manager; Initialize to 0 */ UInt16 ataPBSemaphores; /* Used internally by the manager*/ SInt32 ataPBReserved4; /* Reserved */ /* End of cloned common header ataPBHdr*/ SInt8 ataPBStatusRegister; /* <--: Last ATA status image*/ SInt8 ataPBErrorRegister; /* <--: Last ATA error image-valid if lsb of Status set*/ SInt16 ataPBReserved5; /* Reserved*/ UInt32 ataPBLogicalBlockSize; /* -->: Blind transfer size per interrupt (Logical block size)*/ UInt8 * ataPBBuffer; /* -->: Data buffer pointer*/ UInt32 ataPBByteCount; /* -->: Data transfer length in bytes*/ UInt32 ataPBActualTxCount; /* <--: Actual transfer count*/ UInt32 ataPBReserved6; /* Reserved*/ ataTaskFile ataPBTaskFile; /* <->: Device register images*/ ATAPICmdPacket * ataPBPacketPtr; /* -->: ATAPI packet command block pointer (valid with ATAPI bit set)*/ SInt16 ataPBReserved7[6]; /* Reserved for future expansion*/ }; typedef struct ataIOPB ataIOPB; /* Parameter block structure for bus and Manager inquiry command*/ /* Manager parameter block structure*/ struct ataBusInquiry { /* Start of cloned common header ataPBHdr*/ ataPBHeader * ataPBLink; /* a pointer to the next entry in the queue */ UInt16 ataPBQType; /* type byte for safety check*/ UInt8 ataPBVers; /* -->: parameter block version number; Must be 0x01*/ UInt8 ataPBReserved; /* Reserved */ Ptr ataPBReserved2; /* Reserved */ ATACallbackUPP ataPBCallbackPtr; /* -->: Completion Routine Pointer*/ OSErr ataPBResult; /* <--: Returned result */ UInt8 ataPBFunctionCode; /* -->: Manager Function Code */ UInt8 ataPBIOSpeed; /* -->: I/O Timing Class */ UInt16 ataPBFlags; /* -->: Various control options */ SInt16 ataPBReserved3; /* Reserved */ UInt32 ataPBDeviceID; /* -->: Device identifier (see ataDeviceID) */ UInt32 ataPBTimeOut; /* -->: Transaction timeout value in msec */ Ptr ataPBClientPtr1; /* Client's storage Ptr 1 */ Ptr ataPBClientPtr2; /* Client's storage Ptr 2 */ UInt16 ataPBState; /* Reserved for Manager; Initialize to 0 */ UInt16 ataPBSemaphores; /* Used internally by the manager*/ SInt32 ataPBReserved4; /* Reserved */ /* End of cloned common header ataPBHdr*/ UInt16 ataEngineCount; /* <--: TBD; zero for now*/ UInt16 ataReserved1; /* Reserved*/ UInt32 ataDataTypes; /* <--: TBD; zero for now*/ UInt16 ataIOpbSize; /* <--: Size of ATA IO PB*/ UInt16 ataMaxIOpbSize; /* <--: TBD; zero for now*/ UInt32 ataFeatureFlags; /* <--: TBD*/ UInt8 ataVersionNum; /* <--: Version number for the HBA*/ UInt8 ataHBAInquiry; /* <--: TBD; zero for now*/ UInt16 ataReserved2; /* Reserved*/ UInt32 ataHBAPrivPtr; /* <--: Ptr to HBA private data area*/ UInt32 ataHBAPrivSize; /* <--: Size of HBA private data area*/ UInt32 ataAsyncFlags; /* <--: Event capability for callback*/ UInt8 ataPIOModes; /* <--: PIO modes supported (bit-significant)*/ UInt8 ataUltraDMAModes; /* <--: Ultra DMA modes supported (b-sig)*/ UInt8 ataSingleDMAModes; /* <--: Single Word DMA modes supported (b-sig) */ UInt8 ataMultiDMAModes; /* <--: Multiword DMA modes supported (b-sig)*/ UInt32 ataReserved4[4]; /* Reserved*/ SInt8 ataReserved5[16]; /* TBD*/ SInt8 ataHBAVendor[16]; /* <--: Vendor ID of the HBA*/ SInt8 ataContrlFamily[16]; /* <--: Family of ATA Controller*/ SInt8 ataContrlType[16]; /* <--: Model number of controller*/ SInt8 ataXPTversion[4]; /* <--: version number of XPT*/ SInt8 ataReserved6[4]; /* Reserved*/ NumVersion ataHBAversion; /* <--: version number of HBA*/ UInt8 ataHBAslotType; /* <--: type of slot*/ UInt8 ataHBAslotNum; /* <--: slot number of the HBA*/ UInt16 ataReserved7; /* Reserved*/ UInt32 ataReserved8; /* Reserved*/ }; typedef struct ataBusInquiry ataBusInquiry; /* Manager parameter block structure*/ struct ataMgrInquiry { /* Start of cloned common header ataPBHdr*/ ataPBHeader * ataPBLink; /* a pointer to the next entry in the queue */ UInt16 ataPBQType; /* type byte for safety check*/ UInt8 ataPBVers; /* -->: parameter block version number; Must be 0x01*/ UInt8 ataPBReserved; /* Reserved */ Ptr ataPBReserved2; /* Reserved */ ATACallbackUPP ataPBCallbackPtr; /* -->: Completion Routine Pointer*/ OSErr ataPBResult; /* <--: Returned result */ UInt8 ataPBFunctionCode; /* -->: Manager Function Code */ UInt8 ataPBIOSpeed; /* -->: I/O Timing Class */ UInt16 ataPBFlags; /* -->: Various control options */ SInt16 ataPBReserved3; /* Reserved */ UInt32 ataPBDeviceID; /* -->: Device identifier (see ataDeviceID) */ UInt32 ataPBTimeOut; /* -->: Transaction timeout value in msec */ Ptr ataPBClientPtr1; /* Client's storage Ptr 1 */ Ptr ataPBClientPtr2; /* Client's storage Ptr 2 */ UInt16 ataPBState; /* Reserved for Manager; Initialize to 0 */ UInt16 ataPBSemaphores; /* Used internally by the manager*/ SInt32 ataPBReserved4; /* Reserved */ /* End of cloned common header ataPBHdr*/ NumVersion ataMgrVersion; /* Manager Version information*/ UInt8 ataMgrPBVers; /* <--: Manager PB version number supported*/ UInt8 Reserved1; /* Reserved*/ UInt16 ataBusCnt; /* <--: Number of ATA buses in the system*/ UInt16 ataDevCnt; /* <--: Total number of ATA devices detected*/ UInt8 ataPioModes; /* <--: Maximum Programmed I/O speed mode supported*/ UInt8 Reserved2; /* Reserved*/ UInt16 ataIOClkResolution; /* <--: IO Clock resolution in nsec (Not supported)*/ UInt8 ataSingleDMAModes; /* <--: Single Word DMA modes supported */ UInt8 ataMultiDMAModes; /* <--: Multiword DMA modes supported*/ SInt16 Reserved[16]; /* Reserved for future expansion*/ }; typedef struct ataMgrInquiry ataMgrInquiry; /* Parameter block structure for Abort command*/ /* Manager parameter block structure*/ struct ataAbort { /* Start of cloned common header ataPBHdr*/ ataPBHeader * ataPBLink; /* a pointer to the next entry in the queue */ UInt16 ataPBQType; /* type byte for safety check*/ UInt8 ataPBVers; /* -->: parameter block version number; Must be 0x01*/ UInt8 ataPBReserved; /* Reserved */ Ptr ataPBReserved2; /* Reserved */ ATACallbackUPP ataPBCallbackPtr; /* -->: Completion Routine Pointer*/ OSErr ataPBResult; /* <--: Returned result */ UInt8 ataPBFunctionCode; /* -->: Manager Function Code */ UInt8 ataPBIOSpeed; /* -->: I/O Timing Class */ UInt16 ataPBFlags; /* -->: Various control options */ SInt16 ataPBReserved3; /* Reserved */ UInt32 ataPBDeviceID; /* -->: Device identifier (see ataDeviceID) */ UInt32 ataPBTimeOut; /* -->: Transaction timeout value in msec */ Ptr ataPBClientPtr1; /* Client's storage Ptr 1 */ Ptr ataPBClientPtr2; /* Client's storage Ptr 2 */ UInt16 ataPBState; /* Reserved for Manager; Initialize to 0 */ UInt16 ataPBSemaphores; /* Used internally by the manager*/ SInt32 ataPBReserved4; /* Reserved */ /* End of cloned common header ataPBHdr*/ ataIOPB * ataAbortPB; /* -->: Parameter block to be aborted*/ SInt16 Reserved[22]; /* Reserved for future expansion*/ }; typedef struct ataAbort ataAbort; /* Manager parameter block structure*/ struct ATAEventRec { UInt16 ataEventCode; /* --> ATA event code*/ UInt16 ataPhysicalID; /* --> Physical drive reference*/ SInt32 ataDrvrContext; /* Context pointer saved by driver*/ UInt32 ataMarker; /* Always 'LOAD'*/ UInt32 ataEventRecVersion; /* Version number of this data structure*/ UInt32 ataDeviceType; /* Device type on bus (valid for load driver only)*/ UInt16 ataRefNum; /* RefNum of driver (valid for remove driver only)*/ }; typedef struct ATAEventRec ATAEventRec; typedef ATAEventRec * ATAEventRecPtr; typedef CALLBACK_API( SInt16 , ATAClientProcPtr )(ATAEventRecPtr ataERPtr); typedef STACK_UPP_TYPE(ATAClientProcPtr) ATAClientUPP; #if OPAQUE_UPP_TYPES #if CALL_NOT_IN_CARBON EXTERN_API(ATAClientUPP) NewATAClientUPP (ATAClientProcPtr userRoutine); EXTERN_API(void) DisposeATAClientUPP (ATAClientUPP userUPP); EXTERN_API(SInt16) InvokeATAClientUPP (ATAEventRecPtr ataERPtr, ATAClientUPP userUPP); #endif /* CALL_NOT_IN_CARBON */ #else enum { uppATAClientProcInfo = 0x000000E0 }; /* pascal 2_bytes Func(4_bytes) */ #define NewATAClientUPP(userRoutine) (ATAClientUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppATAClientProcInfo, GetCurrentArchitecture()) #define DisposeATAClientUPP(userUPP) DisposeRoutineDescriptor(userUPP) #define InvokeATAClientUPP(ataERPtr, userUPP) (SInt16)CALL_ONE_PARAMETER_UPP((userUPP), uppATAClientProcInfo, (ataERPtr)) #endif /* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */ #define NewATAClientProc(userRoutine) NewATAClientUPP(userRoutine) #define CallATAClientProc(userRoutine, ataERPtr) InvokeATAClientUPP(ataERPtr, userRoutine) /* Parameter block structure for Driver Register command*/ /* Manager parameter block structure*/ struct ataDrvrRegister { /* Start of cloned common header ataPBHdr*/ ataPBHeader * ataPBLink; /* a pointer to the next entry in the queue */ UInt16 ataPBQType; /* type byte for safety check*/ UInt8 ataPBVers; /* -->: parameter block version number; Must be 0x01*/ UInt8 ataPBReserved; /* Reserved */ Ptr ataPBReserved2; /* Reserved */ ATACallbackUPP ataPBCallbackPtr; /* -->: Completion Routine Pointer*/ OSErr ataPBResult; /* <--: Returned result */ UInt8 ataPBFunctionCode; /* -->: Manager Function Code */ UInt8 ataPBIOSpeed; /* -->: I/O Timing Class */ UInt16 ataPBFlags; /* -->: Various control options */ SInt16 ataPBReserved3; /* Reserved */ UInt32 ataPBDeviceID; /* -->: Device identifier (see ataDeviceID) */ UInt32 ataPBTimeOut; /* -->: Transaction timeout value in msec */ Ptr ataPBClientPtr1; /* Client's storage Ptr 1 */ Ptr ataPBClientPtr2; /* Client's storage Ptr 2 */ UInt16 ataPBState; /* Reserved for Manager; Initialize to 0 */ UInt16 ataPBSemaphores; /* Used internally by the manager*/ SInt32 ataPBReserved4; /* Reserved */ /* End of cloned common header ataPBHdr*/ SInt16 ataDrvrRefNum; /* <->: Driver reference number*/ UInt16 ataDrvrFlags; /* -->: 1 = loader driver if ataPBDeviceID = -1 {PB2}*/ UInt16 ataDeviceNextID; /* <--: used to specified the next drive ID*/ SInt16 ataDrvrLoadPriv; /* Driver loader private storage*/ ATAClientUPP ataEventHandler; /* <->: Pointer to ATA event callback routine {PB2}*/ SInt32 ataDrvrContext; /* <->: Context data saved by driver {PB2}*/ SInt32 ataEventMask; /* <->: Set to 1 for notification of event {PB2}*/ SInt16 Reserved[14]; /* Reserved for future expansion - from [21] {PB2}*/ }; typedef struct ataDrvrRegister ataDrvrRegister; /* Parameter block structure for Modify driver event mask command*/ struct ataModifyEventMask { /* Start of cloned common header ataPBHdr*/ ataPBHeader * ataPBLink; /* a pointer to the next entry in the queue */ UInt16 ataPBQType; /* type byte for safety check*/ UInt8 ataPBVers; /* -->: parameter block version number; Must be 0x01*/ UInt8 ataPBReserved; /* Reserved */ Ptr ataPBReserved2; /* Reserved */ ATACallbackUPP ataPBCallbackPtr; /* -->: Completion Routine Pointer*/ OSErr ataPBResult; /* <--: Returned result */ UInt8 ataPBFunctionCode; /* -->: Manager Function Code */ UInt8 ataPBIOSpeed; /* -->: I/O Timing Class */ UInt16 ataPBFlags; /* -->: Various control options */ SInt16 ataPBReserved3; /* Reserved */ UInt32 ataPBDeviceID; /* -->: Device identifier (see ataDeviceID) */ UInt32 ataPBTimeOut; /* -->: Transaction timeout value in msec */ Ptr ataPBClientPtr1; /* Client's storage Ptr 1 */ Ptr ataPBClientPtr2; /* Client's storage Ptr 2 */ UInt16 ataPBState; /* Reserved for Manager; Initialize to 0 */ UInt16 ataPBSemaphores; /* Used internally by the manager*/ SInt32 ataPBReserved4; /* Reserved */ /* End of cloned common header ataPBHdr*/ SInt32 ataModifiedEventMask; /* -->: new event mask value*/ SInt16 Reserved[22]; /* Reserved for future expansion*/ }; typedef struct ataModifyEventMask ataModifyEventMask; /* 'ataRegMask' field of the ataRegAccess definition*/ enum { bATAAltSDevCValid = 14, /* bit number of alternate status/device cntrl valid bit*/ bATAStatusCmdValid = 7, /* bit number of status/command valid bit*/ bATASDHValid = 6, /* bit number of ataTFSDH valid bit*/ bATACylinderHiValid = 5, /* bit number of cylinder high valid bit*/ bATACylinderLoValid = 4, /* bit number of cylinder low valid bit*/ bATASectorNumValid = 3, /* bit number of sector number valid bit*/ bATASectorCntValid = 2, /* bit number of sector count valid bit*/ bATAErrFeaturesValid = 1, /* bit number of error/features valid bit*/ bATADataValid = 0, /* bit number of data valid bit*/ mATAAltSDevCValid = 1 << bATAAltSDevCValid, /* alternate status/device control valid*/ mATAStatusCmdValid = 1 << bATAStatusCmdValid, /* status/command valid*/ mATASDHValid = 1 << bATASDHValid, /* ataTFSDH valid*/ mATACylinderHiValid = 1 << bATACylinderHiValid, /* cylinder high valid*/ mATACylinderLoValid = 1 << bATACylinderLoValid, /* cylinder low valid*/ mATASectorNumValid = 1 << bATASectorNumValid, /* sector number valid*/ mATASectorCntValid = 1 << bATASectorCntValid, /* sector count valid*/ mATAErrFeaturesValid = 1 << bATAErrFeaturesValid, /* error/features valid*/ mATADataValid = 1 << bATADataValid /* data valid*/ }; /* Parameter block structure for device register access command*/ union ataRegValueUnion { UInt8 ataByteRegValue; /* <->: Byte register value read or to be written*/ UInt16 ataWordRegValue; /* <->: Word register value read or to be written*/ }; typedef union ataRegValueUnion ataRegValueUnion; /* Manager parameter block structure*/ struct ataRegAccess { /* Start of cloned common header ataPBHdr*/ ataPBHeader * ataPBLink; /* a pointer to the next entry in the queue */ UInt16 ataPBQType; /* type byte for safety check*/ UInt8 ataPBVers; /* -->: parameter block version number; Must be 0x01*/ UInt8 ataPBReserved; /* Reserved */ Ptr ataPBReserved2; /* Reserved */ ATACallbackUPP ataPBCallbackPtr; /* -->: Completion Routine Pointer*/ OSErr ataPBResult; /* <--: Returned result */ UInt8 ataPBFunctionCode; /* -->: Manager Function Code */ UInt8 ataPBIOSpeed; /* -->: I/O Timing Class */ UInt16 ataPBFlags; /* -->: Various control options */ SInt16 ataPBReserved3; /* Reserved */ UInt32 ataPBDeviceID; /* -->: Device identifier (see ataDeviceID) */ UInt32 ataPBTimeOut; /* -->: Transaction timeout value in msec */ Ptr ataPBClientPtr1; /* Client's storage Ptr 1 */ Ptr ataPBClientPtr2; /* Client's storage Ptr 2 */ UInt16 ataPBState; /* Reserved for Manager; Initialize to 0 */ UInt16 ataPBSemaphores; /* Used internally by the manager*/ SInt32 ataPBReserved4; /* Reserved */ /* End of cloned common header ataPBHdr*/ UInt16 ataRegSelect; /* -->: Device Register Selector*/ /* DataReg 0 */ /* ErrorReg(R) or FeaturesReg(W) 1*/ /* SecCntReg 2*/ /* SecNumReg 3*/ /* CylLoReg 4*/ /* CylHiReg 5*/ /* SDHReg 6*/ /* StatusReg(R) or CmdReg(W) 7*/ /* AltStatus(R) or DevCntr(W) 0E*/ ataRegValueUnion ataRegValue; /* Following fields are valid only if ataRegSelect = 0xFFFF*/ UInt16 ataRegMask; /* -->: mask for register(s) to update*/ /* bit 0 : data register valid*/ /* bit 1 : error/feaures register valid*/ /* bit 2 : sector count register valid*/ /* bit 3 : sector number register valid*/ /* bit 4 : cylinder low register valid*/ /* bit 5 : cylinder high register valid*/ /* bit 6 : ataTFSDH register valid*/ /* bit 7 : status/command register valid*/ /* bits 8 - 13 : reserved (set to 0)*/ /* bit 14: alternate status / device control reg valid*/ /* bit 15: reserved (set to 0)*/ ataTaskFile ataRegisterImage; /* <->: register images*/ UInt8 ataAltSDevCReg; /* <->: Alternate status(R) or Device Control(W) register image*/ UInt8 Reserved3; /* Reserved*/ SInt16 Reserved[16]; /* Reserved for future expansion*/ }; typedef struct ataRegAccess ataRegAccess; /* Manager parameter block structure */ struct ataIdentify { /* Start of cloned common header ataPBHdr*/ ataPBHeader * ataPBLink; /* a pointer to the next entry in the queue */ UInt16 ataPBQType; /* type byte for safety check*/ UInt8 ataPBVers; /* -->: parameter block version number; Must be 0x01*/ UInt8 ataPBReserved; /* Reserved */ Ptr ataPBReserved2; /* Reserved */ ATACallbackUPP ataPBCallbackPtr; /* -->: Completion Routine Pointer*/ OSErr ataPBResult; /* <--: Returned result */ UInt8 ataPBFunctionCode; /* -->: Manager Function Code */ UInt8 ataPBIOSpeed; /* -->: I/O Timing Class */ UInt16 ataPBFlags; /* -->: Various control options */ SInt16 ataPBReserved3; /* Reserved */ UInt32 ataPBDeviceID; /* -->: Device identifier (see ataDeviceID) */ UInt32 ataPBTimeOut; /* -->: Transaction timeout value in msec */ Ptr ataPBClientPtr1; /* Client's storage Ptr 1 */ Ptr ataPBClientPtr2; /* Client's storage Ptr 2 */ UInt16 ataPBState; /* Reserved for Manager; Initialize to 0 */ UInt16 ataPBSemaphores; /* Used internally by the manager*/ SInt32 ataPBReserved4; /* Reserved */ /* End of cloned common header ataPBHdr*/ UInt16 Reserved1[4]; /* Reserved. These are used internally by the Manager*/ UInt8 * ataPBBuffer; /* Buffer for the identify data (512 bytes)*/ UInt16 Reserved2[12]; /* Used internally by the ATA Manager*/ SInt16 Reserved3[6]; /* Reserved for future expansion*/ }; typedef struct ataIdentify ataIdentify; /* 'ataConfigSetting' field of the Get/Set Device Configuration definition <8/6/94>*/ enum { ATAPIpacketDRQ_bit = 6, /* bit number of ATAPI command packet DRQ option*/ ATAPIpacketDRQ = 1 << ATAPIpacketDRQ_bit /* ATAPI command packet DRQ option*/ }; /* atapcValid field definition*/ enum { bATApcAccessMode = 0, bATApcVcc = 1, bATApcVpp1 = 2, bATApcVpp2 = 3, bATApcStatus = 4, bATApcPin = 5, bATApcCopy = 6, bATApcConfigIndex = 7, bATApcLockUnlock = 15, mATApcAccessMode = 1 << bATApcAccessMode, mATApcVcc = 1 << bATApcVcc, mATApcVpp1 = 1 << bATApcVpp1, mATApcVpp2 = 1 << bATApcVpp2, mATApcStatus = 1 << bATApcStatus, mATApcPin = 1 << bATApcPin, mATApcCopy = 1 << bATApcCopy, mATApcConfigIndex = 1 << bATApcConfigIndex, mATApcLockUnlock = 1 << bATApcLockUnlock }; /* Device physical type & socket type indicator definition*/ enum { kATADeviceUnknown = 0x00, /* no device or type undetermined*/ kATADeviceATA = 0x01, /* traditional ATA protocol device <7/29/94>*/ kATADeviceATAPI = 0x02, /* ATAPI protocol device <7/29/94>*/ kATADeviceReserved = 0x03 /* reserved by Apple (was PCMCIA)*/ }; enum { kATASocketInternal = 0x01, /* Internal ATA socket*/ kATASocketMB = 0x02, /* Media Bay socket*/ kATASocketPCMCIA = 0x03 /* PCMCIA socket*/ }; /* reserved words at the end of the devConfig structure*/ enum { kATAConfigReserved = 5 /* number of reserved words at the end*/ }; /* Get/Set Device Configuration parameter block structure <8/6/94> Manager parameter block structure */ struct ataDevConfiguration { /* Start of cloned common header ataPBHdr*/ ataPBHeader * ataPBLink; /* a pointer to the next entry in the queue */ UInt16 ataPBQType; /* type byte for safety check*/ UInt8 ataPBVers; /* -->: parameter block version number; Must be 0x01*/ UInt8 ataPBReserved; /* Reserved */ Ptr ataPBReserved2; /* Reserved */ ATACallbackUPP ataPBCallbackPtr; /* -->: Completion Routine Pointer*/ OSErr ataPBResult; /* <--: Returned result */ UInt8 ataPBFunctionCode; /* -->: Manager Function Code */ UInt8 ataPBIOSpeed; /* -->: I/O Timing Class */ UInt16 ataPBFlags; /* -->: Various control options */ SInt16 ataPBReserved3; /* Reserved */ UInt32 ataPBDeviceID; /* -->: Device identifier (see ataDeviceID) */ UInt32 ataPBTimeOut; /* -->: Transaction timeout value in msec */ Ptr ataPBClientPtr1; /* Client's storage Ptr 1 */ Ptr ataPBClientPtr2; /* Client's storage Ptr 2 */ UInt16 ataPBState; /* Reserved for Manager; Initialize to 0 */ UInt16 ataPBSemaphores; /* Used internally by the manager*/ SInt32 ataPBReserved4; /* Reserved */ /* End of cloned common header ataPBHdr*/ SInt32 ataConfigSetting; /* <->: Configuration setting*/ /* Bits 3 - 0: Reserved*/ /* Bit 4: Reserved (allowLBAAccess)*/ /* Bit 5: Reserved (allowRWMultiple)*/ /* Bit 6: ATAPIpacketDRQ*/ /* 1 = Check for Interrupt DRQ on ATAPI command packet DRQ*/ /* 0 = Default: Check only for the assertion of command packet DRQ*/ /* Bits 31 - 7: Reserved*/ UInt8 ataPIOSpeedMode; /* <->: Device access speed in PIO Mode*/ UInt8 Reserved3; /* Reserved to force word alignment*/ UInt16 atapcValid; /* <->: Set when pcXXX fields are valid (atapcAccessMode - atapcConfigIndex)*/ /* bit 0 - atapcAccessMode field valid, when set*/ /* bit 1 - atapcVcc field valid, when set*/ /* bit 2 - atapcVpp1 field valid, when set*/ /* bit 3 - atapcVpp2 field valid, when set*/ /* bit 4 - atapcStatus field valid, when set*/ /* bit 5 - atapcPin field valid, when set*/ /* bit 6 - atapcCopy field valid, when set*/ /* bit 7 - atapcConfigIndex field valid, when set*/ /* bits 14-8 - Reserved*/ /* bit 15 - device lock/unlock request (write only)*/ UInt16 ataRWMultipleCount; /* Reserved for future (not supported yet)*/ UInt16 ataSectorsPerCylinder; /* Reserved for future (not supported yet)*/ UInt16 ataHeads; /* Reserved for future (not supported yet)*/ UInt16 ataSectorsPerTrack; /* Reserved for future (not supported yet)*/ UInt16 ataSocketNumber; /* <--: Socket number used by the CardServices*/ /* 0xFF = socket number invalid (Not a CardServices device)*/ /* other = socket number of the device*/ UInt8 ataSocketType; /* <--: Specifies the socket type (get config only)*/ /* 00 = Unknown socket*/ /* 01 = Internal ATA bus*/ /* 02 = Media Bay*/ /* 03 = PCMCIA*/ UInt8 ataDeviceType; /* <--: Specifies the device type (get config only)*/ /* 00 = Unknown device*/ /* 01 = standard ATA device (HD)*/ /* 02 = ATAPI device*/ /* 03 = PCMCIA ATA device*/ UInt8 atapcAccessMode; /* <->: Access mode: Memory vs. I/O (PCMCIA only)*/ UInt8 atapcVcc; /* <->: Voltage in tenths of a volt (PCMCIA only)*/ UInt8 atapcVpp1; /* <->: Voltage in tenths of a volt (PCMCIA only)*/ UInt8 atapcVpp2; /* <->: Voltage in tenths of a volt (PCMCIA only)*/ UInt8 atapcStatus; /* <->: Card Status register setting (PCMCIA only)*/ UInt8 atapcPin; /* <->: Card Pin register setting (PCMCIA only)*/ UInt8 atapcCopy; /* <->: Card Socket/Copy register setting (PCMCIA only)*/ UInt8 atapcConfigIndex; /* <->: Card Option register setting (PCMCIA only)*/ UInt8 ataSingleDMASpeed; /* <->: Single Word DMA Timing Class*/ UInt8 ataMultiDMASpeed; /* <->: Multiple Word DMA Timing Class*/ UInt16 ataPIOCycleTime; /* <->:Cycle time for PIO mode*/ UInt16 ataMultiCycleTime; /* <->:Cycle time for Multiword DMA mode*/ UInt8 ataUltraDMASpeed; /* <-> Ultra DMA timing class*/ UInt8 reserved2; /* reserved*/ UInt16 ataUltraCycleTime; /* <-> Cycle time for Ultra DMA mode*/ UInt16 Reserved1[5]; /* Reserved for future*/ }; typedef struct ataDevConfiguration ataDevConfiguration; /* Get Card Location Icon/Text */ enum { kATALargeIconHFS = 0x0001, /* Large B&W icon with mask (HFS)*/ kATALargeIconProDOS = 0x0081 /* Large B&W icon with mask (ProDOS)*/ }; /* Manager parameter block structure*/ struct ataLocationData { /* Start of cloned common header ataPBHdr*/ ataPBHeader * ataPBLink; /* a pointer to the next entry in the queue */ UInt16 ataPBQType; /* type byte for safety check*/ UInt8 ataPBVers; /* -->: parameter block version number; Must be 0x01*/ UInt8 ataPBReserved; /* Reserved */ Ptr ataPBReserved2; /* Reserved */ ATACallbackUPP ataPBCallbackPtr; /* -->: Completion Routine Pointer*/ OSErr ataPBResult; /* <--: Returned result */ UInt8 ataPBFunctionCode; /* -->: Manager Function Code */ UInt8 ataPBIOSpeed; /* -->: I/O Timing Class */ UInt16 ataPBFlags; /* -->: Various control options */ SInt16 ataPBReserved3; /* Reserved */ UInt32 ataPBDeviceID; /* -->: Device identifier (see ataDeviceID) */ UInt32 ataPBTimeOut; /* -->: Transaction timeout value in msec */ Ptr ataPBClientPtr1; /* Client's storage Ptr 1 */ Ptr ataPBClientPtr2; /* Client's storage Ptr 2 */ UInt16 ataPBState; /* Reserved for Manager; Initialize to 0 */ UInt16 ataPBSemaphores; /* Used internally by the manager*/ SInt32 ataPBReserved4; /* Reserved */ /* End of cloned common header ataPBHdr*/ SInt16 ataIconType; /* -->: icon type specifier*/ /* 1 = Large B&W icon with mask (256 bytes)*/ /* 0x81 = Same as 1, but ProDOS icon*/ SInt16 ataIconReserved; /* Reserved to be longword aligned*/ SInt8 * ataLocationIconPtr; /* -->: Icon Data buffer pointer*/ SInt8 * ataLocationStringPtr; /* -->: Icon String buffer pointer*/ UInt16 Reserved1[18]; /* Reserved for future*/ }; typedef struct ataLocationData ataLocationData; /* ataOSType available*/ enum { kATAddTypeMacOS = 0x0001 /* Blue Mac O/S ddType value*/ }; /* The parameter block definition for all other ATA Manager functions.*/ struct ataGeneric { /* Start of cloned common header ataPBHdr*/ ataPBHeader * ataPBLink; /* a pointer to the next entry in the queue */ UInt16 ataPBQType; /* type byte for safety check*/ UInt8 ataPBVers; /* -->: parameter block version number; Must be 0x01*/ UInt8 ataPBReserved; /* Reserved */ Ptr ataPBReserved2; /* Reserved */ ATACallbackUPP ataPBCallbackPtr; /* -->: Completion Routine Pointer*/ OSErr ataPBResult; /* <--: Returned result */ UInt8 ataPBFunctionCode; /* -->: Manager Function Code */ UInt8 ataPBIOSpeed; /* -->: I/O Timing Class */ UInt16 ataPBFlags; /* -->: Various control options */ SInt16 ataPBReserved3; /* Reserved */ UInt32 ataPBDeviceID; /* -->: Device identifier (see ataDeviceID) */ UInt32 ataPBTimeOut; /* -->: Transaction timeout value in msec */ Ptr ataPBClientPtr1; /* Client's storage Ptr 1 */ Ptr ataPBClientPtr2; /* Client's storage Ptr 2 */ UInt16 ataPBState; /* Reserved for Manager; Initialize to 0 */ UInt16 ataPBSemaphores; /* Used internally by the manager*/ SInt32 ataPBReserved4; /* Reserved */ /* End of cloned common header ataPBHdr*/ UInt16 Reserved[24]; /* Reserved for future*/ }; typedef struct ataGeneric ataGeneric; union ataPB { ataIOPB ataIOParamBlock; /* parameter block for I/O*/ ataBusInquiry ataBIParamBlock; /* parameter block for bus inquiry*/ ataMgrInquiry ataMIParamBlock; /* parameter block for Manager inquiry*/ ataAbort ataAbortParamBlock; /* parameter block for abort*/ ataDrvrRegister ataDRParamBlock; /* parameter block for driver register*/ ataModifyEventMask ataMEParamBlock; /* parameter block for event mask modify*/ ataRegAccess ataRAParamBlock; /* parameter block for register access*/ ataIdentify ataDIParamBlock; /* parameter block for drive identify*/ ataDevConfiguration ataDCParamBlock; /* parameter block for device configuration*/ ataLocationData ataLDParamBlock; /* parameter block for location icon data*/ /*ataManagerInit ataInitParamBlock; // parameter block for Manager initialization*/ /*ataManagerShutDn ataSDParamBlock; // parameter block for Manager shutdown*/ /*ataDrvrLoad ataDLParamBlock; // parameter block for Driver loading*/ ataGeneric ataGenericParamBlock; /* parameter block for all other functions*/ }; typedef union ataPB ataPB; /* The ATA Event codes...*/ enum { kATANullEvent = 0x00, /* Just kidding -- nothing happened*/ kATAOnlineEvent = 0x01, /* An ATA device has come online*/ kATAOfflineEvent = 0x02, /* An ATA device has gone offline*/ kATARemovedEvent = 0x03, /* An ATA device has been removed from the bus*/ kATAResetEvent = 0x04, /* Someone gave a hard reset to the drive*/ kATAOfflineRequest = 0x05, /* Someone requesting to offline the drive*/ kATAEjectRequest = 0x06, /* Someone requesting to eject the drive*/ kATAUpdateEvent = 0x07, /* Potential configuration change reported by CardServices */ kATATaskTimeRequest = 0x08, /* The manager is requesting to be called at Task Time*/ kATALoadDriverNow = 0x09, /* Load the driver for the given bus immediately*/ kATAPIResetEvent = 0x0A, /* Someone gave a ATAPI reset to the drive*/ /* The following describes bit definitions in the eventMask field of ataDrvrRegister*/ bATANullEvent = 1 << kATANullEvent, /* null event bit*/ bATAOnlineEvent = 1 << kATAOnlineEvent, /* online event bit*/ bATAOfflineEvent = 1 << kATAOfflineEvent, /* offline event bit*/ bATARemovedEvent = 1 << kATARemovedEvent, /* removed event bit*/ bATAResetEvent = 1 << kATAResetEvent, /* ATA reset event bit*/ bATAOfflineRequest = 1 << kATAOfflineRequest, /* offline request event bit*/ bATAEjectRequest = 1 << kATAEjectRequest, /* eject request event bit*/ bATAUpdateEvent = 1 << kATAUpdateEvent, /* configuration update event bit*/ bATAPIResetEvent = 1 << kATAPIResetEvent /* ATAPI reset event bit*/ }; enum { kATAEventMarker = FOUR_CHAR_CODE('LOAD'), /* Marker for the event data structure*/ kATAEventVersion1 = 0x00000001 /* Version 1 of the event structure*/ }; typedef CALLBACK_API( OSErr , ATADispatchProcPtr )(ataPB *pb); typedef STACK_UPP_TYPE(ATADispatchProcPtr) ATADispatchUPP; #if OPAQUE_UPP_TYPES #if CALL_NOT_IN_CARBON EXTERN_API(ATADispatchUPP) NewATADispatchUPP (ATADispatchProcPtr userRoutine); EXTERN_API(void) DisposeATADispatchUPP (ATADispatchUPP userUPP); EXTERN_API(OSErr) InvokeATADispatchUPP (ataPB * pb, ATADispatchUPP userUPP); #endif /* CALL_NOT_IN_CARBON */ #else enum { uppATADispatchProcInfo = 0x000000E0 }; /* pascal 2_bytes Func(4_bytes) */ #define NewATADispatchUPP(userRoutine) (ATADispatchUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppATADispatchProcInfo, GetCurrentArchitecture()) #define DisposeATADispatchUPP(userUPP) DisposeRoutineDescriptor(userUPP) #define InvokeATADispatchUPP(pb, userUPP) (OSErr)CALL_ONE_PARAMETER_UPP((userUPP), uppATADispatchProcInfo, (pb)) #endif /* support for pre-Carbon UPP routines: NewXXXProc and CallXXXProc */ #define NewATADispatchProc(userRoutine) NewATADispatchUPP(userRoutine) #define CallATADispatchProc(userRoutine, pb) InvokeATADispatchUPP(pb, userRoutine) #if CALL_NOT_IN_CARBON EXTERN_API( SInt16 ) ataManager (ataPB * pb) ONEWORDINLINE(0xAAF1); /* Device Error codes: 0xDB42 - 0xDB5F */ #endif /* CALL_NOT_IN_CARBON */ enum { ATABaseErrCode = -9406, /* Base error code - 0xDB42 */ ioPending = 1, /* Asynch I/O in progress status*/ AT_NRdyErr = ATABaseErrCode + 0x01, /* 0xDB43: Drive not Ready */ AT_IDNFErr = ATABaseErrCode + 0x02, /* 0xDB44: ID not found */ AT_DMarkErr = ATABaseErrCode + 0x03, /* 0xDB45: Data mark not found */ AT_BadBlkErr = ATABaseErrCode + 0x04, /* 0xDB46: Bad Block */ AT_CorDataErr = ATABaseErrCode + 0x05, /* 0xDB47: Data was corrected */ AT_UncDataErr = ATABaseErrCode + 0x06, /* 0xDB48: Data was not corrected */ AT_SeekErr = ATABaseErrCode + 0x07, /* 0xDB49: Seek error */ AT_WrFltErr = ATABaseErrCode + 0x08, /* 0xDB4A: Write fault */ AT_RecalErr = ATABaseErrCode + 0x09, /* 0xDB4B: Recalibrate failed */ AT_AbortErr = ATABaseErrCode + 0x0A, /* 0xDB4C: Command aborted by drive */ AT_MCErr = ATABaseErrCode + 0x0C, /* 0xDB4E: Media Changed error*/ ATAPICheckErr = ATABaseErrCode + 0x0D, /* 0xDB4F: ATAPI Check condition <06/15/94>*/ AT_UltraDMAiCRCErr = ATABaseErrCode + 0x0E, /* 0xDB50: CRC error during Ultra DMA xfer */ /* System error codes...Custom Driver Error Codes 0xDB60 - 0xDB6F*/ DRVRCantAllocate = ATABaseErrCode + 0x1E, /* 0xDB60: Allocation error during initialization*/ NoATAMgr = ATABaseErrCode + 0x1F, /* 0xDB61: MgrInquiry failed => No ATA Manager*/ ATAInitFail = ATABaseErrCode + 0x20, /* 0xDB62: Mgr Initialization failed*/ ATABufFail = ATABaseErrCode + 0x21, /* 0xDB63: Device buffer test failure*/ ATADevUnsupported = ATABaseErrCode + 0x22, /* 0xDB64: Device type not supported*/ ATAEjectDrvErr = ATABaseErrCode + 0x23, /* 0xDB65: Could not eject the drive*/ /* Manager Error Codes 0xDB70 - 0xDB8F*/ ATAMgrNotInitialized = ATABaseErrCode + 0x2E, /* 0xDB70: Mgr has not been initialized*/ ATAPBInvalid = ATABaseErrCode + 0x2F, /* 0xDB71: The bus base address couldn't be found*/ ATAFuncNotSupported = ATABaseErrCode + 0x30, /* 0xDB72: An unknown function code specified*/ ATABusy = ATABaseErrCode + 0x31, /* 0xDB73: Selected device is busy*/ ATATransTimeOut = ATABaseErrCode + 0x32, /* 0xDB74: Transaction timeout detected*/ ATAReqInProg = ATABaseErrCode + 0x33, /* 0xDB75: Channel busy; channel is processing another cmd*/ ATAUnknownState = ATABaseErrCode + 0x34, /* 0xDB76: Device status register reflects an unknown state*/ ATAQLocked = ATABaseErrCode + 0x35, /* 0xDB77: I/O Queue is locked due to previous I/O error.*/ ATAReqAborted = ATABaseErrCode + 0x36, /* 0xDB78: The I/O queue entry was aborted due to an abort req.*/ /* or due to Manager shutdown.*/ ATAUnableToAbort = ATABaseErrCode + 0x37, /* 0xDB79: The I/O queue entry could not be aborted.*/ ATAAbortedDueToRst = ATABaseErrCode + 0x38, /* 0xDB7A: Request aborted due to a device reset command.*/ ATAPIPhaseErr = ATABaseErrCode + 0x39, /* 0xDB7B: Unexpected phase - oooIS THIS VALID ERROR??? <06/15/94>*/ ATAPITxCntErr = ATABaseErrCode + 0x3A, /* 0xDB7C: Overrun/Underrun condition detected*/ ATANoClientErr = ATABaseErrCode + 0x3B, /* 0xDB7D: No client present to handle the event*/ ATAInternalErr = ATABaseErrCode + 0x3C, /* 0xDB7E: MagnumOpus returned an error*/ ATABusErr = ATABaseErrCode + 0x3D, /* 0xDB7F: Bus error detected on I/O */ AT_NoAddrErr = ATABaseErrCode + 0x3E, /* 0xDB80: Invalid AT base adress */ DriverLocked = ATABaseErrCode + 0x3F, /* 0xDB81: Current driver must be removed before adding another*/ CantHandleEvent = ATABaseErrCode + 0x40, /* 0xDB82: Particular event couldn't be handled (call others)*/ ATAMgrMemoryErr = ATABaseErrCode + 0x41, /* 0xDB83: Manager memory allocation error */ ATASDFailErr = ATABaseErrCode + 0x42, /* 0xDB84: Shutdown failure */ ATAXferParamErr = ATABaseErrCode + 0x43, /* 0xDB85: I/O xfer parameters inconsistent */ ATAXferModeErr = ATABaseErrCode + 0x44, /* 0xDB86: I/O xfer mode not supported */ ATAMgrConsistencyErr = ATABaseErrCode + 0x45, /* 0XDB87: Manager detected internal inconsistency. */ ATADmaXferErr = ATABaseErrCode + 0x46, /* 0XDB88: fatal error in DMA side of transfer */ /* Driver loader error Codes 0xDB90 - 0xDBA5*/ ATAInvalidDrvNum = ATABaseErrCode + 0x4E, /* 0xDB90: Invalid drive number from event*/ ATAMemoryErr = ATABaseErrCode + 0x4F, /* 0xDB91: Memory allocation error*/ ATANoDDMErr = ATABaseErrCode + 0x50, /* 0xDB92: No DDM found on media */ ATANoDriverErr = ATABaseErrCode + 0x51 /* 0xDB93: No driver found on the media */ }; /* ------------------------ Version 1 definition ------------------------------- */ enum { v1ATABaseErrCode = 0x0700, /* This needs a home somewhere*/ v1AT_NRdyErr = 0x01 - v1ATABaseErrCode, /* 0xF901: -0x1DBE */ v1AT_IDNFErr = 0x04 - v1ATABaseErrCode, /* 0xF904: -0x1DC0 */ v1AT_DMarkErr = 0x05 - v1ATABaseErrCode, /* 0xF905: -0x1DC0 */ v1AT_BadBlkErr = 0x06 - v1ATABaseErrCode, /* 0xF906: -0x1DC0 */ v1AT_CorDataErr = 0x07 - v1ATABaseErrCode, /* 0xF907: -0x1DC0 */ v1AT_UncDataErr = 0x08 - v1ATABaseErrCode, /* 0xF908: -0x1DC0 */ v1AT_SeekErr = 0x09 - v1ATABaseErrCode, /* 0xF909: -0x1DC0 */ v1AT_WrFltErr = 0x0A - v1ATABaseErrCode, /* 0xF90A: -0x1DC0 */ v1AT_RecalErr = 0x0B - v1ATABaseErrCode, /* 0xF90B: -0x1DC0 */ v1AT_AbortErr = 0x0C - v1ATABaseErrCode, /* 0xF90C: -0x1DC0 */ v1AT_NoAddrErr = 0x0D - v1ATABaseErrCode, /* 0xF90D: -0x1D8D */ v1AT_MCErr = 0x0E - v1ATABaseErrCode, /* 0xF90E: -0x1DC0*/ /* System error codes...Custom Driver Error Codes*/ v1DRVRCantAllocate = -(v1ATABaseErrCode + 1), /* 0xF8FF: -0x1D9F*/ v1NoATAMgr = -(v1ATABaseErrCode + 2), /* 0xF8FE: -0x1D9D*/ v1ATAInitFail = -(v1ATABaseErrCode + 3), /* 0xF8FD: -0x1D9B*/ v1ATABufFail = -(v1ATABaseErrCode + 4), /* 0xF8FC: -0x1D99*/ v1ATADevUnsupported = -(v1ATABaseErrCode + 5), /* 0xF8FB: -0x1c97*/ /* Manager Error Codes*/ v1ATAMgrNotInitialized = -(v1ATABaseErrCode + 10), /* 0xF8F6: -0x1D86*/ v1ATAPBInvalid = -(v1ATABaseErrCode + 11), /* 0xF8F5: -0x1D84*/ v1ATAFuncNotSupported = -(v1ATABaseErrCode + 12), /* 0xF8F4: -0x1D82*/ v1ATABusy = -(v1ATABaseErrCode + 13), /* 0xF8F3: -0x1D80*/ v1ATATransTimeOut = -(v1ATABaseErrCode + 14), /* 0xF8F2: -0x1D7E*/ v1ATAReqInProg = -(v1ATABaseErrCode + 15), /* 0xF8F1: -0x1D7C*/ v1ATAUnknownState = -(v1ATABaseErrCode + 16), /* 0xF8F0: -0x1D7A*/ v1ATAQLocked = -(v1ATABaseErrCode + 17), /* 0xF8EF: -0x1D78*/ v1ATAReqAborted = -(v1ATABaseErrCode + 18), /* 0xF8EE: -0x1D76*/ v1ATAUnableToAbort = -(v1ATABaseErrCode + 19), /* 0xF8ED: -0x1D74*/ v1ATAAbortedDueToRst = -(v1ATABaseErrCode + 20) /* 0xF8EC: -0x1D72*/ }; #if PRAGMA_STRUCT_ALIGN #pragma options align=reset #elif PRAGMA_STRUCT_PACKPUSH #pragma pack(pop) #elif PRAGMA_STRUCT_PACK #pragma pack() #endif #ifdef PRAGMA_IMPORT_OFF #pragma import off #elif PRAGMA_IMPORT #pragma import reset #endif #ifdef __cplusplus } #endif #endif /* __ATA__ */