/* File: InitItt.c Contains: routines that initializes Cousin Itt Entry points: Written by: Paul Wolf Copyright: © 1992-1994 by Apple Computer, Inc., all rights reserved. Change History (most recent first): 2/2/94 DCB My last change broke the INIT... 2/2/94 DCB Removed call INITSCSIBOOT and moved it into StartInit.a where it gets called after Slot Interrupts and ADB are initialized. 2/1/94 chp Remove some redundant initializations of fields in the TNT HDA descriptor. 2/1/94 DCB Set the using601Emulator field in the hardware description field if we are running on a 601. 1/29/94 DCB Added code to initialize SIMg->otherSIMg which is used on dual bus machines with one interrupt source. 1/5/94 pdw Converted SCSIGlobals usage to new format. 12/19/93 DCB Only check for non-universal if we are being built as an INIT. 12/19/93 DCB Un-Patch the Deferred Task Manager if patchIIciROM.a has installed the evil QuickMail patch which can cause the stack to grow in an unbounded fashion. Also don't install on non-universal ROMs (Duh). 11/22/93 pdw Rolling in from . 11/21/93 pdw Removed reinitialization of interrupt function fields for second bus. 11/19/93 chp Support new IRQ primitive vector initialization. Move TNT external SCSI to SCSI96_2 and support internal SCSI as SCSI96_1, which is a 53CF96. 9/29/93 chp Fill in more vital statistics for TNT. 9/22/93 chp Add support and vital information for TNT SCSI initialization. 10/29/93 DCB roll-in. 10/28/93 pdw Cleaned up forPDMProto stuff a little bit more. 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 Got rid of ReplaceGestalt call. 9/16/93 pdw Added setting of HBAisFast for ColdFusion's FC96 bus and clearing of it (for default) for all second buses. Fixes the initialization of Curio as an FC96 bug (which made boot SLOW). 9/13/93 pdw Roll-in from SuperMario. 9/13/93 pdw Changed the risky slash pattern. 9/12/93 pdw Added support for reregistration of buses for plugging in new replacement SIMs (i.e. from an Init on an IttFull ROM). 8/23/93 DCB Went back to checking for djMEMC since the TestFor works now. 8/20/93 DCB Fixing initialization problems for Wombats and possibly other (?) 040/c96 machines. Need to unblock interrupts before returning if we don't install. Also default to Wombat for now if we don't know what we are - I'll fix this soon I promise. 8/13/93 pdw Got rid of all that fake-gestalt stuff. Went to local cpu var based on decoder types. 7/28/93 pdw Fixing Quadra ISR vector problem: Adding init of intIRQbitNum to 3 into default values init area. 7/20/93 pdw Fixed up some Cold Fusion problems with IRQ bit numbers and some Quadra 9x0 problems with not initing the second DAFB. 7/2/93 IH Reality Update: Change Gestalt call to use SelectorFunctionProcPtr. 6/29/93 pdw Massive checkins: Change asynchronicity mechanism to CallMachine stack switching mechanism. Adding support for Cold Fusion. Rearranging HW/SW Init code. Some code optimizations. 5/30/93 PW Fixed "doesn't run without Gibbly" bug by only dereferencing HALg0 and HALg1 when they are both valid. 5/29/93 PW Nothing really. 5/25/93 DCB Rollin from Ludwig. (The next item below) 5/21/93 PW Adding PRAM selectable Initiator ID stuff. 5/5/93 PW Making changes to get this to work in ROM on PDM EVT2. 5/5/93 PW Converted names to meanies-friendly names. Updated with latest from Ludwig stuff. 4/8/93 DCB Added Initialization code for Wombat class machines. 3/29/93 PW Changed PDM's characteristic to hasDMA=true. 4/30/93 DCB Blocking interrupts around installation to prevent VBLs etc from stepping on us. 4/14/93 DCB Added AppleSim function to prevent installation of SIMs if they are already there. 3/26/93 PW Changed the names of some of the hw desc fields (dreqNeedsSwapMMU, dmaType etc). Slight rearrangement into default, special case. 2/17/93 PW Began adding dual-interrupt support for Quadras. 3/22/93 PW Removing DMA support for PDM because DMA reads kills DMA writes on all other channels. 3/20/93 PW Rolled back the fixed changes for . Mostly for dual-bus support for Quadras and lots of little PDM things. 3/17/93 DCB Rolled out Changes for which broke the build. 3/16/93 PW Began adding dual-interrupt support for Quadras. Rearranged for easier universalization. 1/31/93 PW Update from the latest of Ludwig. Also changes required for PDM (will update Ludwig with these as needed myself). 1/27/93 PW Starting to rewrite for Universalizing this blasted file. 11/20/92 DCB Added Gestalt scsiSelector 8/24/92 PN Take out CycloneboxEVT1 stuff 7/28/92 PW Got rid of unused variable warning. 7/28/92 PW Removed blocking of interrupts because of a VM habit of rejecting LockMemory if ints are nonzero. NOT the final solution. 7/24/92 PW New Today. */ #include #include #include #include #include #include #include #include #include #ifndef SCSI2Base #define SCSI2Base 0x1FF0 /*[GLOBAL VAR] (long) base address for 2nd SCSI chip read*/ #endif #include "SCSIDebug.h" #include "ACAM.h" #include "XPT.h" #include "SIMCore.h" #include "BootItt.h" #include "HALc96.h" #include "SCSIGlue.h" #include "XPTPriv.h" //!!! We need to move the SCSIGlobals struct to XPT.h! #include "SIMCorePriv.h" pascal OSErr IttGestalt( OSType scsiSelector,long * response ); // Boolean AppleSIMS( void ); extern short BlockInterrupts(void); extern void UnblockInterrupts( short oldSR); /********************************************************************************* InitItt - initialize Cousin Itt See, the way it works is this. ¥ InitItt initializes the XPT by calling InitXpt ¥ InitItt initializes the HAL HW by calling Init53c9xHW ¥ InitItt initializes the HAL SW by calling Init53c9xSW ¥ The HAL actually has to register itself with SIMCore it calls SIMRegisterHAL ¥ SIMCore must register the new HBA with the XPT it calls SCSIRegisterBus ¥ The XPT allocates all of the statics for both HAL and SIMCore The XPT returns to the SIM ¥ The SIM sets up its statics and returns to the HAL ¥ The HAL sets up its statics and it's done and returns to InitItt ¥ InitItt does the same for each HBA it knows about (i.e. motherboard buses) ¥ InitItt calls NewGestalt to announce our arrival *********************************************************************************/ long InitItt() { long err; HBADesc_53c9x * hwDescPtr; //SelectorFunctionProcPtr oldGestalt; HALc96Globals * halg0; HALc96Globals * halg1; SIMglobals * simg0; SIMglobals * simg1; XPTglobals * xptg; ushort oldSR; Boolean reregister; enum {kPDM, kCyclone, kRealQuadra, kWombat, kTNT} cpu; long gstlt; #if forPDMProto Boolean onPDM_EVT1; #endif #if forIttInit // Don't install on non-universal machines // Should I check for Gestalt being implemented? if( Gestalt('hdwr', &gstlt) ) return(-1); if( (gstlt & (1 << gestaltHasUniversalROM)) == 0 ) return(-1); #endif if ( ! TestFor_SCSI96_1Exists()) // At least one 53c96? return (-1); // no- exit w/err oldSR = BlockInterrupts(); //-> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> -> if ( TestFor_HMCDecoder() ) { cpu = kPDM; #if forPDMProto if (*(char *)0xcb3 == 0x44) onPDM_EVT1 = true; else onPDM_EVT1 = false; #endif } else if ( TestFor_PSCExists()) { cpu = kCyclone; } else if ( TestFor_OrwellExists()) { cpu = kRealQuadra; } else if ( TestFor_djMEMCExists()) { cpu = kWombat; } else if ( TestFor_GrandCentralExists()) { cpu = kTNT; } else { UnblockInterrupts( oldSR); //<- <- <- <- <- <- return (-1); } if (err = InitXPT()) { // always need to init the XPT first IfDebugStr("\pInitXPT failed"); UnblockInterrupts( oldSR); //<- <- <- <- <- <- return (-1); } #if forIttInit // First we need to fix a bug in the deferred task manager. The System 7 // link patch "fixes" a QuickMail server bug by adding code to reduce interrupts // everytime we attempt do dispatch tasks - even if if the DTQueue is busy and // we aren't going to do anything this go-round. If an interrupt is pending at // this point it is happens even though we haven't RTE'd from the interrupt we // were just completing. If this happens back to back to ... then we fill up the // stack with interrupt stack frames until we collide with the heap. // SuperMario ROMs do not do this so I assume CE fixed their bug long ago. Since // the "fix" for them makes it impossible for me to use the Deferred Task Manager // I am stuffing the original ROM vector back in so it won't lower interupts prior // to doing the RTE. #define jDisptch 0x6e4 // Low mem vector for deferred task manager { ushort *instr; instr = *(ushort **)jDisptch; // Check to see if the patch is installed if( instr[0] == 0x4eb9 && // jsr 4080a1ee (_DTInstall + 1e) instr[1] == 0x4080 && instr[2] == 0xa1ee && instr[3] == 0x027c && // andi.w #f8ff, sr instr[4] == 0xf8ff && instr[5] == 0x4e75 ) // rts { // Stuff the old vector back in. This address is correct for // all IIci based ROMs. Note that if this isn't a IIci based // ROM then the above patch wouldn't call 0x4080a1ee. *(ulong *)jDisptch = 0x4080a1ee; } // else leave it alone } #endif reregister = AppleSIMS(); // if our SIMs are already there, do a REregister instead hwDescPtr = (HBADesc_53c9x *) NewPtrSysClear( sizeof(HBADesc_53c9x)); //&&&& NewPtrSysClear if (hwDescPtr==0) { IfDebugStr("\pCanÕt allocate hwDesc"); UnblockInterrupts( oldSR); //<- <- <- <- <- <- return (-1); } //ÉÉÉÉÉÉ Prep for Initializing First Bus ÉÉÉÉÉÉ //--- Default Values (except addresses) hwDescPtr-> baseRegAddr = *(Ptr *)SCSIBase; // base addr of c9x registers (offset of $10 between regs hwDescPtr-> pdmaAddr = hwDescPtr->baseRegAddr+0x100; // addr of Pseudo-dma access hwDescPtr-> pdmaNonSerlzdAddr = hwDescPtr->pdmaAddr; // default to no non-serialized space hwDescPtr-> jvClearSCSIIRQ = ClearVIASCSIIRQ; hwDescPtr-> jvEnableSCSIIRQ = EnableVIASCSIIRQ; hwDescPtr-> jvDisableSCSIIRQ = DisableVIASCSIIRQ; hwDescPtr-> jvTestSCSIIE = TestVIASCSIIE; hwDescPtr-> HBAisFast = false; // set if c9x part capable of Fast Synchronous (10MB/S) hwDescPtr-> HBAisDiff = false; // set if c9x part capable of differential hwDescPtr-> intOSNumberSCSI = 0; // OS registration number for the SCSI interrupt hwDescPtr-> intSensSCSI = LEVEL; // EDGE vs LEVEL vs STICKYBIT sensitive int hwDescPtr-> intOSNumberDMA = 0; // OS registration number for the DMA interrupt hwDescPtr-> intTypeDMA = SHARED_VIA; // type of interrupt control (shared VIA bit, etc.) hwDescPtr-> intSensDMA = LEVEL; // EDGE vs LEVEL vs STICKYBIT sensitive int hwDescPtr-> intDREQbitNum = 0; // hwDescPtr-> intIRQbitNum = 3; // IRQ = bit 3 hwDescPtr-> enableIRQvalue = (1<<3)+0x80; hwDescPtr-> disableIRQvalue = (1<<3); hwDescPtr-> testIRQenableValue = (1<<3); hwDescPtr-> clearIRQvalue = (1<<3)+0x80; hwDescPtr-> dreqNeedsSwapMMU = false; // set if dreq status bit is in DAFB register hwDescPtr-> HBAhasDMA = false; // set if true DMA available hwDescPtr-> HBAhasPseudoDMA = true; // set if Pseudo-DMA available hwDescPtr-> HBAhasHskPseudoDMA = true; // set if handshaked pseudo-DMA available hwDescPtr-> intTypeSCSI = INDEPENDENT_VIA; // type of interrupt control (shared VIA bit, etc.) hwDescPtr-> dmaType = dmaTypeNone; // type of DMA controller hwDescPtr-> usesThreshold8 = false; // doesn't use threshold 8 mode if( Gestalt('cput',&gstlt) == noErr && gstlt == gestaltCPU601 ) hwDescPtr-> using601Emulator = true; // running emulated else hwDescPtr-> using601Emulator = false; // running native 68K //--- Fields specific to different CPUs switch (cpu) { case kPDM: hwDescPtr-> dreqAddr = (Ptr)0x50F26003; hwDescPtr-> intEnableSCSIAddr = (Ptr)0x50f26013; hwDescPtr-> intFlagSCSIAddr = (Ptr)0x50f26003; hwDescPtr-> HBAhasDMA = true; hwDescPtr-> HBAhasPseudoDMA = true; hwDescPtr-> HBAhasHskPseudoDMA = true; hwDescPtr-> intTypeSCSI = INDEPENDENT_VIA; hwDescPtr-> dmaType = dmaTypeAMIC; hwDescPtr-> dmaAlignmentSize = 8; hwDescPtr-> usesThreshold8 = true; #if forPDMProto if (onPDM_EVT1) { hwDescPtr-> HBAhasPseudoDMA = true; // pseudo-DMA is supported on old AMIC hwDescPtr-> HBAhasHskPseudoDMA = false; // but, handshaked pseudo-DMA isn't hwDescPtr-> HBAhasDMA = true; // true DMA available kinda } #endif if ( TestFor_SCSI96_2Exists()) { // if 2 buses, this is the FC96 NOT the Curio hwDescPtr-> dmaCntrlAddr = (Ptr)0x50F32009; hwDescPtr-> dmaBaseAddr = (Ptr)0x50F32004; hwDescPtr-> HBAisFast = true; hwDescPtr-> intIRQbitNum = 6; // IRQ = bit 6 hwDescPtr-> enableIRQvalue = (1<<6)+0x80; hwDescPtr-> disableIRQvalue = (1<<6); hwDescPtr-> testIRQenableValue = (1<<6); hwDescPtr-> clearIRQvalue = (1<<6)+0x80; hwDescPtr-> intDREQbitNum = 2; // DRQ = bit 2 } else { // if just 1 bus, this is the Curio - MAKE SURE 2nd VERSION CHANGES ! hwDescPtr-> dmaCntrlAddr = (Ptr)0x50F32008; hwDescPtr-> dmaBaseAddr = (Ptr)0x50F32000; hwDescPtr-> intIRQbitNum = 3; // IRQ = bit 3 hwDescPtr-> enableIRQvalue = (1<<3)+0x80; hwDescPtr-> disableIRQvalue = (1<<3); hwDescPtr-> testIRQenableValue = (1<<3); hwDescPtr-> clearIRQvalue = (1<<3)+0x80; hwDescPtr-> intDREQbitNum = 0; // DRQ = bit 0 } break; case kRealQuadra: // Pseudo-dma non-serialized access (non-decoded in HW, different page table entry) hwDescPtr-> pdmaNonSerlzdAddr = hwDescPtr->pdmaAddr+0x40000; hwDescPtr-> dafbAddr = (Ptr)0xF9800024; // addr of dafb register to init hwDescPtr-> dreqAddr = hwDescPtr->dafbAddr + 2; // addr of dafb register with DREQ bit hwDescPtr-> intEnableSCSIAddr = (Ptr)0x50f03c13; hwDescPtr-> intFlagSCSIAddr = (Ptr)0x50f03a03; hwDescPtr-> intSensSCSI = EDGE; hwDescPtr-> dreqNeedsSwapMMU = true; hwDescPtr-> intDREQbitNum = 1; hwDescPtr-> needsDAFBinit = true; // Quadras need their DAFB inited hwDescPtr-> HBAhasDMA = false; hwDescPtr-> HBAhasPseudoDMA = true; hwDescPtr-> HBAhasHskPseudoDMA = true; if ( TestFor_SCSI96_2Exists()) hwDescPtr-> intTypeSCSI = SHARED_VIA; // if 2 buses, this is a shared via bit for int else hwDescPtr-> intTypeSCSI = INDEPENDENT_VIA; // if 1 bus, this is an independent bit in via break; case kWombat: hwDescPtr-> dreqAddr = (Ptr)0x50f03a00; hwDescPtr-> intEnableSCSIAddr = (Ptr)0x50f03c13; hwDescPtr-> intFlagSCSIAddr = (Ptr)0x50f03a03; hwDescPtr-> intSensSCSI = EDGE; hwDescPtr-> dmaType = pdmaTypeBIOS; break; case kCyclone: hwDescPtr-> pdmaAddr = (Ptr)0; hwDescPtr-> pdmaNonSerlzdAddr = (Ptr)0; hwDescPtr-> dreqAddr = (Ptr)0x50f03a00; hwDescPtr-> intEnableSCSIAddr = (Ptr)0x50f03c00; hwDescPtr-> intFlagSCSIAddr = (Ptr)0x50f03a00; hwDescPtr-> HBAhasDMA = true; hwDescPtr-> HBAhasPseudoDMA = false; hwDescPtr-> HBAhasHskPseudoDMA = false; hwDescPtr-> intTypeSCSI = INDEPENDENT_VIA; hwDescPtr-> dmaType = dmaTypePSC; hwDescPtr-> dmaAlignmentSize = 16; break; case kTNT: // SCSI96_1 is by convention the internal bus (53CF96) // This bus is known in the Grand Central literature as SCSI1. hwDescPtr-> pdmaAddr = (Ptr)0x5FFF8001; // ainÕt no such thing hwDescPtr-> pdmaNonSerlzdAddr = (Ptr)0x5FFF8001; // ainÕt no such thing hwDescPtr-> dreqAddr = (Ptr)0xF301A000; // in Generic Board Register (Proto2) hwDescPtr-> intEnableSCSIAddr = (Ptr)0xF3000024; // 32-bit access only! hwDescPtr-> intFlagSCSIAddr = (Ptr)0xF300002C; // 32-bit access only! hwDescPtr-> dmaCntrlAddr = (Ptr)0xF3008A00; // 32-bit access only! hwDescPtr-> jvClearSCSIIRQ = ClearGCSCSI1IRQ; hwDescPtr-> jvEnableSCSIIRQ = EnableGCSCSI1IRQ; hwDescPtr-> jvDisableSCSIIRQ = DisableGCSCSI1IRQ; hwDescPtr-> jvTestSCSIIE = TestGCSCSI1IE; hwDescPtr-> HBAisFast = true; hwDescPtr-> HBAhasDMA = true; // got the old DB-DMA thing hwDescPtr-> HBAhasPseudoDMA = false; hwDescPtr-> HBAhasHskPseudoDMA = false; hwDescPtr-> intIRQbitNum = gcifDevSCSI1; hwDescPtr-> intDREQbitNum = 7; hwDescPtr-> intOSNumberSCSI = gcifDevSCSI1; hwDescPtr-> intTypeSCSI = GRAND_CENTRAL; hwDescPtr-> intOSNumberDMA = gcifDmaSCSI1; hwDescPtr-> intTypeDMA = GRAND_CENTRAL; hwDescPtr-> dmaType = dmaTypeGC; // type of DMA controller hwDescPtr-> dmaAlignmentSize = 1; // no alignment restrictions break; } //ÉÉÉÉÉÉ Do Initialization of first bus ÉÉÉÉÉÉ ReadInitiatorID(hwDescPtr); // read Initiator ID into hwDesc if (err = Init53c9xHW(hwDescPtr)) { // will want to see if TERROR already did this init IfDebugStr("\pInit53c9xHW 1 failed"); UnblockInterrupts( oldSR); //<- <- <- <- <- <- return (-1); } if (reregister) halg0 = (HALc96Globals *)ReInitHAL(hwDescPtr, 0); // re-init the HAL at bus #0 else halg0 = (HALc96Globals *)Init53c9xSW(hwDescPtr); // init the HAL if (halg0 == 0) { IfDebugStr("\pInit53c9xSW 1 failed"); UnblockInterrupts( oldSR); //<- <- <- <- <- <- return (-1); } SCSIGlobals->numBEHs = 0; SCSIGlobals->berr_halg0 = (Ptr)halg0; //ÉÉÉÉÉÉ Prep for Initializing external HBA for Dual-Bus Machines ÉÉÉÉÉÉ if ( TestFor_SCSI96_2Exists()) { hwDescPtr-> baseRegAddr = *(Ptr *)SCSI2Base; // base addr of c9x registers (offset of $10 between regs hwDescPtr-> pdmaAddr = hwDescPtr->baseRegAddr+0x100; // addr of Pseudo-dma access hwDescPtr-> pdmaNonSerlzdAddr = hwDescPtr->pdmaAddr; // default to no-nonserialized access hwDescPtr-> HBAisFast = false; switch (cpu) { case kPDM: // if 2 buses, this is the Curio NOT the FC96 hwDescPtr-> dmaCntrlAddr = (Ptr)0x50F32008; hwDescPtr-> dmaBaseAddr = (Ptr)0x50F32000; hwDescPtr-> intIRQbitNum = 3; // IRQ = bit 3 hwDescPtr-> enableIRQvalue = (1<<3)+0x80; hwDescPtr-> disableIRQvalue = (1<<3); hwDescPtr-> testIRQenableValue = (1<<3); hwDescPtr-> clearIRQvalue = (1<<3)+0x80; hwDescPtr-> intDREQbitNum = 0; // DRQ = bit 0 break; case kRealQuadra: // Quadra 9x0 hwDescPtr-> pdmaNonSerlzdAddr = hwDescPtr->pdmaAddr+0x40000; hwDescPtr-> dafbAddr = (Ptr)0xF9800028; // addr of dafb register to init hwDescPtr-> dreqAddr = hwDescPtr->dafbAddr + 2; // addr of dafb register with DREQ bit hwDescPtr-> intTypeSCSI = SHARED_VIA; break; case kTNT: // SCSI96_2 is by convention the external bus (CURIO 53C94 cell) // This bus is known in the Grand Central literature as SCSI0. hwDescPtr-> pdmaAddr = (Ptr)0x5FFF8001; // ainÕt no such thing hwDescPtr-> pdmaNonSerlzdAddr = (Ptr)0x5FFF8001; // ainÕt no such thing hwDescPtr-> dreqAddr = (Ptr)0xF301A000; // in Generic Board Register (Proto2) hwDescPtr-> intEnableSCSIAddr = (Ptr)0xF3000024; // 32-bit access only! hwDescPtr-> intFlagSCSIAddr = (Ptr)0xF300002C; // 32-bit access only! hwDescPtr-> dmaCntrlAddr = (Ptr)0xF3008000; // 32-bit access only! hwDescPtr-> jvClearSCSIIRQ = ClearGCSCSI0IRQ; hwDescPtr-> jvEnableSCSIIRQ = EnableGCSCSI0IRQ; hwDescPtr-> jvDisableSCSIIRQ = DisableGCSCSI0IRQ; hwDescPtr-> jvTestSCSIIE = TestGCSCSI1IE; hwDescPtr-> HBAhasDMA = true; // got the old DB-DMA thing hwDescPtr-> HBAhasPseudoDMA = false; hwDescPtr-> HBAhasHskPseudoDMA = false; hwDescPtr-> intIRQbitNum = gcifDevSCSI0; hwDescPtr-> intDREQbitNum = 6; hwDescPtr-> intOSNumberSCSI = gcifDevSCSI0; hwDescPtr-> intTypeSCSI = GRAND_CENTRAL; hwDescPtr-> intOSNumberDMA = gcifDmaSCSI0; hwDescPtr-> intTypeDMA = GRAND_CENTRAL; hwDescPtr-> dmaType = dmaTypeGC; // type of DMA controller hwDescPtr-> dmaAlignmentSize = 1; // no alignment restrictions break; } //ÉÉÉÉÉÉ Do Initialization of second bus ÉÉÉÉÉÉ ReadInitiatorID(hwDescPtr); // read Initiator ID into hwDesc if (err = Init53c9xHW(hwDescPtr)) { // will want to see if TERROR already did this init IfDebugStr("\pInit53c9xHW 2 failed"); UnblockInterrupts( oldSR); //<- <- <- <- <- <- return (-1); } if (reregister) halg1 = (HALc96Globals *)ReInitHAL(hwDescPtr, 1); // re-init the HAL at bus #1 else halg1 = (HALc96Globals *)Init53c9xSW(hwDescPtr); // init the HAL if (halg1 == 0) { IfDebugStr("\pInit53c9xSW 2 failed"); UnblockInterrupts( oldSR); //<- <- <- <- <- <- return (-1); } SCSIGlobals->berr_halg1 = (Ptr) halg1; halg0->otherHALg = (void *)halg1; halg1->otherHALg = (void *)halg0; xptg = GetXPTg(); // From the SCSIGlobals // Just like the HAL the SIM needs to know about the other bus simg0 = (SIMglobals *)(((xptg->BusInfoPtr[0])->initInfo).SIMstaticPtr); simg1 = (SIMglobals *)(((xptg->BusInfoPtr[1])->initInfo).SIMstaticPtr); simg0->otherSIMg = (Ptr)simg1; simg1->otherSIMg = (Ptr)simg0; } UnblockInterrupts( oldSR); //<- <- <- <- <- <- <- <- <- <- <- <- <- <- <- <- <- <- <- <- if( NewGestalt(gestaltSCSI,IttGestalt) ) { // if there is already one there, we need to get the old values and change only // those feature bits that change because of this new (apparently) RAM resident Itt code // then we need to replaceGestalt it. ** But for now, nothing changes ** //ReplaceGestalt(gestaltSCSI,IttGestalt,&oldGestalt ); } #if forIttInit INITSCSIBOOT(); #endif return (0); } /********************************************************************************* IttGestalt - *********************************************************************************/ pascal OSErr IttGestalt( OSType scsiSelector, long * response ) { #pragma unused(scsiSelector); *(ulong *)response = 1<