/*******************************************************************************

	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__
