/* File: XPTpriv.h Contains: private header stuff for XPT Written by: Paul Wolf Copyright: © 1992-1994 by Apple Computer, Inc., all rights reserved. Change History (most recent first): 1/31/94 DCB Added a second version number for the SCSI Busy patch 1/25/94 DCB Added a version number for the SCSI Busy patch. 1/9/94 pdw Added busyPatchVers field. 1/5/94 pdw Changed SCSIGlobals constant to actually mean something. Added SCSIBusy stuff. Added a bunch of fields at end of SCSIGlobalsRec. 12/19/93 DCB Added a couple of function prototypes 11/22/93 pdw Rolling in from . 11/11/93 pdw Got rid of inDebugger field from XPT globals structure since it wasn't the one being used. 11/9/93 pdw Added include of XPT.h. 11/5/93 pdw Series of attempts and re-attempts to fix various VM/FileShare problems. 9/29/93 chp Include some prerequisite headers if necessary. 10/29/93 DCB roll-in. 10/28/93 pdw Got rid of unused variable and changed InitRecorder prototype. 10/14/93 pdw roll-in. 10/12/93 pdw Added support for Synchronous data transfers, rewrote State Machine, message handling etc. 9/26/93 pdw Added some debugging bits for BootItt. 9/9/93 pdw Lots of little changes. Name changes, temporary cache_bug stuff. 7/17/93 pdw Pulled jvSelected out of here and put in HALglobals where it belongs. 7/8/93 pdw Added InitRecorder prototype. 5/29/93 PW Moving Include_Debugger_Names to SCSIDebug.h. 5/25/93 DCB Adding definition of IfDebugStr so we can turn Debugger Traps off. Also added 5/20/93 DCB Adding two fields to the XPT globals to support turning off deferred completion routines from inside debuggers. 5/20/93 PW Adding jump vector for target mode. 5/5/93 PW Converted names to meanies-friendly names. Updated with latest from Ludwig stuff. 4/14/93 DCB Added a copy of the C0C^ SCSIGlobals from the old SCSI Manager. We are stealing these since we replace the old SCSI Manager. 3/26/93 PW Added deferred task record for deferring completion routines. 1/31/93 PW Update from the latest of Ludwig. Also changes required for PDM (will update Ludwig with these as needed myself). 1/30/93 PW Added glue code for calling completion routines (saving registers that were getting trashed by File Manager). 1/27/93 PW Changed bogus to syncUnsafeCount. 12/5/92 PW Added nextInterleave field. 11/20/92 PW Removed Includes and unused fields in BusInfo. Changed MaxBuses to 16. Removed hiBusNum and rearranged XPTgs. 10/30/92 DCB Changes to reflect new ACAM.h <1> 10/8/92 PW first checked in */ #ifndef __XPTPRIV__ #define __XPTPRIV__ #ifndef __OSUTILS__ #include #endif #ifndef __SCSISTANDARD__ #include #endif #ifndef __XPT__ #include "XPT.h" #endif /******** BusInfo ********/ struct BusInfo { SIMinitInfo initInfo; }; typedef struct BusInfo BusInfo; /****** XPT Globals *********/ #define kMaxBuses 16 // should handle most everyone's needs #define kNumBusInfos 3 typedef struct { DeviceIdent DevID; /* The device ID associated with a particular DRefNum */ short DRefNum; /* The driver associated with this device ID */ short unused; /* Keep everything long aligned */ } RefInfo; typedef struct { ulong DrvrCnt; /* The number of drivers registered with the XPT */ RefInfo Drvr[]; /* A list of the drivers */ } DrvrList; typedef struct { BusInfo * BusInfoPtr[kMaxBuses]; // pointers to BusInfos (handles 99.99965% of cases) long OldSyncWait; short numBuses; short syncUnsafeCount; uchar flags; uchar unusedC2; // uchar unusedC0; uchar unusedC1; Ptr debugPatch; // address of our _DebugUtil Patch short oldIDBusNumber[8]; // one for each SCSI ID OldCallStates oldAPIstate; SCSIphase latestOldCallPhase; short unusedX; ushort nextInterleave; SCSI_IO * xptIOptr; ushort xptIOpbSize; // size of currently allocated SCSI_IO (for old API) ushort maxIOpbSize; // size of largest required SCSI_IO (for all SIMs) DrvrList * Drivers; // A list of drivers Ptr BootStorage; // used by the boot code BusInfo TopBusInfos[kNumBusInfos]; // start with room for 3 BusInfo elements DeferredTask completionDT; } XPTglobals; // scsXPTprivate is defined in ACAM.h but we'll be more specific for our code #define savedA5 scsiXPTprivate //****** For XPTg.flags field ******** #define kbOldAPIBusy 0 #define kbInOldCall 1 #define kbCSOD 4 #define kbCSODatBoot 5 #define kbCSODatScan 6 #define kbResetFromSync 7 //***** For XPTprivateFlags field ******* #define kbTIB 0 #define kmTIB 1 /******** SCSIStat word bit equates ********/ #define kmStatATN 0x0200 #define kmStatACK 0x0100 #define kmStatRST 0x0080 #define kmStatBSY 0x0040 #define kmStatREQ 0x0020 #define kmStatMSG 0x0010 #define kmStatC_D 0x0008 #define kmStatI_O 0x0004 #define kmStatSEL 0x0002 #define kmStatDBP 0x0001 /******** Function Prototypes ********/ #define GetXPTg() (*(XPTglobals **)(*((Ptr *)0xC0C)+0x1B4)) //#pragma parameter __D0 getCurrentA5() /* move.l A5, D0 */ //Ptr getCurrentA5(void) = {0x2005}; long SCSIAtomic(void); BusInfo * GetBusInfo( ushort busID, XPTglobals *XPTg); void SetXPTg( XPTglobals *XPTg); void SetTempXPTg( XPTglobals *XPTg); OSErr SCSITrap( short scsiSelector, SCSI_PB *pbPtr); void CheckInterrupts ( XPTglobals *XPTg); void Clear( void * where, short len); void aack_XPT( ushort val); OSErr CallSIMaction( void * pbPtr, XPTglobals * XPTg); void GetVirtualIDInfo( SCSIGetVirtualIDInfoPB *pbPtr, XPTglobals *XPTg); Ptr getCurrentA5(); void restoreCurrentA5( Ptr ); Ptr ciDebuggerPatch( Ptr ); Ptr ciBusyPatch( Ptr ); void DispatchISR ( void); void Init_SCSIXlate( void); void InitXPTAsm( void); OSErr NewXPTioPB( ulong pbSize, XPTglobals *XPTg); void XlateOldSCSIGlobals( XPTglobals *XPTg); void InitSyncWait( XPTglobals *XPTg); void InitCompletionStuff( XPTglobals *XPTg); void RemoveSyncWait( XPTglobals *XPTg); void CallCompRoutineGlue( void *fn, void *ioPtr); ushort SetIntsAt2( void); ushort InterruptLevel( void); void RestoreInts( ushort ); void InitRecorder( void); #define SCSIDebugStr(a) //DebugStr(a) #define UNIMPTRAP 0x9F #define SCSIATOM 0x89 #define SCSIGlobals (*((SCSIGlobalsRec **)0x0C0C)) /* (long) ptr for SCSI mgr locals*/ #define kbusyPatchVers 'cb' // WAY WAY important! If you change the busyPatch code change this value! // I'm not sure that this belongs here - but here it is. // It is here as a reference and to access those // fields we co-opted. typedef struct { // \/ // Leftovers from the old SCSI Manager ulong jvReset; // SCSIReset vector ulong jvGet; // SCSIGet vector ulong jvSelect; // SCSISelect vector ulong jvCmd; // SCSICmd vector ulong jvComplete; // SCSIComplete vector ulong jvRead; // SCSIRead vector ulong jvWrite; // SCSIWrite vector ulong jvInstall; // SCSI installation vector (for debugging purposes) ulong jvRBlind; // SCSIRBlind vector ulong jvWBlind; // SCSIWBlind vector ulong jvStat; // SCSIStat vector ulong jvSelAtn; // SCSISelAtn vector ulong jvSMsgIn; // SCSIMsgIn vector ulong jvSMsgOut; // SCSIMsgOut vector ulong firstPrivate; // Ptr to SCSI Mgr private storage record circularly linked list ulong nextPrivate; // Ptr to next available SCSI Mgr private storage record ulong base5380; // SCSI read base address ulong pdma5380; // SCSI pseudo-DMA read base addr ulong hhsk5380; // SCSI hardware-handshaked read base addr ushort wrOffset; // write offset relative to "base5380" ushort scsiQFlags; // flags for SCSI request queue ulong scsiQHead; // Ptr to head of SCSI request queue ulong scsiQTail; // Ptr to tail of SCSI request queue ulong activeReq; // Ptr to currently active SCSI request ulong timeout; // next timeout should occur at this time uchar G_ID; // initiator's SCSI ID mask uchar G_State; // SCSI Mgr state (free/busy) ushort G_Async; // unused - $62 ulong G_Reserved0; // box number in high byte. HW flags in low bytes ulong G_Reserved1; // used for storing timer value ulong G_Reserved2; // machine-specific storage // Cool stuff for the new SCSI Manager Ptr unused0; // 70: Ptr berr_halg0; // 74: Saved HAL globals for internal bus (used by the Bus Error Handler) Ptr berr_halg1; // 78: Ditto for external bus. (I know, its a hack but justifiable because // we are the only ones with xfer routines that cause bus errors.) ulong jvUnusedXL1; // 7c: jv called when we're selected as target uchar numBEHs; // 80: Number of Bus Error Handlers installed uchar inDebugger; // 81: uchar unused1[2]; // 82: XPTglobals * tempXPTGGlobals; // 84: Used for "transitioning" from one XPT to another ulong tempXPTGInUse; // 88: Set to 'xptg' if we have two XPTs active ulong unused2; // 8c: ulong recordBreak0; // 90: gets checked for match against all events recorded ulong recordBreak4; // 94: ulong busyPatch; // 98: uchar ciBusyPending; // 9c: Used by the ciSCSIBusy patch to keep track of deferred jvSCSIFreeHook Calls uchar unused3; // 9d: ushort busyPatchVers; // 9e: ulong recCurrent; // a0: debugging event recorder - current pointer ulong recSize; // a4: debugging event recorder - size of buffer ulong recStartLog; // a8: logical start of buffer ulong recStartPhys; // ac: physical start of buffer ushort newBusyPatchVers; // ushort completionQHdr; // b2: high byte = flag indicating deferred task is enqd ulong completionQHead; // b4: Q used to call completion routines from our ulong completionQTail; // b8: deferred task (XPT.a). // ——— OLD ——— ushort unusedW2; // QHdr privDTQueue; // used for the private deferred task manager Ptr oldjDisptch; // the old jDisptch vector we patched out ulong ci_jDisptchVers; // version tag for our patch ulong jvVFWO; // virtual fast writes (hhsk) ulong jvCSO; // virtual slow compare ("p" bit redefined to mean "compare") ulong jvUnused3; // unused ulong jvCFO; // virtual fast compare ("p" bit redefined to mean "compare") ulong jvUnused4; // unused ulong jvInvalidIn; // Invalid Message In ulong jvIdentifyIn; // Identify Message In ulong jvCmdComplete; // Command Complete ulong jvExtendedMsg; // Extended Message ulong jvSaveDataPtr; // Save Data Pointer ulong jvRestorePtrs; // Restore Pointers ulong jvDisconnect; // Disconnect ulong jvMsgRejIn; // Message Reject In ulong jvLCCF; // Linked Command Complete with (or without) flag ulong sdmStack; // SCSIDiskMode stack global for DB Lite ulong base5380_1; // SCSI read base address (internal) ulong pdma5380_1; // SCSI pseudo-DMA read base addr (internal) ulong hhsk5380_1; // SCSI hardware-handshaked read base addr (internal) ulong base5380_2; // SCSI read base address (external) ulong pdma5380_2; // SCSI pseudo-DMA read base addr (external) ulong hhsk5380_2; // SCSI hardware-handshaked read base addr (external) ulong jvIdentifyOut; // Identify Message Out ulong jvMsgRejOut; // Message Reject Out ulong jvInvalidOut; // Invalid Message Out ulong jvKillIO; // Kill I/O ulong jvNoOp; // No Operation ulong jvBusDevRstOut; // Bus Device Reset Out ulong G_SCSIDREQ; // SCSI DREQ base address ulong G_TargetID; // Target ID ulong G_FakeStat; // Fake state ulong G_OldTrapAdrs; // contains the old SCSIMgr address ulong G_OldIntHnd; // contains old intrp level 2 handler ulong G_IntrpCount; // counts total # of intrps ulong G_IntrpStat; // Status read by Intrp routine ulong GxState96; // Bits to make c96 backwards compatible ulong BootCfgFlags; // copy of d2 passed to InitHW_SCSI96 at boot (used by jvInitHW) uchar G_bitDREQ; // Bit position at DREQ location uchar jvUnused32; // Future expansion ushort jvUnused33; // Future expansion ulong jvIntHnd; // 24-entry jump table -- interrupt handler ulong jvMessage; // Send a message to the deferred task ulong jvClearIRQ; // Clear the SCSI interrupt (and VIA, if necessary) ulong jvDisEnable; // Enable/disable interrupts routine ulong jvLogError; // Record error for the PB ulong jvSCSIDT; // Deferred Task for all other interrupts ulong jvFind; // Find a request to process ulong jvSetup; // Setup active request ulong jvPreflight; // Preflight the parameter block ulong jvEnDequeue; // Enqueue/dequeue a parameter block ulong jvArb; // Arbitrate for the SCSI bus ulong jvSel; // Select a SCSI device ulong jvDelay22; // Delay 2.2 microseconds ulong jvClearState; // Remove the current request ulong jvTransfer; // Transfer data using the primitive routines ulong jvSetTimer; // Set the timer ulong jvResetBus; // Reset SCSI bus and kill all requests ulong jvClearBus; // Clear the SCSI bus ulong jvBusErr; // Bus error handler ulong jvDataDMA; // DMA-related data-chaining interpreter // ——— NEW ——— ulong xptGlobals; // 1b4: pointer to Cousin Itt's XPT globals // ——— OLD ——— ulong blindBusTO; // 1b8: number of ticks to wait for blind transfer bytes (after 1st byte) ushort transferType; // 1bc: Type of data transfer to perform (used in Transfer_96, BusError) uchar lastINTread; // 1be: Value of rINT at last valid interrupt read uchar lastSTAread; // 1bf: Value of rSTA at last valid interrupt read // ——— NEW and OLD ——— ulong yeOldeBusErrVct; // 1c0: temp storage while we insert our buserr handler pdw ulong base539x0; // 1c4: 539x base address, bus0 ulong base539x1; // 1c8: 539x base address, bus1 uchar G_SCSIDevMap0; // 1cc: Device Map for the Internal SCSI Bus uchar fill1[3]; uchar G_SCSIDevMap1; // 1d0: Device Map for the External SCSI Bus uchar fill2[3]; } SCSIGlobalsRec; #define tempXPT 'xptg' // value for tempXPTGInUse #endif //__XPTPRIV__