diff options
Diffstat (limited to 'private/ntos/miniport/symbios/symc810/scrpt810.asm')
-rw-r--r-- | private/ntos/miniport/symbios/symc810/scrpt810.asm | 667 |
1 files changed, 667 insertions, 0 deletions
diff --git a/private/ntos/miniport/symbios/symc810/scrpt810.asm b/private/ntos/miniport/symbios/symc810/scrpt810.asm new file mode 100644 index 000000000..2e6fe2eb5 --- /dev/null +++ b/private/ntos/miniport/symbios/symc810/scrpt810.asm @@ -0,0 +1,667 @@ +;/************************************************************************ +;* * +;* Copyright 1994 Symbios Logic Inc. All rights reserved. * +;* * +;* This file is confidential and a trade secret of Symbios Logic * +;* The receipt of or possession of this file does not convey any * +;* rights to reproduce or disclose its contents or to manufacture, * +;* use, or sell anything is may describe, in whole, or in part, * +;* without the specific written consent of Symbios Logic * +;* * +;************************************************************************/ +; +;/*+++HDR +; * +; * Version History +; * --------------- +; * +; * Date Who? Description +; * -------- ---- ------------------------------------------------------- +; * +; * 1/12/96 SPD Add new script entry point to restart negotiations for +; * synch transfer mode on same IO as wide negotiation. +; * Fix for parity error on wide data transfers. +; * +;---*/ +; + +; +; Successful operation codes +; + +Absolute CommandOk = 0x0aa00 ; command completed successfully +Absolute Save_Pointers = 0x0aa01 ; SDP message received +Absolute Save_with_Disc = 0x0aa02 ; SDP + Disconnect messages received +Absolute Device_Discon = 0x0aa03 ; Disconnect message received +Absolute Restore_Pointers = 0x0aa04 ; RDP message received. +Absolute ScriptsAborted = 0x0aa05 ; scripts aborted by device driver +Absolute Tag_Received = 0x0aa06 ; RDP message received. +Absolute SynchNegotComp = 0x0aa0c ; synchronous negotiation completed +Absolute WideNegotComp = 0x0aa1c ; wide negotiation completed + +; +; Error codes +; + +Absolute DeviceReset = 0x0ff07 ; had to bail out +Absolute ResetFailed = 0x0ff08 ; ...but couldn't. +Absolute RestSenseComplete = 0x0ff09 ; request sense has completed +Absolute ParityMessageSent = 0x0ff0a ; parity message has been sent +Absolute SynchNotSupported = 0x0ff0b ; synchronous xfer is not supported +Absolute WideNotSupported = 0x0ff1b ; wide xfer is not supported +Absolute InvalidReselector = 0x0ff0d ; reselecting drive id invalid +Absolute MessageRejected = 0x0ff0e ; target rejected our message +Absolute InvalidTaggedMessage = 0x0ff0f ; target did not send a tagged message. + +Absolute DeviceAborted = 0x0ff10 ; device accepted abort message +Absolute AbortFailed = 0x0ff11 ; abort message failed + +Absolute ReselByTarget = 0x0080 + + +; +; offsets in DSA structure follow +; THESE OFFSETS MUST BE CHANGED IF SCRIPT DATA STRUCTURE IN DEVICE EXTENSION +; CHANGES. +; + +Absolute SelectDataOff = 0 +Absolute CDBDataOff = SelectDataOff + 4 +Absolute MsgOutOff = CDBDataOff + 8 +Absolute StatusDataOff = MsgOutOff + 8 +Absolute OneByteMsgOff = StatusDataOff + 8 +Absolute RejectMsgOff = OneByteMsgOff + 8 +Absolute ParityMsgOff = RejectMsgOff + 8 +Absolute AbortMsgOff = ParityMsgOff + 8 +Absolute BDRMsgOff = AbortMsgOff + 8 +Absolute TwoByteMsgOff = BDRMsgOff + 8 +Absolute SGEntry18Off = TwoByteMsgOff + 8 +Absolute SGEntry17Off = SGEntry18Off + 8 +Absolute SGEntry16Off = SGEntry17Off + 8 +Absolute SGEntry15Off = SGEntry16Off + 8 +Absolute SGEntry14Off = SGEntry15Off + 8 +Absolute SGEntry13Off = SGEntry14Off + 8 +Absolute SGEntry12Off = SGEntry13Off + 8 +Absolute SGEntry11Off = SGEntry12Off + 8 +Absolute SGEntry10Off = SGEntry11Off + 8 +Absolute SGEntry09Off = SGEntry10Off + 8 +Absolute SGEntry08Off = SGEntry09Off + 8 +Absolute SGEntry07Off = SGEntry08Off + 8 +Absolute SGEntry06Off = SGEntry07Off + 8 +Absolute SGEntry05Off = SGEntry06Off + 8 +Absolute SGEntry04Off = SGEntry05Off + 8 +Absolute SGEntry03Off = SGEntry04Off + 8 +Absolute SGEntry02Off = SGEntry03Off + 8 +Absolute SGEntry01Off = SGEntry02Off + 8 + +; +; 53C8xx register bits used by scripts +; +; +;Absolute CTEST2_sigp = 0x40 +;Absolute CTEST7_notime = 0x10 +; +; +; SCSI definitions used by scripts +; + +Absolute SCSIMESS_ABORT = 0x06 +Absolute SCSIMESS_ABORT_WITH_TAG = 0x0D +Absolute SCSIMESS_BUS_DEVICE_RESET = 0X0C +Absolute SCSIMESS_CLEAR_QUEUE = 0X0E +Absolute SCSIMESS_DISCONNECT = 0X04 +Absolute SCSIMESS_EXTENDED_MESSAGE = 0X01 +Absolute SCSIMESS_IDENTIFY = 0X80 +Absolute SCSIMESS_IDENTIFY_WITH_DISCON = 0XC0 +Absolute SCSIMESS_IGNORE_WIDE_RESIDUE = 0X23 +Absolute SCSIMESS_INITIATE_RECOVERY = 0X0F +Absolute SCSIMESS_INIT_DETECTED_ERROR = 0X05 +Absolute SCSIMESS_LINK_CMD_COMP = 0X0A +Absolute SCSIMESS_LINK_CMD_COMP_W_FLAG = 0X0B +Absolute SCSIMESS_MESS_PARITY_ERROR = 0X09 +Absolute SCSIMESS_MESSAGE_REJECT = 0X07 +Absolute SCSIMESS_NO_OPERATION = 0X08 +Absolute SCSIMESS_HEAD_OF_QUEUE_TAG = 0X21 +Absolute SCSIMESS_ORDERED_QUEUE_TAG = 0X22 +Absolute SCSIMESS_SIMPLE_QUEUE_TAG = 0X20 +Absolute SCSIMESS_RELEASE_RECOVERY = 0X10 +Absolute SCSIMESS_RESTORE_POINTERS = 0X03 +Absolute SCSIMESS_SAVE_DATA_POINTER = 0X02 +Absolute SCSIMESS_TERMINATE_IO_PROCESS = 0X11 +Absolute SCSIMESS_COMMAND_COMPLETE = 0X00 +Absolute SCSIMESS_SYNCHRONOUS_DATA_REQ = 0X01 +Absolute SCSIMESS_WIDE_DATA_REQUEST = 0X03 +Absolute SCSISTAT_CHECK_CONDITION = 0x02 + +; +; Script entry point declarations follow +; + +Entry EndOfScript +Entry ResetDevice +Entry AbortDevice +Entry AbortExecution +Entry ProcessSelectReselect +Entry ReselectScript +Entry SendErrorMessage +Entry RejectReceived +Entry RejectIN +Entry SendReject +Entry RejectMessage +Entry ExtMsgRcvd +Entry ProcessDisconnect +Entry RestPtrsRcvd +Entry SaveDataPointers +Entry MessageIn +Entry RestartScript +Entry SyncMsgNegot + +Entry DataOutJump +Entry DataInJump +Entry DataOut18 +Entry DataOut01 +Entry DataIn18 +Entry DataIn01 + +Entry GetStatus +Entry SendCommand +Entry SendID +Entry CommandScriptStart +Entry QueueTagMessage +Entry ContNegScript + +CommandScriptStart: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; This is the entry point for initiating SCSI I/O +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + select ATN from SelectDataOff, rel( ReselectScript ) ; Select device + move GPREG & 0xFE to GPREG ; turn LED on + jump rel ( GetStatus ), when STATUS ; If status exit + jump rel ( ResetSelectedDev ), if not MSG_OUT ; Bad phase check + +SendID: + move from MsgOutOff, when MSG_OUT ; Send ID message + jump rel ( SendCommand ) when CMD ; Expected next phase + jump rel ( GetStatus ) if STATUS ; Handle status phase + jump rel ( MessageIn ) if MSG_IN ; Handle message phase + jump rel ( ResetSelectedDev ) ; Error - reset device + +SendCommand: + move from CDBDataOff, when CMD ; Move the CDB +;; new entry to take care of a posible SCSI parity error + move SOCL & 0xFD to SOCL + + jump rel ( ResetSelectedDev ) when CMD ; Error - reset device + + jump rel ( GetStatus ) if STATUS ; Handle status phase + jump rel ( MessageIn ) if MSG_IN ; Handle message phase + + +ProcessDataPhase: + +; Jump to the data in handling when in data-in phase. This jump +; may be patched by the miniport. + +DataInJump: + + jump rel ( DataIn18 ) if DATA_IN ; Handle data in + +; Jump to the data in handling when in data-in phase. This jump +; may be patched by the miniport. + +DataOutJump: + jump rel ( DataOut18 ) if DATA_OUT ; Handle data out + + jump rel ( ResetSelectedDev ) ; Bad phase encountered + +GetStatus: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; This script routine handles status phase +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + move from StatusDataOff, when STATUS ; Get status + +; +; MESSAGE IN phase should follow STATUS phase. +; + + jump rel ( MessageIn ) when MSG_IN ; Handle message in phase + jump rel ( ResetSelectedDev ) ; Error - reset device + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; This the data out section of scripts. +; Up to 18 gather moves can be processed at once. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +DataOut18: + chmov from SGEntry18Off, when DATA_OUT + chmov from SGEntry17Off, when DATA_OUT + chmov from SGEntry16Off, when DATA_OUT + chmov from SGEntry15Off, when DATA_OUT + chmov from SGEntry14Off, when DATA_OUT + chmov from SGEntry13Off, when DATA_OUT + chmov from SGEntry12Off, when DATA_OUT + chmov from SGEntry11Off, when DATA_OUT + chmov from SGEntry10Off, when DATA_OUT + chmov from SGEntry09Off, when DATA_OUT + chmov from SGEntry08Off, when DATA_OUT + chmov from SGEntry07Off, when DATA_OUT + chmov from SGEntry06Off, when DATA_OUT + chmov from SGEntry05Off, when DATA_OUT + chmov from SGEntry04Off, when DATA_OUT + chmov from SGEntry03Off, when DATA_OUT + chmov from SGEntry02Off, when DATA_OUT + +DataOut01: + chmov from SGEntry01Off, when DATA_OUT + + jump rel ( GetStatus) when STATUS ; Handle status + jump rel ( MessageIn) if MSG_IN ; Handle messages + jump rel ( ResetSelectedDev) ; Error - reset device + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; This the data in section of scripts. +; Up to 18 scatter moves can be processed at once. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +DataIn18: + chmov from SGEntry18Off, when DATA_IN + chmov from SGEntry17Off, when DATA_IN + chmov from SGEntry16Off, when DATA_IN + chmov from SGEntry15Off, when DATA_IN + chmov from SGEntry14Off, when DATA_IN + chmov from SGEntry13Off, when DATA_IN + chmov from SGEntry12Off, when DATA_IN + chmov from SGEntry11Off, when DATA_IN + chmov from SGEntry10Off, when DATA_IN + chmov from SGEntry09Off, when DATA_IN + chmov from SGEntry08Off, when DATA_IN + chmov from SGEntry07Off, when DATA_IN + chmov from SGEntry06Off, when DATA_IN + chmov from SGEntry05Off, when DATA_IN + chmov from SGEntry04Off, when DATA_IN + chmov from SGEntry03Off, when DATA_IN + chmov from SGEntry02Off, when DATA_IN + +DataIn01: + chmov from SGEntry01Off, when DATA_IN + + jump rel ( GetStatus) when STATUS ; Handle status + jump rel ( MessageIn) if MSG_IN ; Handle messages + jump rel ( ResetSelectedDev) ; Error - reset device + + +ContNegScript: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; ContNegScript +; +; Entry point for continuing negotiations for sync after wide negotiations +; have occurred. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + set ATN ; bring target back to + ; msg in phase + clear ACK ; still need to ack + ; last wide neg. byte + jump rel ( ResetSelectedDev ), when not MSG_OUT ; Bad phase check + move from MsgOutOff, when MSG_OUT ; Send synch messages + jump rel ( RestartPlus ), when MSG_IN + jump rel ( ResetSelectedDev ) + + +RestartScript: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; RestartScript +; +; Entry point for restarting script after reselect, etc. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; new command to take care of possibel parity error + move SOCL & 0xFD to SOCL + clear ACK and ATN ; Clear pending conditions + +RestartPlus: +; +; note that the call to message in will return only if the message is IDENTIFY +; + + jump rel ( SendCommand ) when CMD ; Process phase + call rel ( MessageIn ) if MSG_IN ; Handle messages + jump rel ( GetStatus ) if STATUS ; Handle status + jump rel ( ProcessDataPhase ) if DATA_IN ; + jump rel ( ProcessDataPhase ) if DATA_OUT ; + jump rel ( SendErrorMessage ) if MSG_OUT ; + jump rel ( ResetSelectedDev ) ; Error - reset device + + +MessageIn: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; This script routine processes message from target +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + move from OneByteMsgOff, when MSG_IN + +; steved - +; do we need to move identify further up? + +; +; Handle command complete message +; + + jump rel ( ProcessCommandComplete ) if SCSIMESS_COMMAND_COMPLETE + +; +; Handle disconnect +; + + jump rel ( ProcessDisconnect ) if SCSIMESS_DISCONNECT + +; +; Handle Save Data Pointers +; + + jump rel ( SaveDataPointers ) if SCSIMESS_SAVE_DATA_POINTER + +; +; Handle Restore Pointers +; + + jump rel ( RestPtrsRcvd ) if SCSIMESS_RESTORE_POINTERS + +; +; Handle extended message +; + + jump rel ( ExtMsgRcvd ) if SCSIMESS_EXTENDED_MESSAGE + +; +; Handle Message Reject +; + + jump rel ( RejectReceived ) if SCSIMESS_MESSAGE_REJECT + +; +; If not Identify, reject the message +; + + jump rel ( RejectMessage ) if not SCSIMESS_IDENTIFY and mask 0x0F + +; +; Process Identify message. Note that we throw away the Identify message +; at this point because it has already been processed by the driver. +; + + clear ACK ; Throw message away + jump rel ( MessageIn ) when MSG_IN ; Handle more messages + +; +; Note that this routine is CALLed only by the reselection script routine. +; We should only receive an identify message immediately after a +; reselection. Therefore, the RETURN below will be executed only when this +; routine is called by the reselection code. +; + return ; Return to caller + +SaveDataPointers: + clear ACK ; Acknowledge SDP + +; +; Normally, disconnect message will follow SDP. We save ourselves an interrupt +; by assuming this is the case. +; + + int Save_Pointers when not MSG_IN ; Another message? + move from OneByteMsgOff, when MSG_IN ; If so move it + +; +; bugbug- +; although it is very improbable that a device would send a message other +; than DISCONNECT after an SDP, we need to handle this case more gracefully. +; + jump rel ( ResetSelectedDev ) if not SCSIMESS_DISCONNECT + ; If not disconnect, + ; error - reset device + + move SCNTL2 & 0x7F to SCNTL2 ; Disable unexpected disconnect + move GPREG | 0x01 to GPREG ; LED off ; Clear disconnect message + clear ACK + wait DISCONNECT ; + int Save_with_Disc ; Indicate SDP and + ; disconnect + +RestPtrsRcvd: + clear ACK ; Accept message + int Restore_Pointers ; Indicate restore pointers + + +ProcessDisconnect: + + move SCNTL2 & 0x7F to SCNTL2 ; Disable unexpected disconnect + move GPREG | 0x01 to GPREG ; LED off ; Clear disconnect message + clear ACK ; Clear disconnect message + wait DISCONNECT ; Wait for disconnect to happen + int Device_Discon ; Indicate device disconnected + + +ProcessCommandComplete: + + move SCNTL2 & 0x7F to SCNTL2 ; Disable unexpected disconnect + move GPREG | 0x01 to GPREG ; LED off ; Clear disconnect message + clear ACK ; Acknowledge message + wait DISCONNECT ; Wait for disconnect to happen + int CommandOk ; Indicate command complete + +ExtMsgRcvd: + clear ACK ; Accept first byte of message + jump rel ( ResetSelectedDev ) when not MSG_IN ; If not MSG-IN, error - reset device + move from OneByteMsgOff, when MSG_IN ; Get next message byte + + jump rel ( SyncMsgNegot ) if 3 ; If not two byte message, + jump rel ( RejectMessage ) if not 2 + + clear ACK ; Accept first byte of wide message + move from OneByteMsgOff, when MSG_IN ; Get next byte of message + + jump rel ( RejectMessage ) if not SCSIMESS_WIDE_DATA_REQUEST + + + clear ACK ; Accept SDTR byte +; +; the following code processes the SDTR extended message +; + move from OneByteMsgOff, when MSG_IN ; Get wide parameters + + int WideNegotComp ; Indicate wide supported + + +SyncMsgNegot: +; +; NOTE: the following extended message lengths are currently supported: +; +; 3 byte messages +; + clear ACK ; Accept first byte of sync message + move from OneByteMsgOff, when MSG_IN ; Get next byte of message + jump rel ( RejectMessage ) if not SCSIMESS_SYNCHRONOUS_DATA_REQ + + clear ACK ; Accept SDTR byte +; +; the following code processes the SDTR extended message +; + + move from TwoByteMsgOff, when MSG_IN ; Get sync parameters + int SynchNegotComp ; Indicate synchronous supported + + +RejectMessage: + set ATN + clear ACK ; Clear the message + jump rel ( RejectIN ) when MSG_IN ; If still MSG IN, jump to + ; clear extended message +SendReject: + jump ResetSelectedDev, if not MSG_OUT ; If not MSG OUT, error - reset device + move from RejectMsgOff, when MSG_OUT ; Send REJECT message + jump rel ( ResetSelectedDev) when MSG_OUT ; If not accepted, error - reset device + jump rel ( RestartScript ) ; Reject successful - restart + ; the state machine + +RejectIN: + move from OneByteMsgOff, when MSG_IN ; Get message + clear ACK ; Acknowledge it + jump rel ( RejectIN ) when MSG_IN ; If more message bytes, process them + jump rel ( SendReject ) ; Send REJECT message + +RejectReceived: + ;clear ACK ; Clear the message + int MessageRejected ; Indicate message rejected + +SendErrorMessage: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Send either INITIATOR DETECTED ERROR or MESSAGE PARITY ERROR message +; (set by driver before calling) to target. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + set ATN ; Ask for message out + clear ACK ; Clear any pending msgs + +; +; If the device does not go immediately to message out, we don't try to +; coax it. +; + jump rel ( ResetSelectedDev ) when not MSG_OUT ; Error - reset device + +DoParityMove: + move from ParityMsgOff, when MSG_OUT ; Move the error message + int ParityMessageSent ; Indicate message sent + +ReselectScript: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; Wait for a Reselection/selection +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + wait reselect rel ( AbortExecution ) + move GPREG & 0xFE to GPREG ;LED on + +ProcessSelectReselect: + + jump rel( ProcessSelectReselect ) if not MSG_IN + + move from OneByteMsgOff, when MSG_IN + +ReselectInterrupt: + + int ReselByTarget + +AbortExecution: + + move CTEST2 to SFBR ; Signal that we are stalled + int ScriptsAborted + + +ResetDevice: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; ResetDevice: +; +; Select device, reset device and exit. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; First have to select the device. + + select ATN from SelectDataOff, rel( ReselectScript ) ; Select device + move GPREG & 0xFE to GPREG ; LED on + jump rel ( ResetSendMsg ) + +ResetSelectedDev: + + set ATN ; Set ATN before releasing any messages + clear ACK ; Release messages + +; +; if the wayward device does not immediately go into message phase, we +; will bail out. No attempt is made to coax the drive by transferring +; any additional data or message bytes. +; + +ResetSendMsg: + int ResetFailed when not MSG_OUT ; Interrupt the reset failed + +DoBDRMove: + move SCNTL2 & 0x7F to SCNTL2 ; Disable unexpected disconnect + move from BDRMsgOff, when MSG_OUT ; Send BDR message + + move GPREG | 0x01 to GPREG ; LED off + wait DISCONNECT ; Wait for device to disconnect + int DeviceReset ; Indicate device reset + +AbortDevice: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; AbortDevice: +; +; Abort all I/Os for the device and exit. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; First have to select the device. + + select ATN from SelectDataOff, rel( ReselectScript ) ; Select device + move GPREG & 0xFE to GPREG ; LED on + +; +; if the wayward device does not immediately go into message phase, we +; will bail out. No attempt is made to coax the drive by transferring +; any additional data or message bytes. +; + + int AbortFailed when not MSG_OUT ; Interrupt the abort failed + + +DoAbortMove: + move SCNTL2 & 0x7F to SCNTL2 ; Disable unexpected disconnect + move from AbortMsgOff, when MSG_OUT ; Send abort message + + move GPREG | 0x01 to GPREG ; LED off + wait DISCONNECT ; Wait for device to disconnect + int DeviceAborted ; Indicate device aborted + + +QueueTagMessage: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; +; QueueTagMessage - +; +; This routine processes a queue tagged message. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + clear ACK ; Acknowledge identify message + move from OneByteMsgOff, when MSG_IN ; Get the first message byte + + int InvalidTaggedMessage, if not SCSIMESS_SIMPLE_QUEUE_TAG + ; If not simple queue tag message, + ; indicate this to driver + + clear ACK ; Acknowledge queue tag message + move from OneByteMsgOff, when MSG_IN ; Get the queue tag message + int Tag_Received ; Indicate queue tag received + + +EndOfScript: |