;/************************************************************************
;* *
;* 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: