sys7.1-doc-wip/OS/SCSIMgr4pt3/ACAM.h

792 lines
36 KiB
C
Raw Normal View History

2019-07-27 14:37:48 +00:00
/*******************************************************************************
File: ACAM.h
Contains:
This file contains constants and data structures that will be used by
drivers to interface with the SCSI Manager 4.3.
Written by:
Jonathan Abilay Blue I/O
Paul Wolf MHD/Drivers NT
Henry Kannapell ARIOSO Dude
Clinton Bauder MHD/Drivers NT
Matthew Nelson RISC
Copyright: © 1992-1994 by Apple Computer, Inc., all rights reserved.
Change History (most recent first):
<SM22> 2/2/94 DCB Adding another bit to SCSIWeirdStuff - this time to indicate a
need for scsiHandshaking.
<SM21> 2/1/94 DCB Added scsiBusErrorsUnsafe constant for the scsiWeirdStuff field.
<SM20> 11/22/93 pdw Rolling in from <MCxx>.
<MC4> 11/11/93 pdw Added scsiWeirdStuff field to BusInquiry along with its bits.
<MC3> 11/9/93 pdw Added scsiIdentifyMessageRejected error code.
<SMG2> 9/29/93 chp Standardized conditional inclusion and removed redundancies with
Types.h, which is included.
<SM18> 10/14/93 pdw Added scsiWrongDirection and scsibXXX flag enums.
<SM17> 7/17/93 pdw IMPORTANT!!! Changed the SCM to SIM in the comment about
ReleaseQ (i.e. SIM Q vs. SCM Q).
<SM16> 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.
<SM15> 5/5/93 PW Converted names to meanies-friendly names. Updated with latest
from Ludwig stuff.
<LW11> 5/1/93 PW Realigning tabs that got screwed up during massive name changes
(on previous checkin). Changing xxxResidualLength to
xxxResidual.
<LW9> 4/14/93 DCB Fixed the glue for register bus and re-register bus. Also added
syncRenegotiateSense flags for third party SIMs.
<SM14> 3/23/93 PW Added scsiInitiateWide bit and reserved some async callback
flags for 3rd-parties.
<LW8> 3/26/93 PW Making scsiDriver field a signed short instead of unsigned short.
Changed busOldAPICapable to scsiBusOldCallCapable.
<SM13> 3/20/93 PW Rolled in Ludwig changes.
<LW7> 3/1/93 DCB Changed scsiConnectionTimeout to reserved since it isn't needed anymore.
<LW6> 3/1/93 PW Added LoadDrivers function code and removed some unnecessary
flags from scsiScanFlags byte.
<LW5> 2/17/93 PW Added scsiBusNotFree bit to scsiResultFlags field.
<SM12> 2/1/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 Adding a couple of fields to Bus Inquiry.
<LW3> 1/27/93 PW Added temporary hack to keep people's A10 drivers working.
<LW2> 1/27/93 PW Removed enums on flags and added enum to A089 selectors. Added
a spare long to header and added scsiDataTypes field.
<SM11> 12/9/92 PW Rearranged error codes - broke them up into 3 ranges: execution
failed, could not start and parameter error. Removed
scsiDoVirtualMap flag.
<SM10> 12/5/92 PW Changed VUflags to IOflags and changed RefNum function names.
<SM9> 11/20/92 DCB Adding support for interleaving, changed some #defines to enums
and removed recorder stuff.
<SM8> 10/30/92 DCB Moved completion routine to header
<SM7> 10/30/92 DCB Various changes in to reflect the results of the SCSI Sync
meeting
<SM6> 10/8/92 PW Whole loads of name changes (fields, flags and errors). Some
realignment and some new fields.
<SM5> 9/17/92 PW Slight changes to some names. Removed much unused garbage.
<SM4> 8/31/92 DCB Added ioQ Field to the SCSI_IO parameter block to simplify Q
management.
<SM3> 8/30/92 DCB Added pending IO field to SCSI_IO, also changed the names for
Terminate, Abort and Reset Device.
<SM2> 8/20/92 DCB Added Select w/o Atn flag
--------------------------------- SCSI Manager Header File
--- S C S I M A N A G E R --- Version 4.3
---------------------------------
*******************************************************************************/
#ifndef __ACAM__
#define __ACAM__
#ifndef __TYPES__
#include <Types.h>
#endif
#ifndef __TRAPS__
#include <Traps.h>
#endif
#define scsiVERSION 43
/********************************************************************/
// Defines for the SCSIMgr function codes
/********************************************************************/
enum // <SM9> changed to enums as per design review
{
//------------ Common Functions ------------
SCSINop = 0x00, // Execute nothing
SCSIExecIO = 0x01, // Execute the specified IO
SCSIBusInquiry = 0x03, // Get parameters for entire path of HBAs
SCSIReleaseQ = 0x04, // Release the frozen SIM queue for particular LUN
SCSISetAsyncCallback = 0x05, // Set async event call back
//------------ Control Functions ------------
SCSIAbortCommand = 0x10, // Abort the selected Control Block
SCSIResetBus = 0x11, // Reset the SCSI bus
SCSIResetDevice = 0x12, // Reset the SCSI device
SCSITerminateIO = 0x13, // Terminate any pending IO
//------------ Target Mode Functions ------------
SCSIEnableLUN = 0x30, // Enable LUN, Target mode support
SCSITargetIO = 0x31, // Execute the target IO request
//------------ Apple Added ------------
SCSIGetVirtualIDInfo = 0x80, // Find out which bus old ID is on
SCSIGenerateInterleaveID = 0x81, // Generate a new interleave factor <SM9> pdw
SCSILoadDriver = 0x82, // Load a driver for a device ident. <LW6> DCB
SCSIOldCall = 0x84, // XPT->SIM private call for old-API
SCSICreateRefNumXref = 0x85, // Register a DeviceIdent to drvr RefNum xref
SCSILookupRefNumXref = 0x86, // Get DeviceIdent to drvr RefNum xref
SCSIRemoveRefNumXref = 0x87, // Remove a DeviceIdent to drvr RefNum xref
SCSIRegisterWithNewXPT = 0x88 // XPT has changed - SIM needs to re-register itself
//------------ 3rd-party Vendor Unique ------------
// 0xC0 thru 0xFF
};
/********************************************************************/
/* SCSI Parameter Block Elements */
/********************************************************************/
typedef pascal void (*CallbackProc) (void * ioPtr); // <SM6> pdw
//————— Allocation length defines for some of the fields ————— <SM9>
#define handshakeDataLength 8 // Handshake data length
#define maxCDBLength 16 // Space for the CDB bytes/pointer
#define vendorIDLength 16 // ASCII string len for Vendor ID
//————— Define DeviceIdent structure —————
typedef struct DeviceIdent
{
uchar diReserved; // reserved
uchar bus; // SCSI - Bus #
uchar targetID; // SCSI - Target SCSI ID
uchar LUN; // SCSI - LUN
} DeviceIdent;
//————— Command Descriptor Block structure —————
typedef union CDB
{
uchar * cdbPtr; // ptr to the CDB bytes to send, or…
uchar cdbBytes[ maxCDBLength ]; // actual CDB to send <SM6> pdw
} CDB, *CDBPtr;
//————— Scatter/gather list element —————
typedef struct SGRecord
{
Ptr SGAddr;
ulong SGCount;
} SGRecord;
/********************************************************************/
/* SCSI Parameter Block Definitions */
/********************************************************************/
//====== Common SCSI PB header fields macro ======
#define SCSIPBHdr \
struct SCSIHdr * qLink; /* (internal) Q link to next PB */ \
short scsiReserved1; /* -> reserved for input */ \
ushort scsiPBLength; /* -> Length of the entire PB */ \
uchar scsiFunctionCode; /* -> function selector */ \
uchar scsiReserved2; /* <- reserved for output */ \
OSErr scsiResult; /* <- Returned result */ \
DeviceIdent scsiDevice; /* -> Device Identifier (bus+target+lun)*/ \
CallbackProc scsiCompletion; /* -> Callback on completion function */ \
ulong scsiFlags; /* -> assorted flags */ \
uchar * scsiDriverStorage; /* <> Ptr for driver private use */ \
Ptr scsiXPTprivate; /* private field for use in XPT */ \
long scsiReserved3; /* reserved */
// end of SCSIPBHdr
//—————————————— SCSI PB Header ——————————————
typedef struct SCSIHdr
{
SCSIPBHdr
} SCSIHdr;
typedef struct SCSI_PB
{
SCSIPBHdr
} SCSI_PB;
//—————————————— SCSI I/O Request PB —————————————— <SM6> pdw from prev <SM6>
#define SCSI_IO_Macro \
SCSIPBHdr /* Header information fields */ \
ushort scsiResultFlags; /* <- Flags which modify the scsiResult field */ \
ushort scsiInterleaveID; /* -> used to designate interleavability of request */ \
uchar * scsiDataPtr; /* -> Pointer to the data buffer or the S/G list */ \
ulong scsiDataLength; /* -> Data transfer length */ \
uchar * scsiSensePtr; /* -> Ptr to autosense data buffer */ \
uchar scsiSenseLength; /* -> size of the autosense buffer */ \
uchar scsiCDBLength; /* -> Number of bytes for the CDB */ \
ushort scsiSGListCount; /* -> num of scatter gather list entries */ \
ulong scsiReserved4; /* <- reserved for output */ \
uchar scsiSCSIstatus; /* <- Returned scsi device status */ \
char scsiSenseResidual; /* <- Autosense residual length */ \
ushort scsiReserved5; /* <- reserved for output */ \
long scsiDataResidual; /* <- Returned Transfer residual length */ \
CDB scsiCDB; /* -> Actual CDB or pointer to CDB */ \
long scsiTimeout; /* -> Timeout value (Time Mgr format) (CAM timeout) */ \
uchar * scsiMessagePtr; /* -> Pointer to the message buffer -target md only */ \
ushort scsiMessageLen; /* -> Num of bytes in the msg bfr -target md only */ \
ushort scsiIOFlags; /* -> additional I/O flags */ \
uchar scsiTagAction; /* -> What to do for tag queuing */ \
uchar scsiReserved6; /* -> reserved for input */ \
ushort scsiReserved7; /* -> reserved for input */ \
ushort scsiSelectTimeout; /* -> Select timeout value */ \
uchar scsiDataType; /* -> Data description type (i.e. buffer, TIB, S/G) */ \
uchar scsiTransferType; /* -> Transfer type (i.e. Blind vs Polled) */ \
ulong scsiReserved8; /* -> reserved for input */ \
ulong scsiReserved9; /* -> reserved for input */ \
ushort scsiHandshake[handshakeDataLength]; /* -> handshaking points (null term'd) */ \
ulong scsiReserved10; /* -> reserved for input */ \
ulong scsiReserved11; /* -> reserved for input */ \
struct SCSI_IO *scsiCommandLink; /* -> Ptr to the next PB in linked cmd chain */ \
\
uchar scsiSIMpublics[8]; /* -> reserved for input to 3rd-party SIMs */ \
uchar scsiAppleReserved6[8]; /* -> reserved for input */ \
\
/* XPT layer privates (for old-API emulation) */ \
\
ushort scsiCurrentPhase; /* <- phase upon completing old call */ \
short scsiSelector; /* -> selector specified in old calls */ \
OSErr scsiOldCallResult; /* <- result of old call */ \
uchar scsiSCSImessage; /* <- Returned scsi device message (for SCSIComplete)*/ \
uchar XPTprivateFlags; /* <> various flags */ \
uchar XPTextras[12]; /* */
// end of SCSI_IO_Macro
typedef struct SCSI_IO
{
SCSI_IO_Macro
} SCSI_IO;
// <SM6> pdw from prev <SM6>
#define SCSIExecIOPB SCSI_IO
//—————————————— Bus inquiry PB ——————————————
typedef struct SCSIBusInquiryPB
{
SCSIPBHdr // Header information fields
ushort scsiEngineCount; // <- Number of engines on HBA
ushort scsiMaxTransferType; // <- Number of transfer types for this HBA
ulong scsiDataTypes; // <- which data types are supported by this SIM
ushort scsiIOpbSize; // <- Size of SCSI_IO PB for this SIM/HBA <SM6> pdw
ushort scsiMaxIOpbSize; // <- Size of max SCSI_IO PB for all SIM/HBAs <SM6> pdw
ulong scsiFeatureFlags; // <- Supported features flags field
uchar scsiVersionNumber; // <- Version number for the SIM/HBA
uchar scsiHBAInquiry; // <- Mimic of INQ byte 7 for the HBA
uchar scsiTargetModeFlags; // <- Flags for target mode support
uchar scsiScanFlags; // <- Scan related feature flags
ulong scsiSIMPrivatesPtr; // <- Ptr to SIM private data area
ulong scsiSIMPrivatesSize; // <- Size of SIM private data area
ulong scsiAsyncFlags; // <- Event cap. for Async Callback
uchar scsiHiBusID; // <- Highest path ID in the subsystem
uchar scsiInitiatorID; // <- ID of the HBA on the SCSI bus
ushort scsiBIReserved0;
ulong scsiBIReserved1; // <-
ulong scsiFlagsSupported; // <- which scsiFlags are supported
ushort scsiIOFlagsSupported; // <- which scsiIOFlags are supported
ushort scsiWeirdStuff; // <-
ushort scsiMaxTarget; // <- maximum Target number supported
ushort scsiMaxLUN; // <- maximum Logical Unit number supported
char scsiSIMVendor[ vendorIDLength ]; // <- Vendor ID of SIM (or XPT if bus<FF) <SM6> pdw
char scsiHBAVendor[ vendorIDLength ]; // <- Vendor ID of the HBA <SM6> pdw
char scsiControllerFamily[ vendorIDLength ]; // <- Family of SCSI Controller
char scsiControllerType[ vendorIDLength ]; // <- Specific Model of SCSI Controller used
char scsiXPTversion[4]; // <- version number of XPT
char scsiSIMversion[4]; // <- version number of SIM
char scsiHBAversion[4]; // <- version number of HBA
uchar scsiHBAslotType; // <- type of "slot" that this HBA is in
uchar scsiHBAslotNumber; // <- slot number of this HBA
ushort scsiSIMsRsrcID; // <- resource ID of this SIM
ushort scsiBIReserved3; // <-
ushort scsiAdditionalLength; // <- additional BusInquiry PB len
} SCSIBusInquiryPB;
//—————————————— Abort SIM Request PB ——————————————
typedef struct SCSIAbortCommandPB
{
SCSIPBHdr // Header information fields
SCSI_IO * scsiIOptr; // Pointer to the PB to abort
} SCSIAbortCommandPB; // <SM3>
//—————————————— Terminate I/O Process Request PB ——————————————
typedef struct SCSITerminateIOPB
{
SCSIPBHdr // Header information fields
SCSI_IO * scsiIOptr; // Pointer to the PB to terminate
} SCSITerminateIOPB; // <SM3>
//—————————————— Reset SCSI Bus PB ——————————————
typedef struct SCSIResetBusPB
{
SCSIPBHdr // Header information fields
} SCSIResetBusPB; // <SM3>
//—————————————— Reset SCSI Device PB ——————————————
typedef struct SCSIResetDevicePB
{
SCSIPBHdr // Header information fields
} SCSIResetDevicePB; // <SM3>
//—————————————— Release SIM Queue PB ——————————————
typedef struct SCSIReleaseQPB
{
SCSIPBHdr // Header information fields
} SCSIReleaseQPB;
//—————————————— Set Async Event Callback PB ——————————————
typedef struct SCSISetAsyncCallbackPB
{
SCSIPBHdr // Header information fields
ulong scsiEventFlags; // -> events to be notified of
void (*scsiEventCallback)(); // -> routine to call when event occurs
uchar * scsiEventInfoPtr; // -> ptr to buffer for additional info
uchar scsiEventInfoLen; // -> length of buffer
uchar scsiReserved11; //
ushort scsiReserved12; //
} SCSISetAsyncCallbackPB;
//—————————————— SCSI Get Virtual ID Info PB —————————————— <SM6> pdw
typedef struct SCSIGetVirtualIDInfoPB
{
SCSIPBHdr // Header information fields
ushort scsiOldCallID; // -> SCSI ID of device in question
Boolean scsiExists; // <- true if device exists
} SCSIGetVirtualIDInfoPB;
//—————————————— SCSI Generate Interleave ID PB —————————————— <SM6> pdw
typedef struct SCSIGenerateInterleaveIDPB
{
SCSIPBHdr // Header information fields
ushort scsiInterleaveID; // <- SCSI ID of device in question
ushort scsiReserved13; //
} SCSIGenerateInterleaveIDPB;
//—————————————— Create/Lookup/Remove RefNum for Device PB ——————————————
typedef struct SCSI_Driver_PB
{
SCSIPBHdr // Header information fields
short scsiDriver; // -> DriverRefNum, For SetDriver
// <- For GetNextDriver
ushort scsiDriverFlags; // <> Details of driver/device
DeviceIdent scsiNextDevice; // <- DeviceIdent of the NEXT Item in the list
} SCSI_Driver_PB;
//—————————————— Load Driver PB —————————————— <LW6> DCB
typedef struct SCSILoadDriverPB
{
SCSIPBHdr // Header information fields
short scsiLoadedRefNum; // <- SIM returns refnum of driver
Boolean scsiDiskLoadFailed; // -> if true, indicates call after failure to load
} SCSILoadDriverPB; //
//======================================================================
/******************************************************************************/
// Values for the fields in SCSI PBs
/******************************************************************************/
//———————————————————————————————————————————————————————————————————————————————————
// Defines for the scsiTransferType field
//———————————————————————————————————————————————————————————————————————————————————
enum {
scsiTransferBlind = 0,
scsiTransferPolled
};
//———————————————————————————————————————————————————————————————————————————————————
// Defines for the scsiDataType field
//———————————————————————————————————————————————————————————————————————————————————
enum {
scsiDataBuffer = 0, // single contiguous buffer supplied
scsiDataTIB = 1, // TIB supplied (ptr in scsiDataPtr)
scsiDataSG = 2 // scatter/gather list supplied
};
//———————————————————————————————————————————————————————————————————————————————————
// Defines for the SCSIMgr scsiResult field in the PB header.
// $E100 thru E1FF
// -$1EFF thru -1E00
// -#7935 thru -7681
//———————————————————————————————————————————————————————————————————————————————————
#define scsiErrorBase -7936 // = 0xE100
enum { // <SM9> changed to enums
scsiRequestInProgress = 1, // 1 = PB request is in progress
// Execution failed 00-2F
scsiRequestAborted = (scsiErrorBase+0x02), // -7934 = PB request aborted by the host
scsiUnableToAbort = (scsiErrorBase+0x03), // -7933 = Unable to Abort PB request
scsiNonZeroStatus = (scsiErrorBase+0x04), // -7932 = PB request completed with an err
scsiUnused05 = (scsiErrorBase+0x05), // -7931 =
scsiUnused06 = (scsiErrorBase+0x06), // -7930 =
scsiUnused07 = (scsiErrorBase+0x07), // -7929 =
scsiUnused08 = (scsiErrorBase+0x08), // -7928 =
scsiUnableToTerminate = (scsiErrorBase+0x09), // -7927 = Unable to Terminate I/O PB req
scsiSelectTimeout = (scsiErrorBase+0x0A), // -7926 = Target selection timeout
scsiCommandTimeout = (scsiErrorBase+0x0B), // -7925 = Command timeout
scsiIdentifyMessageRejected = (scsiErrorBase+0x0C), // -7924 =
scsiMessageRejectReceived = (scsiErrorBase+0x0D), // -7923 = Message reject received
scsiSCSIBusReset = (scsiErrorBase+0x0E), // -7922 = SCSI bus reset sent/received
scsiParityError = (scsiErrorBase+0x0F), // -7921 = Uncorrectable parity error occured
scsiAutosenseFailed = (scsiErrorBase+0x10), // -7920 = Autosense: Request sense cmd fail
scsiUnused11 = (scsiErrorBase+0x11), // -7919 =
scsiDataRunError = (scsiErrorBase+0x12), // -7918 = Data overrun/underrun error
scsiUnexpectedBusFree = (scsiErrorBase+0x13), // -7917 = Unexpected BUS free
scsiSequenceFailed = (scsiErrorBase+0x14), // -7916 = Target bus phase sequence failure
scsiWrongDirection = (scsiErrorBase+0x15), // -7915 = Data phase was in unexpected direction
scsiUnused16 = (scsiErrorBase+0x16), // -7914 =
scsiBDRsent = (scsiErrorBase+0x17), // -7913 = A SCSI BDR msg was sent to target
scsiTerminated = (scsiErrorBase+0x18), // -7912 = PB request terminated by the host
scsiNoNexus = (scsiErrorBase+0x19), // -7911 = Nexus is not established
scsiCDBReceived = (scsiErrorBase+0x1A), // -7910 = The SCSI CDB has been received
// Couldn't begin execution 30-3F
scsiTooManyBuses = (scsiErrorBase+0x30), // -7888 = Register failed because we're full
scsiBusy = (scsiErrorBase+0x31), // -7887 = SCSI subsystem is busy
scsiProvideFail = (scsiErrorBase+0x32), // -7886 = Unable to provide requ. capability
scsiDeviceNotThere = (scsiErrorBase+0x33), // -7885 = SCSI device not installed/there
scsiNoHBA = (scsiErrorBase+0x34), // -7884 = No HBA detected Error
scsiDeviceConflict = (scsiErrorBase+0x35), // -7883 = sorry, max 1 refNum per DeviceIdent
scsiNoSuchXref = (scsiErrorBase+0x36), // -7882 = no such RefNum xref
scsiQLinkInvalid = (scsiErrorBase+0x37), // -7881 = pre-linked PBs not supported // <LW14> pdw Fß
// Parameter errors 40-7F
scsiPBLengthError = (scsiErrorBase+0x40), // -7872 = length (scsiPBLength) is insuf'ct/invalid
scsiFunctionNotAvailable = (scsiErrorBase+0x41), // -7871 = The requ. func is not available
scsiRequestInvalid = (scsiErrorBase+0x42), // -7970 = PB request is invalid
scsiBusInvalid = (scsiErrorBase+0x43), // -7969 = Bus ID supplied is invalid
scsiTIDInvalid = (scsiErrorBase+0x44), // -7868 = Target ID supplied is invalid
scsiLUNInvalid = (scsiErrorBase+0x45), // -7867 = LUN supplied is invalid
scsiIIDInvalid = (scsiErrorBase+0x46), // -7866 = The initiator ID is invalid
scsiDataTypeInvalid = (scsiErrorBase+0x47), // -7865 = scsiDataType requested is not supported
scsiTransferTypeInvalid = (scsiErrorBase+0x48), // -7864 = scsiTransferType field is too high
scsiCDBLengthInvalid = (scsiErrorBase+0x49) // -7863 = scsiCDBLength field is too big
};
#define scsiExecutionErrors scsiErrorBase
#define scsiNotExecutedErrors scsiTooManyBuses
#define scsiParameterErrors scsiPBLengthError
//———————————————————————————————————————————————————————————————————————————————————
// Defines for the scsiResultFlags field
//———————————————————————————————————————————————————————————————————————————————————
#define scsiSIMQFrozen 0x0001 // The SIM queue is frozen w/this err
#define scsiAutosenseValid 0x0002 // Autosense data valid for target
#define scsiBusNotFree 0x0004 // At time of callback, SCSI bus is not free
//———————————————————————————————————————————————————————————————————————————————————
// Defines for the scsiFlags field in the PB header for the SCSIExecIO function
//———————————————————————————————————————————————————————————————————————————————————
enum
{
// 1st Byte
scsibDisableAutosense = 29, // Disable auto sense feature
scsibFlagReservedA = 28, //
scsibFlagReserved0 = 27, //
scsibCDBLinked = 26, // The PB contains a linked CDB
scsibQEnable = 25, // Target queue actions are enabled
scsibCDBIsPointer = 24, // The CDB field contains a pointer
// 2nd Byte
scsibFlagReserved1 = 23, //
scsibInitiateSyncData = 22, // Attempt Sync data xfer and SDTR
scsibDisableSyncData = 21, // Disable sync, go to async
scsibSIMQHead = 20, // Place PB at the head of SIM Q
scsibSIMQFreeze = 19, // Return the SIM Q to frozen state
scsibSIMQNoFreeze = 18, // Disallow SIM Q freezing
scsibDoDisconnect = 17, // Definitely do disconnect
scsibDontDisconnect = 16, // Definitely don't disconnect
// 3rd Byte
scsibFlagReserved3 = 15, //
scsibDataDMAready = 14, // Data buffer(s) are ready for DMA
scsibDataPhysical = 13, // SG/Buffer data ptrs are physical
scsibSensePhysical = 12, // Autosense buffer ptr is physical
scsibFlagReserved5 = 11, //
scsibFlagReserved6 = 10, //
scsibFlagReserved7 = 9, //
scsibFlagReserved8 = 8, //
// 4th Byte - Target Mode Flags
scsibDataBufferValid = 7, // Data buffer valid
scsibStatusBufferValid = 6, // Status buffer valid
scsibMessageBufferValid = 5, // Message buffer valid
scsibFlagReserved9 = 4, //
scsibTargetPhaseMode = 3, // The SIM will run in phase mode
scsibTargetPBAvail = 2, // Target PB available
scsibDisableAutoDisconnect = 1, // Disable autodisconnect
scsibDisableAutoSaveRestore = 0 // Disable autosave/restore ptrs
};
// 1st Byte
#define scsiDirectionMask 0xC0000000 // Data direction mask
#define scsiDirectionNone 0xC0000000 // Data direction (11: no data)
#define scsiDirectionReserved 0x00000000 // Data direction (00: reserved)
#define scsiDirectionOut 0x80000000 // Data direction (10: DATA OUT)
#define scsiDirectionIn 0x40000000 // Data direction (01: DATA IN)
#define scsiDisableAutosense 0x20000000 // Disable auto sense feature
#define scsiFlagReservedA 0x10000000 //
#define scsiFlagReserved0 0x08000000 //
#define scsiCDBLinked 0x04000000 // The PB contains a linked CDB
#define scsiQEnable 0x02000000 // Target queue actions are enabled
#define scsiCDBIsPointer 0x01000000 // The CDB field contains a pointer
// 2nd Byte
#define scsiFlagReserved1 0x00800000 //
#define scsiInitiateSyncData 0x00400000 // Attempt Sync data xfer and SDTR
#define scsiDisableSyncData 0x00200000 // Disable sync, go to async
#define scsiSIMQHead 0x00100000 // Place PB at the head of SIM Q
#define scsiSIMQFreeze 0x00080000 // Return the SIM Q to frozen state
#define scsiSIMQNoFreeze 0x00040000 // Disallow SIM Q freezing
#define scsiDoDisconnect 0x00020000 // Definitely do disconnect
#define scsiDontDisconnect 0x00010000 // Definitely don't disconnect
// 3rd Byte
#define scsiFlagReserved3 0x00008000 //
#define scsiDataDMAready 0x00004000 // Data buffer(s) are ready for DMA
#define scsiDataPhysical 0x00002000 // SG/Buffer data ptrs are physical
#define scsiSensePhysical 0x00001000 // Autosense buffer ptr is physical
#define scsiFlagReserved5 0x00000800 //
#define scsiFlagReserved6 0x00000400 //
#define scsiFlagReserved7 0x00000200 //
#define scsiFlagReserved8 0x00000100 //
// 4th Byte - Target Mode Flags
#define scsiDataBufferValid 0x00000080 // Data buffer valid
#define scsiStatusBufferValid 0x00000040 // Status buffer valid
#define scsiMessageBufferValid 0x00000020 // Message buffer valid
#define scsiFlagReserved9 0x00000010 //
#define scsiTargetPhaseMode 0x00000008 // The SIM will run in phase mode
#define scsiTargetPBAvail 0x00000004 // Target PB available
#define scsiDisableAutoDisconnect 0x00000002 // Disable autodisconnect
#define scsiDisableAutoSaveRestore 0x00000001 // Disable autosave/restore ptrs
#define scsiTargetModeFlagsMask 0x000000FF // all of the target mode bits
//————————————————————————————————————————
// scsiIOFlags
//————————————————————————————————————————
#define scsiNoParityCheck 0x0002 // disable parity checking
#define scsiDisableSelectWAtn 0x0004 // disable select w/Atn
#define scsiSavePtrOnDisconnect 0x0008 // do SaveDataPointer upon Disconnect msg
#define scsiNoBucketIn 0x0010 // dont bit bucket in during this I/O
#define scsiNoBucketOut 0x0020 // dont bit bucket out during this I/O
#define scsiDisableWide 0x0040 // disable wide transfer negotiation
#define scsiInitiateWide 0x0080 // initiate wide transfer negotiation
#define scsiRenegotiateSense 0x0100 // renegotiate sync/wide before issuing autosense
#define scsiIOFlagReserved0080 0x0080 //
#define scsiIOFlagReserved8000 0x8000 //
//——————————————————————————————————————————————————————————————————————
// Defines for the SIM/HBA queue actions. These values are used in the
// SCSIExecIOPB, for the queue action field. [These values should match the
// defines from some other include file for the SCSI message phases. We may
// not need these definitions here. ]
enum {
scsiSimpleQTag = 0x20, // Tag for a simple queue
scsiHeadQTag = 0x21, // Tag for head of queue
scsiOrderedQTag = 0x22 // Tag for ordered queue
};
//——————————————————————————————————————————————————————————————————————
// Defines for the Bus Inquiry PB fields.
//——————————————————————————————————————————————————————————————————————
// scsiHBAInquiry field bits
#define scsiBusMDP 0x80 // Supports Modify Data Pointer message
#define scsiBusWide32 0x40 // Supports 32 bit wide SCSI
#define scsiBusWide16 0x20 // Supports 16 bit wide SCSI
#define scsiBusSDTR 0x10 // Supports Sync Data Transfer Req message
#define scsiBusLinkedCDB 0x08 // Supports linked CDBs
#define scsiBusTagQ 0x02 // Supports tag queue message
#define scsiBusSoftReset 0x01 // Supports soft reset
// scsiDataTypes field bits
// bits 0->15 Apple-defined, 16->30 3rd-party unique, 31 = reserved
#define scsiBusDataTIB (1<<scsiDataTIB) // TIB supplied (ptr in scsiDataPtr)
#define scsiBusDataBuffer (1<<scsiDataBuffer) // single contiguous buffer supplied
#define scsiBusDataSG (1<<scsiDataSG) // scatter/gather list supplied
#define scsiBusDataReserved 0x80000000 //
// scsiTargetModeFlags field bits
#define scsiBusTargetMdProcessor 0x80 // Target mode processor mode
#define scsiBusTargetMdPhase 0x40 // Target mode phase cog. mode
// scsiScanFlags field bits
#define scsiBusScansDevices 0x80 // Bus scans for and maintains device list
#define scsiBusScansOnInit 0x40 // Bus scans performed at power-up/reboot
#define scsiBusLoadsROMDrivers 0x20 // may load ROM drivers to support targets
// scsiFeatureFlags field bits
#define scsiBusInternalExternalMask 0x000000C0 // bus internal/external mask
#define scsiBusInternalExternalUnknown 0x00000000 // not known whether bus is inside or outside
#define scsiBusInternalExternal 0x000000C0 // bus goes inside and outside the box
#define scsiBusInternal 0x00000080 // bus goes inside the box
#define scsiBusExternal 0x00000040 // bus goes outside the box
#define scsiBusCacheCoherentDMA 0x00000020 // DMA is cache coherent
#define scsiBusOldCallCapable 0x00000010 // SIM is old call capable
#define scsiBusDifferential 0x00000004 // Single Ended (0) or Differential (1)
#define scsiBusFastSCSI 0x00000002 // HBA supports fast SCSI
#define scsiBusDMAavailable 0x00000001 // DMA is available
// scsiWeirdStuff field bits
#define scsiOddDisconnectUnsafeRead1 0x0001 //
#define scsiOddDisconnectUnsafeWrite1 0x0002 //
#define scsiBusErrorsUnsafe 0x0004 //
#define scsiRequiresHandshake 0x0008 //
#define scsiTargetDrivenSDTRSafe 0x0010 //
//———————————————————————————————————————————————————————————————————————————————————
// Defines for the scsiDriverFlags field (in SCSI_Driver_PB)
//———————————————————————————————————————————————————————————————————————————————————
#define scsiDeviceSensitive 0x0001 // Only driver should access this device
#define scsiDeviceNoOldCallAccess 0x0002 // no old call access to this device
//——————————————————————————————————————————————————————————————————————
// SIMinitInfo
//——————————————————————————————————————————————————————————————————————
typedef struct { // directions are for SCSIRegisterBus call ( -> parm, <- result)
uchar * SIMstaticPtr; // <- alloc. ptr to the SIM's static vars
long staticSize; // -> num bytes SIM needs for static vars
OSErr (*SIMinit)(); // -> pointer to the SIM init routine
void (*SIMaction)(); // -> pointer to the SIM action routine
long (*SIM_ISR)(); // -> pointer to the SIM ISR routine
long (*SIMInterruptPoll)(); // -> pointer to the SIM interrupt poll routine
void (*NewOldCall)(); // -> pointer to the SIM NewOldCall routine
ushort ioPBSize; // -> size of SCSI_IO_PBs required for this SIM <SM6> pdw
Boolean oldCallCapable; // -> true if this SIM can handle old-API calls
uchar simInfoUnused1; // ->
long simInternalUse; // xx not affected or viewed by XPT
void (*XPT_ISR)(); // <- ptr to the XPT ISR
void (*EnteringSIM)(); // <- ptr to the EnteringSIM routine
void (*ExitingSIM)(); // <- ptr to the ExitingSIM routine
void (*MakeCallback)(); // <- pointer to the XPT layers MakeCallback routine
ushort busID; // <- bus number for the registered bus
ushort simInfoUnused3; // <-
long simInfoUnused4; // <-
} SIMinitInfo;
/********* Glue between SCSI calls and SCSITrap format ***********/
enum {
xptSCSIAction = 0x0001,
xptSCSIRegisterBus = 0x0002,
xptSCSIDeregisterBus = 0x0003,
xptSCSIReregisterBus = 0x0004,
xptSCSIKillXPT = 0x0005 // kills Mini-XPT after transition
};
#ifdef __cplusplus
extern "C" {
#endif
#pragma parameter __D0 SCSIAction(__A0) /* moveq #kSCSIx, D0; _SCSIAtomic */
OSErr SCSIAction(SCSI_PB *) = {0x7001, _SCSIAtomic};
#pragma parameter __D0 SCSIRegisterBus(__A0)
OSErr SCSIRegisterBus(SIMinitInfo *) = {0x7002, _SCSIAtomic};
#pragma parameter __D0 SCSIDeregisterBus(__A0)
OSErr SCSIDeregisterBus(SIMinitInfo *) = {0x7003, _SCSIAtomic};
#pragma parameter __D0 SCSIReRegisterBus(__A0)
OSErr SCSIReRegisterBus(SIMinitInfo *) = {0x7004, _SCSIAtomic};
#pragma parameter __D0 SCSIKillXPT(__A0)
OSErr SCSIKillXPT(SIMinitInfo *) = {0x7005, _SCSIAtomic};
#ifdef __cplusplus
}
#endif
#endif __ACAM__