mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-28 01:29:20 +00:00
4325cdcc78
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included. The Tools directory, containing mostly junk, is also excluded.
303 lines
10 KiB
C
303 lines
10 KiB
C
/*
|
|
File: SIMCorePriv.h
|
|
|
|
Contains: private header stuff for the core of the Apple SIM layer
|
|
|
|
Written by: Paul Wolf
|
|
|
|
Copyright: © 1992-1994 by Apple Computer, Inc., all rights reserved.
|
|
|
|
Change History (most recent first):
|
|
|
|
<SM18> 1/31/94 DCB Changed prototype for SIMDualIntPoll
|
|
<SM17> 1/29/94 DCB Added otherSIMg to the SIM globals for better dual bus support.
|
|
<SM16> 11/22/93 pdw Rolling in from <MCxx>.
|
|
<MC7> 11/11/93 pdw Made the HALglobals 16-byte aligned relative to SIMglobals.
|
|
<MC6> 11/8/93 pdw Added some spares in the globals.
|
|
<SMG2> 9/29/93 chp Include some prerequisite headers if necessary.
|
|
<SM14> 10/29/93 DCB <MC> roll-in.
|
|
<MC4> 10/28/93 pdw Added some states used during Target mode.
|
|
<SM13> 10/14/93 pdw <MC> roll-in.
|
|
<MC3> 10/12/93 pdw Added a couple more states.
|
|
<MC2> 10/12/93 pdw Added support for Synchronous data transfers, rewrote State
|
|
Machine, message handling etc.
|
|
<SM12> 9/12/93 pdw Prototype maintenance.
|
|
<SM11> 9/9/93 pdw Lots of little changes. Name changes, temporary cache_bug
|
|
stuff.
|
|
<SM10> 7/17/93 pdw A few little things.
|
|
<SM9> 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.
|
|
<SM8> 5/25/93 DCB Rollin from Ludwig. (The next item below)
|
|
<LW9> 5/21/93 PW Adding SIMg parameter to ValidateDeviceIdent so that it can
|
|
check HostID.
|
|
<SM7> 5/5/93 PW Converted names to meanies-friendly names. Updated with latest
|
|
from Ludwig stuff.
|
|
<LW8> 4/30/93 DCB Added prototype for CallBusInquiry
|
|
<LW6> 4/14/93 DCB Added SIMInitInfo record to the SIM Globals so we would have it
|
|
later when we re-register with a new XPT.
|
|
<LW5> 3/26/93 PW Moved CallCompRoutine into SIM from XPT.
|
|
<SM5> 1/31/93 PW Update from the latest of Ludwig. Also changes required for PDM
|
|
(will update Ludwig with these as needed myself).
|
|
<LW4> 1/27/93 PW Added defaultDisc boolean for optimization of non-concurrent
|
|
environments. Added prototype for SIMIntPoll.
|
|
<LW3> 1/12/93 DCB Added an abort command parameter block to the globals for use in
|
|
SIMTimerProc.
|
|
<LW2> 12/17/92 DCB Got rid of a parameter in SetupResetPB which was no longer
|
|
needed.
|
|
<SM4> 12/5/92 PW Changed ValidateDI prototype.
|
|
<SM3> 11/20/92 DCB Async Abort,Terminate and Reset Device support plus I removed
|
|
some include files
|
|
<SM2> 10/30/92 DCB Changed to reflect new ACAM.h
|
|
<1> 10/8/92 PW first checked in
|
|
|
|
Before SIMCore.h and SIMCorePriv.h split
|
|
<sm7> 9/14/92 DCB Added some constants for SCSI ID range limits
|
|
<sm6> 9/11/92 DCB Mostly support for BusDeviceReset. Also added a WentBusFree
|
|
state
|
|
<sm5> 8/31/92 DCB Added aborted and terminated ioStats.
|
|
<sm4> 8/30/92 PW Added kAssertATN to HALactions record.
|
|
<sm3> 8/30/92 DCB Added Immediate Queue to the globals for Terminate/Abort IO
|
|
<sm2> 8/20/92 DCB Fixed SCSI Bus Reset
|
|
|
|
*/
|
|
|
|
#ifndef __SIMCOREPRIV__
|
|
#define __SIMCOREPRIV__
|
|
|
|
#ifndef __SCSI__
|
|
#include <SCSI.h>
|
|
#endif
|
|
|
|
#ifndef __SIMCORE__
|
|
#include "SIMCore.h"
|
|
#endif
|
|
|
|
|
|
//**** SCSI State Machine states *****
|
|
|
|
typedef enum { kIdle =0, // 0
|
|
kInitiatingNormal,
|
|
kInitiatingSDTR,
|
|
kInitiatingAsyncMsg,
|
|
kInitiatingOldCall, // 4
|
|
kReconGettingMsg,
|
|
kReconAcceptingMsg,
|
|
kReconRejectingMsg,
|
|
kAcceptingDataMsg, // 8
|
|
kRejectingDataMsg,
|
|
kSendingMsg,
|
|
kGettingDataMsg,
|
|
kSendingCommand, // C
|
|
kSwitchingPhase,
|
|
kGettingStatus,
|
|
kBitBucketing,
|
|
kSelecting, // $10
|
|
kAwaitingOldCall,
|
|
kPerformingOldCall,
|
|
kWentBusFree,
|
|
kGettingSCSIMsgIn, // $14
|
|
kWastingPhase,
|
|
kDoingData,
|
|
kGotR_selected,
|
|
kAcceptingRejectedIdentify, // $18
|
|
kAbortingRejectedIdentify,
|
|
kSendingKillMsg,
|
|
kSendingEarlyKillMsg,
|
|
kSendingCommand, // $1c
|
|
kAcceptingSDTR,
|
|
kAcceptingEarlySDTR,
|
|
kRejectingSDTR,
|
|
kSendingDetectedErrorMsg, // $20
|
|
kRejectingEarlyMsg,
|
|
kEarlySwitchingPhase,
|
|
kDisconnecting,
|
|
kDisconnectingB4Command, // $24
|
|
kFailingSelect,
|
|
kWastedToBusFree,
|
|
kAcceptingRejectedAsyncMsg,
|
|
kHandlingSelected, // $28
|
|
kFreeMachine,
|
|
kNumSSMstate
|
|
} SSMstate;
|
|
|
|
|
|
/********** GLOBALS **************/
|
|
|
|
typedef struct {
|
|
|
|
// Static description of bus
|
|
|
|
HALinitInfo HALinfo; // copy of HALinitInfo, made after registration
|
|
|
|
// Dynamic description of bus
|
|
|
|
short unusedS1; // to align qHdr
|
|
QHdr qHdr; // q header for the SCSI_Exec_IO pbs
|
|
|
|
short unusedS2; // to align qHdr
|
|
QHdr resetHdr; // q header for pbs which have been cancelled by a reset
|
|
|
|
short unusedS3; // to align qHdr
|
|
QHdr immedQHdr; // q header for immediate actions (Abort, reset etc.) <sm3>
|
|
|
|
short pushedState; // to align qHdr
|
|
QHdr resetPBQ; // a queue of ResetDevice parameter blocks
|
|
|
|
uchar SSMflags; // 8 flags for SCSI state machine
|
|
uchar Qflags; // 8 flags for SCSI Q
|
|
Boolean flag2; //
|
|
Boolean flag4; //
|
|
Boolean r_selectWaiting;// set by R_selectISR and cleared by StartMachine (+others)
|
|
Boolean sensePBBusy; // set whenever autosense IOpb is in use
|
|
Boolean SIMBusy; //
|
|
Boolean flag5; //
|
|
|
|
short state; // current state of State Machine
|
|
uchar reconTargetID; // ID of target that just reconnected
|
|
uchar reconLUN; // LUN of target ...
|
|
|
|
HALactionPB halPB; // action PB for speaking at the HAL
|
|
SIM_IO * currIOptr; // current IO PB that the SSM is talking about
|
|
|
|
ushort senseWaiting; // Total number of parmeter blocks waiting for autosense
|
|
SCSIInstr senseTIB[2]; // The TIB for autosense ($a * 2 = $14)
|
|
|
|
void (*MakeCallback)(); // pointer to the XPT layerÕs MakeCallback routine
|
|
Boolean defaultDisc; // true if we should default to disconnect allowed
|
|
uchar hostID; // Macintosh's (initiator's) SCSI ID on this bus
|
|
char unusedC8;
|
|
char unusedC9;
|
|
|
|
Boolean needNegot[8]; // array of flags (per target): needs negotiation
|
|
uchar syncRAoffset[8];// REQ/ACK offset (per target)
|
|
uchar syncPeriod[8]; // Transfer period factor (per target)
|
|
|
|
SIM_IO * discIOs[8][8]; // array of pointers to PBs that are disconnected
|
|
uchar LUNstate[8][8]; // array of flags for the state of a particular LUN (Disconnected, Frozen etc)
|
|
|
|
SIMTMTask mySIMTMTask; // time manager task queue entry (for timeouts)
|
|
|
|
SIMinitInfo * initInfo; // Saved SIM Init Info for re-registration
|
|
|
|
Ptr otherSIMg; // used on dual bus machines
|
|
|
|
long spares[19]; // extras to make patching easier
|
|
|
|
// SIM_IOs (should be at end to make Macsbugging easier)
|
|
|
|
SIM_IO sensePB; // A Parameter block to be used for a request sense
|
|
SIM_IO resetDevPB; //
|
|
SCSIAbortCommandPB abortPB; // A parameter block to timeout parameter blocks
|
|
|
|
} SIMglobals;
|
|
|
|
#define sizeofSIMGlobals (((sizeof(SIMglobals)-1)/16+1)*16)
|
|
|
|
|
|
//====== Bit definitions for SSMFlags field ======
|
|
|
|
#define kbSSMBusy 0
|
|
|
|
|
|
/******** Bit definitions for LUNstate field ********/
|
|
|
|
#define km_LUNdisconnected 0x01 /* LUN has disconnected */
|
|
#define km_LUNfrozen 0x02 /* LUN has been frozen */
|
|
|
|
|
|
/******** Fake Functions **********/
|
|
|
|
#define IdentifyMsg(a,b) (0x80+(a<<6)+(b))
|
|
|
|
#define IdentifyToLUN(a) ((a)&0x7)
|
|
|
|
#define FindUsedLUN(a,b) (SIMg->LUNstate[a][b])
|
|
|
|
#define ReconnectIO(a,b) {SIMg->discIOs[a][b] = 0 ; SIMg->LUNstate[a][b] &= ~km_LUNdisconnected;}
|
|
#define DisconnectIO(a,b,c) {SIMg->discIOs[a][b] = (c); SIMg->LUNstate[a][b] |= km_LUNdisconnected;}
|
|
|
|
#define DefrostLUN(a,b) SIMg->LUNstate[a][b] &= ~km_LUNfrozen;
|
|
#define FreezeLUN(a,b) SIMg->LUNstate[a][b] |= km_LUNfrozen;
|
|
|
|
#define CallHALaction( a, p, s) do { \
|
|
(p)->action = (a); \
|
|
((SIMg->HALinfo.HALaction)(p) ); } while (false)
|
|
|
|
#define CallHALResetBus( a) do { \
|
|
((SIMg->HALinfo.HALResetBus)(a) ); } while (false)
|
|
|
|
#define CallHALSyncConfig(o,p,h) do { \
|
|
((SIMg->HALinfo.HALSyncConfig)(o,p,h) ); } while (false)
|
|
|
|
#define CallHALAssertATN( a) do { \
|
|
((SIMg->HALinfo.HALAssertATN)(a) ); } while (false)
|
|
|
|
#define CallHALTeardownIO( i, h) do { \
|
|
((SIMg->HALinfo.HALTeardownIO)((i),(h))); } while (false)
|
|
|
|
/******** Some Basic Constants *********/
|
|
|
|
#define kHighestTarget 7 // <sm7>
|
|
#define kHighestLUN 7 // <sm7>
|
|
|
|
#define kHostID 7 // <sm7>
|
|
#define kMaxTransferType 1
|
|
|
|
#define SUPPORTED_scFlags ( \
|
|
scsiDirectionMask | \
|
|
scsiDisableAutosense | \
|
|
scsiCDBIsPointer | \
|
|
scsiDisableSyncData | \
|
|
scsiSIMQHead | \
|
|
scsiSIMQFreeze | \
|
|
scsiSIMQNoFreeze | \
|
|
scsiDoDisconnect | \
|
|
scsiDontDisconnect | \
|
|
scsiDataDMAready )
|
|
|
|
#define SUPPORTED_scIOFlags ( \
|
|
scsiNoParityCheck | \
|
|
scsiDisableSelectWAtn | \
|
|
scsiSavePtrOnDisconnect | \
|
|
scsiNoBucketIn | \
|
|
scsiNoBucketOut )
|
|
|
|
#define SUPPORTED_scDataTypes ( \
|
|
scsiBusDataTIB | \
|
|
scsiBusDataBuffer | \
|
|
scsiBusDataSG )
|
|
|
|
/******** Function Prototypes - Entry Points (called by XPT via SIMinitInfo) ********/
|
|
|
|
OSErr SIMinit (SIMinitInfo * SIMinfoPtr);
|
|
long SIM_ISR (SIMglobals * SIMg);
|
|
long SIMIntPoll (SIMglobals * SIMg);
|
|
void SIMaction (SIM_IO *ioPtr, SIMglobals * SIMg);
|
|
void NewOldCall( SIM_IO * ioPtr, SIMglobals * SIMg);
|
|
long SIMDualIntPoll(SIMglobals *SIMg);
|
|
|
|
/******** Function Prototypes - Internal to SIM ********/
|
|
|
|
void CallCompRoutine( SCSI_IO * ioPtr);
|
|
void ResetSIM( SIMglobals * SIMg);
|
|
void ReconnectEvent( HALactionPB * reconPBptr);
|
|
void ReconStartMachine( SIMglobals * SIMg);
|
|
void NewIOStartMachine( SIMglobals * SIMg);
|
|
void ReconnectISR( SIMglobals * SIMg);
|
|
Boolean TheMachine( OSErr * finalStatus, SIM_IO ** completedIO, SIMglobals * SIMg);
|
|
void StartTimer( SIMglobals * SIMg);
|
|
void SIMTimerProc( void);
|
|
Boolean CallBusInquiry( SIM_IO * ioPtr, SIMglobals * SIMg);
|
|
void CompleteIO( OSErr finalStatus, SIM_IO * ioPtr, SIMglobals * SIMg);
|
|
short BlockInterrupts(void);
|
|
void UnblockInterrupts( short oldSR);
|
|
void SetupResetPB( uchar TargetID, SIMglobals * SIMg );
|
|
OSErr ValidateDeviceIdent( DeviceIdent TargetID, SIMglobals * SIMg );
|
|
Boolean ValidatePB( SIM_IO *ioPtr, SIMglobals * SIMg );
|
|
void CallMachine(SIMglobals * SIMg);
|
|
extern SIM_IO * GetNextAutoSense( SIMglobals * SIMg);
|
|
|
|
|
|
#endif __SIMCOREPRIV__
|