mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-25 09:30:50 +00:00
792 lines
36 KiB
C
792 lines
36 KiB
C
|
/*******************************************************************************
|
|||
|
|
|||
|
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 // don’t bit bucket in during this I/O
|
|||
|
#define scsiNoBucketOut 0x0020 // don’t 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 layer’s 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__
|