mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-28 16:31:01 +00:00
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: <EFBFBD> 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<65>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__
|