/******************************************************************************* 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): 2/2/94 DCB Adding another bit to SCSIWeirdStuff - this time to indicate a need for scsiHandshaking. 2/1/94 DCB Added scsiBusErrorsUnsafe constant for the scsiWeirdStuff field. 11/22/93 pdw Rolling in from . 11/11/93 pdw Added scsiWeirdStuff field to BusInquiry along with its bits. 11/9/93 pdw Added scsiIdentifyMessageRejected error code. 9/29/93 chp Standardized conditional inclusion and removed redundancies with Types.h, which is included. 10/14/93 pdw Added scsiWrongDirection and scsibXXX flag enums. 7/17/93 pdw IMPORTANT!!! Changed the SCM to SIM in the comment about ReleaseQ (i.e. SIM Q vs. SCM Q). 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. 5/5/93 PW Converted names to meanies-friendly names. Updated with latest from Ludwig stuff. 5/1/93 PW Realigning tabs that got screwed up during massive name changes (on previous checkin). Changing xxxResidualLength to xxxResidual. 4/14/93 DCB Fixed the glue for register bus and re-register bus. Also added syncRenegotiateSense flags for third party SIMs. 3/23/93 PW Added scsiInitiateWide bit and reserved some async callback flags for 3rd-parties. 3/26/93 PW Making scsiDriver field a signed short instead of unsigned short. Changed busOldAPICapable to scsiBusOldCallCapable. 3/20/93 PW Rolled in Ludwig changes. 3/1/93 DCB Changed scsiConnectionTimeout to reserved since it isn't needed anymore. 3/1/93 PW Added LoadDrivers function code and removed some unnecessary flags from scsiScanFlags byte. 2/17/93 PW Added scsiBusNotFree bit to scsiResultFlags field. 2/1/93 PW Update from the latest of Ludwig. Also changes required for PDM (will update Ludwig with these as needed myself). 1/27/93 PW Adding a couple of fields to Bus Inquiry. 1/27/93 PW Added temporary hack to keep people's A10 drivers working. 1/27/93 PW Removed enums on flags and added enum to A089 selectors. Added a spare long to header and added scsiDataTypes field. 12/9/92 PW Rearranged error codes - broke them up into 3 ranges: execution failed, could not start and parameter error. Removed scsiDoVirtualMap flag. 12/5/92 PW Changed VUflags to IOflags and changed RefNum function names. 11/20/92 DCB Adding support for interleaving, changed some #defines to enums and removed recorder stuff. 10/30/92 DCB Moved completion routine to header 10/30/92 DCB Various changes in to reflect the results of the SCSI Sync meeting 10/8/92 PW Whole loads of name changes (fields, flags and errors). Some realignment and some new fields. 9/17/92 PW Slight changes to some names. Removed much unused garbage. 8/31/92 DCB Added ioQ Field to the SCSI_IO parameter block to simplify Q management. 8/30/92 DCB Added pending IO field to SCSI_IO, also changed the names for Terminate, Abort and Reset Device. 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 #endif #ifndef __TRAPS__ #include #endif #define scsiVERSION 43 /********************************************************************/ // Defines for the SCSIMgr function codes /********************************************************************/ enum // 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 pdw SCSILoadDriver = 0x82, // Load a driver for a device ident. 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); // pdw //ΡΡΡΡΡ Allocation length defines for some of the fields ΡΡΡΡΡ #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 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 ΡΡΡΡΡΡΡΡΡΡΡΡΡΡ pdw from prev #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; // pdw from prev #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 pdw ushort scsiMaxIOpbSize; // <- Size of max SCSI_IO PB for all SIM/HBAs 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 pdw char scsiHBAVendor[ vendorIDLength ]; // <- Vendor ID of the HBA 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; // //ΡΡΡΡΡΡΡΡΡΡΡΡΡΡ Terminate I/O Process Request PB ΡΡΡΡΡΡΡΡΡΡΡΡΡΡ typedef struct SCSITerminateIOPB { SCSIPBHdr // Header information fields SCSI_IO * scsiIOptr; // Pointer to the PB to terminate } SCSITerminateIOPB; // //ΡΡΡΡΡΡΡΡΡΡΡΡΡΡ Reset SCSI Bus PB ΡΡΡΡΡΡΡΡΡΡΡΡΡΡ typedef struct SCSIResetBusPB { SCSIPBHdr // Header information fields } SCSIResetBusPB; // //ΡΡΡΡΡΡΡΡΡΡΡΡΡΡ Reset SCSI Device PB ΡΡΡΡΡΡΡΡΡΡΡΡΡΡ typedef struct SCSIResetDevicePB { SCSIPBHdr // Header information fields } SCSIResetDevicePB; // //ΡΡΡΡΡΡΡΡΡΡΡΡΡΡ 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 ΡΡΡΡΡΡΡΡΡΡΡΡΡΡ 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 ΡΡΡΡΡΡΡΡΡΡΡΡΡΡ 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 ΡΡΡΡΡΡΡΡΡΡΡΡΡΡ 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 { // 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 // 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< 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 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__