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.
294 lines
11 KiB
C
294 lines
11 KiB
C
/*
|
|
File: SIMCore.h
|
|
|
|
Contains: header stuff for the core of the Apple SIM layer
|
|
|
|
Written by: Paul Wolf
|
|
|
|
Copyright: © 1992-1993 by Apple Computer, Inc., all rights reserved.
|
|
|
|
Change History (most recent first):
|
|
|
|
<SM25> 12/19/93 DCB Added hdshkRemainder to the ioPB. This is to help solve the
|
|
handshake across scatter gather boundries problem.
|
|
<SM24> 11/22/93 pdw Rolling in from <MCxx>.
|
|
<MC5> 11/8/93 pdw Added kHALselectedAsTargetFld error condition.
|
|
<SMG2> 9/29/93 chp Include some prerequisite headers if necessary.
|
|
<SM22> 10/29/93 DCB <MC> roll-in.
|
|
<MC3> 10/28/93 pdw Added equate for new action. Adding some globals.
|
|
<SM21> 10/14/93 pdw <MC> roll-in.
|
|
<MC2> 10/12/93 pdw Added support for Synchronous data transfers, rewrote State
|
|
Machine, message handling etc.
|
|
<SM20> 9/12/93 pdw Prototype maintenance.
|
|
<SM19> 9/9/93 pdw Lots of little changes. Name changes, temporary cache_bug
|
|
stuff.
|
|
<SM18> 7/17/93 pdw Lots of little things.
|
|
<SM17> 7/8/93 pdw Removing duplicate kMaxTransferType definition.
|
|
<SM16> 5/25/93 DCB Rollin from Ludwig. (The next item below)
|
|
<LW10> 5/21/93 PW Adding hwDescPtr field to HALinitInfo structure so HALinit can
|
|
get to it.
|
|
<SM15> 5/5/93 PW Converted names to meanies-friendly names. Updated with latest
|
|
from Ludwig stuff.
|
|
<LW9> 4/30/93 DCB Adding a HalInfo entry point to the HALInitInfo record.
|
|
<LW8> 4/29/93 DCB Fixing Build - Sorry bout that.
|
|
<LW7> 4/14/93 DCB Added SetParity HALAction and the ParityError ioEvent
|
|
<LW6> 3/26/93 PW Added kWastePhase and deleted kRejectingMsg.
|
|
<LW5> 3/1/93 DCB Changed definition of IOEvents to be flags and removed
|
|
scConnTimer because it isn't needed anymore.
|
|
<LW4> 2/17/93 PW Added GettingSCSIMsgIn state and savedResidLen field for fix to
|
|
SCSIMsgIn not dropping ACK bug and for bitbucketing bug.
|
|
<SM12> 1/31/93 PW Update from the latest of Ludwig. Also changes required for PDM
|
|
(will update Ludwig with these as needed myself).
|
|
<LW3> 1/27/93 PW Added scsiDataType field support and fields in SIM_IO for storing
|
|
ptrs to data and xfer routines. AddedSIMIntPoll routine support.
|
|
<LW2> 1/6/93 DCB Added kbUseDblBuffer bit to the SIMprivFlags field to fix SCSI
|
|
into NuBus bug. Radar Bug # 1059322.
|
|
<SM11> 12/5/92 PW Added kMaxTransferTypes stuff.
|
|
<SM10> 11/20/92 DCB Removed some include files to solve makefile dependency problems
|
|
<SM9> 10/30/92 DCB Adding HAL privates to the SIM_IO structure
|
|
<SM8> 10/8/92 PW Added stuff needed for variable-sized SCSI_IO support. Changed
|
|
some prototypes. Added support for the ioEvent field.
|
|
<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 __SIMCORE__
|
|
#define __SIMCORE__
|
|
|
|
#ifndef __MEMORY__
|
|
#include <Memory.h>
|
|
#endif
|
|
|
|
#ifndef __TIMER__
|
|
#include <Timer.h>
|
|
#endif
|
|
|
|
#ifndef __ACAM__
|
|
#include "ACAM.h"
|
|
#endif
|
|
|
|
|
|
/*********** HALaction operation selectors ************/
|
|
|
|
typedef enum { kInitiate =0, // 0
|
|
kBitBucket,
|
|
kDataIn,
|
|
kDataOut,
|
|
kAcceptMsg, // 4
|
|
kUnusedHALaction,
|
|
kunusedMI,
|
|
kSendMsgOut,
|
|
kStatus, // 8
|
|
kComplete,
|
|
kSaveDataPointer,
|
|
kModifyDataPointer,
|
|
kRestorePointers, // C
|
|
kGetReconnectInfo,
|
|
kGetSelectInfo,
|
|
kSelect,
|
|
kunused, // $10
|
|
kCommand,
|
|
kSetParity, // $12
|
|
kHandleSelected,
|
|
kNumHALaction, // keep last - MAKE SURE you modify HAL's Equ.a too
|
|
kHALactionsBogus =256 // force word length of enum
|
|
} HALactions;
|
|
|
|
|
|
typedef enum { kHALnoErr =0,
|
|
kHALselectFld, // initiate, select, select w/atn
|
|
kHALreselected, // we were reselected (maybe during an initiate)
|
|
kHALselectedAsTarget, // we were selected (maybe during an initiate)
|
|
kHALselectedAsTargetFld,// curio bug - they tried to select us and we hung
|
|
kHALnoCommand, // initiate
|
|
kHALpartialCommand, // initiate, command
|
|
kHALpartialMsgIn, // MsgIn
|
|
kHALmsgInDisconnected, // MsgIn
|
|
kHALpartialDataIn, // DataIn
|
|
kHALpartialDataOut, // DataOut
|
|
kHALpartialMsgOut, // MsgOut
|
|
kHALmsgOutDisconnected, // MsgOut
|
|
kHALreselectBogus, // GetReconnectInfo
|
|
kNumHALresult,
|
|
kHALresultBogus =256
|
|
} HALresult;
|
|
|
|
|
|
typedef enum { kPBidle = 0, // 0: in the queue, nothing yet
|
|
kAttemptingInitiation, // 1: arb-sel-identify in progress
|
|
kNexusEstablished, // 2: identify msg sent and received
|
|
kSentCommand, // 3: cdb sent
|
|
kDisconnected, // 4: cdb sent, disconnected
|
|
kCompleted, // 5: received status
|
|
kSelectComplete, // 6: SCSISelect complete
|
|
kNeedsSense, // 7: Waiting for the autosense parameter block
|
|
kGotSense, // 8: No Longer waiting for autosense parameter block
|
|
kDisconnectedB4Command, // 9: cdb sent, disconnected
|
|
kIOStatBogus = 256
|
|
} IOStat;
|
|
|
|
|
|
// A list of ioEvents which could affect the interpretation of errors in CompleteIO <LW5>
|
|
|
|
#define kmAborted 0x0001 // PB was aborted by an AbortCommand
|
|
#define kmTerminated 0x0002 // Hasta la Vista Baby!
|
|
#define kmBDRSent 0x0004 // Bus Device Reset was sent to the target
|
|
#define kmTimedOut 0x0008 // timed out
|
|
#define kmMsgSent 0x0010 // message was delivered to the target
|
|
#define kmMsgRejected 0x0020 // message rejected by target
|
|
#define kmBadParity 0x0040 // bad parity detected by initiator
|
|
#define kmAutoSense 0x0080 // Autosense has been executed
|
|
|
|
|
|
// Private error codes in ACAM defined range of error codes
|
|
|
|
enum {
|
|
privErrSelected = (scsiErrorBase+0x80), // -7808 =
|
|
scsiKillMsgRejected = (scsiErrorBase+0x81), // -7807 = Abort/Term/BDR msg rejected
|
|
lastPrivErr
|
|
};
|
|
|
|
|
|
|
|
// SIM layer privates in SCSI_IO PB -
|
|
// one big mega PB including the SCSI_IO from ACAM + the SIM's per-IO vars
|
|
|
|
typedef struct SIM_IO
|
|
{
|
|
SCSI_IO_Macro // the ACAM-specified SCSI_IO pb
|
|
|
|
Ptr SIMg; // ptr to SIM globals (needed for autosense compl. function)
|
|
ulong scTimer; // Timer current value (in seconds)
|
|
ushort hdshkRemainder; // Leftover handshake from previous SG element
|
|
uchar hdshkIndex; // The handshake element that the above remainder refers to
|
|
uchar rsrvd6; // reserved
|
|
ushort ioStat; // intermed. status of this guy
|
|
ushort ioEvent; // additional status to explain misc asynchronous events <SM??>
|
|
uchar firstError; // first error detected (saved for later use by CompleteIO)
|
|
uchar SIMprivFlags; // SIM private flags (for this PB)
|
|
ushort rsrvd7; // reserved <SM5?>
|
|
Ptr pendingMsgPB; // ParameterBlock for an Async operation to be undertaken ASAP <SM10>
|
|
Ptr currentSGptr; // current data ptr (to SG entry)
|
|
ulong currentSGcount; // current count (withing SG entry)
|
|
Ptr savedSGptr; // saved data ptr (to SG entry)
|
|
ulong savedSGcount; // saved count (withing SG entry)
|
|
Ptr ioQueue; // the queue that this PB has been enqueued in <SM4>
|
|
OSErr savedResult; // the final result of the PB (placed in scsiResult only after autosense has been executed)
|
|
ushort rsrvd8;
|
|
MemoryBlock logical; // The logical address of the current user buffer <SM9>
|
|
MemoryBlock physical; // The physical address of the current user buffer <SM9>
|
|
long dataRoutine; // data desc interp. routine to use for this I/O
|
|
long xferRoutine; // data transfer routine to use for this I/O
|
|
long savedResidLen; // saved (not current) residual length
|
|
ulong transLogEnd; // end of cached translation (logical addr)
|
|
} SIM_IO;
|
|
|
|
|
|
|
|
/*********** HALaction Parameter Block ************/
|
|
|
|
typedef struct { // note: '->' == to HAL, '<-' == from HAL to SSM
|
|
// The first two fields remain constant throughout the connection
|
|
uchar * HALstaticPtr; // -> alloc. ptr to the HAL's static vars
|
|
SIM_IO * ioPtr; // -> primarily for Initiate
|
|
|
|
short action; // -> what to do
|
|
OSErr result; // <- error
|
|
ushort selectorID; // <- used for reconnect
|
|
short unused;
|
|
|
|
Boolean sendCDB; // -> flag = send CDB during initiate
|
|
uchar phase; // <- current phase
|
|
uchar msgInLen; // <> number of msg in bytes
|
|
uchar msgOutLen; // <> number of msg out bytes
|
|
|
|
uchar msg[8]; // <> spot to store 8 byte msg in/out
|
|
|
|
} HALactionPB;
|
|
|
|
|
|
// Flags for HALactionPB flags field
|
|
|
|
|
|
|
|
// Flags for SIMprivFlags field
|
|
|
|
enum {
|
|
kbDataDone = 0, // scatter/gather list has been exhausted
|
|
kbSetupComplete = 1, // buffer(s) in this PB are setup for DMA
|
|
kbUseDblBuffer = 2, // buffer was not lockable/DMAable (NuBus Space)
|
|
kbBitBucketed = 3, // we were forced to bit bucket
|
|
kbUseDirectDMA = 4 // use direct DMA during data transfer
|
|
};
|
|
#define kmDataDone (1<<kbDataDone)
|
|
#define kmSetupComplete (1<<kbSetupComplete)
|
|
#define kmUseDblBuffer (1<<kbUseDblBuffer)
|
|
#define kmBitBucketed (1<<kbBitBucketed)
|
|
#define kmUseDirectDMA (1<<kbUseDirectDMA)
|
|
|
|
|
|
// Assorted defines
|
|
|
|
#define dtQElSize 20
|
|
|
|
|
|
/*********** SIMRegisterHAL parameter block ************/
|
|
|
|
typedef struct { // directions (<->) are for SIMRegisterHAL call
|
|
uchar * HALstaticPtr; // <- alloc. ptr to the HAL's static vars
|
|
long staticSize; // -> num bytes HAL needs for static vars
|
|
long (*HALinit)(); // -> pointer to the HAL init routine
|
|
void (*HALaction)(HALactionPB * halPBptr); // -> pointer to the HAL action routine
|
|
|
|
long (*HAL_ISR)(); // -> pointer to the HAL ISR routine
|
|
long (*HALIntPoll)(); // -> pointer to the HAL interrupt poll routine
|
|
long (*HALBusInquiry)(); // -> pointer to the HAL Info routine
|
|
void (*HALResetBus)(void * HALg); // -> pointer to the HAL ResetBus routine
|
|
|
|
void (*HALAssertATN)(void * HALg);
|
|
void (*HALTeardownIO)(SIM_IO * ioPtr, uchar * HALg);
|
|
void (*HALSyncConfig)(long, long, void * HALg);
|
|
void (*unusedV)(void * HALg);
|
|
|
|
uchar syncRAoffset; // -> REQ/ACK offset to use for sync negotiation
|
|
uchar minPeriodFactor; // -> min transfer period to request in SDTR
|
|
Boolean HBAisSync; // ->
|
|
Boolean HBAisFast; // ->
|
|
Boolean oldCallCapable; // -> true if this HAL can handle old-API calls
|
|
Boolean usesThreshold8; // ->
|
|
ushort busID; // <- bus number for the registered bus
|
|
void (*ReconnectISR)(); // <- to make ReconnectISR call
|
|
void (*XPT_ISR)(); // <- ptr to the XPT ISR
|
|
|
|
uchar * SIMstaticPtr; // <- so SSM callback has its globals
|
|
void * hwDescPtr; // -- for use by HAL only
|
|
long supported_scFlags; //
|
|
short supported_scIOFlags; //
|
|
short supported_scDataTypes; //
|
|
|
|
} HALinitInfo;
|
|
|
|
|
|
/******** Function Prototypes - Entry Points (called by XPT directly) ********/
|
|
|
|
OSErr SIMRegisterHAL (HALinitInfo *HALinfo);
|
|
OSErr SIMReregisterHAL (HALinitInfo *HALinfo);
|
|
void SIMDeregisterHAL (ushort busID);
|
|
|
|
|
|
/********** Timeout Stuff **********/
|
|
|
|
typedef struct simtmtask {
|
|
TMTask theTask;
|
|
Ptr SIMg;
|
|
} SIMTMTask;
|
|
|
|
|
|
#endif __SIMCORE__
|