xref: /openbmc/linux/drivers/scsi/53c700.scr (revision e5451c8f8330e03ad3cfa16048b4daf961af434f)
11da177e4SLinus Torvalds; Script for the NCR (or symbios) 53c700 and 53c700-66 chip
21da177e4SLinus Torvalds;
31da177e4SLinus Torvalds; Copyright (C) 2001 James.Bottomley@HansenPartnership.com
41da177e4SLinus Torvalds;;-----------------------------------------------------------------------------
51da177e4SLinus Torvalds;;
61da177e4SLinus Torvalds;;  This program is free software; you can redistribute it and/or modify
71da177e4SLinus Torvalds;;  it under the terms of the GNU General Public License as published by
81da177e4SLinus Torvalds;;  the Free Software Foundation; either version 2 of the License, or
91da177e4SLinus Torvalds;;  (at your option) any later version.
101da177e4SLinus Torvalds;;
111da177e4SLinus Torvalds;;  This program is distributed in the hope that it will be useful,
121da177e4SLinus Torvalds;;  but WITHOUT ANY WARRANTY; without even the implied warranty of
131da177e4SLinus Torvalds;;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
141da177e4SLinus Torvalds;;  GNU General Public License for more details.
151da177e4SLinus Torvalds;;
161da177e4SLinus Torvalds;;  You should have received a copy of the GNU General Public License
171da177e4SLinus Torvalds;;  along with this program; if not, write to the Free Software
181da177e4SLinus Torvalds;;  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
191da177e4SLinus Torvalds;;
201da177e4SLinus Torvalds;;-----------------------------------------------------------------------------
211da177e4SLinus Torvalds;
221da177e4SLinus Torvalds; This script is designed to be modified for the particular command in
231da177e4SLinus Torvalds; operation.  The particular variables pertaining to the commands are:
241da177e4SLinus Torvalds;
251da177e4SLinus TorvaldsABSOLUTE	Device_ID = 0		; ID of target for command
261da177e4SLinus TorvaldsABSOLUTE	MessageCount = 0	; Number of bytes in message
271da177e4SLinus TorvaldsABSOLUTE	MessageLocation = 0	; Addr of message
281da177e4SLinus TorvaldsABSOLUTE	CommandCount = 0	; Number of bytes in command
291da177e4SLinus TorvaldsABSOLUTE	CommandAddress = 0	; Addr of Command
301da177e4SLinus TorvaldsABSOLUTE	StatusAddress = 0	; Addr to receive status return
311da177e4SLinus TorvaldsABSOLUTE	ReceiveMsgAddress = 0	; Addr to receive msg
321da177e4SLinus Torvalds;
331da177e4SLinus Torvalds; This is the magic component for handling scatter-gather.  Each of the
34*25985edcSLucas De Marchi; SG components is preceded by a script fragment which moves the
351da177e4SLinus Torvalds; necessary amount of data and jumps to the next SG segment.  The final
361da177e4SLinus Torvalds; SG segment jumps back to .  However, this address is the first SG script
371da177e4SLinus Torvalds; segment.
381da177e4SLinus Torvalds;
391da177e4SLinus TorvaldsABSOLUTE	SGScriptStartAddress = 0
401da177e4SLinus Torvalds
411da177e4SLinus Torvalds; The following represent status interrupts we use 3 hex digits for
421da177e4SLinus Torvalds; this: 0xPRS where
431da177e4SLinus Torvalds
441da177e4SLinus Torvalds; P:
451da177e4SLinus TorvaldsABSOLUTE	AFTER_SELECTION 	= 0x100
461da177e4SLinus TorvaldsABSOLUTE	BEFORE_CMD 		= 0x200
471da177e4SLinus TorvaldsABSOLUTE	AFTER_CMD 		= 0x300
481da177e4SLinus TorvaldsABSOLUTE	AFTER_STATUS 		= 0x400
491da177e4SLinus TorvaldsABSOLUTE	AFTER_DATA_IN		= 0x500
501da177e4SLinus TorvaldsABSOLUTE	AFTER_DATA_OUT		= 0x600
511da177e4SLinus TorvaldsABSOLUTE	DURING_DATA_IN		= 0x700
521da177e4SLinus Torvalds
531da177e4SLinus Torvalds; R:
541da177e4SLinus TorvaldsABSOLUTE	NOT_MSG_OUT 		= 0x10
551da177e4SLinus TorvaldsABSOLUTE	UNEXPECTED_PHASE 	= 0x20
561da177e4SLinus TorvaldsABSOLUTE	NOT_MSG_IN 		= 0x30
571da177e4SLinus TorvaldsABSOLUTE	UNEXPECTED_MSG		= 0x40
581da177e4SLinus TorvaldsABSOLUTE	MSG_IN			= 0x50
591da177e4SLinus TorvaldsABSOLUTE	SDTR_MSG_R		= 0x60
601da177e4SLinus TorvaldsABSOLUTE	REJECT_MSG_R		= 0x70
611da177e4SLinus TorvaldsABSOLUTE	DISCONNECT		= 0x80
621da177e4SLinus TorvaldsABSOLUTE	MSG_OUT			= 0x90
631da177e4SLinus TorvaldsABSOLUTE	WDTR_MSG_R		= 0xA0
641da177e4SLinus Torvalds
651da177e4SLinus Torvalds; S:
661da177e4SLinus TorvaldsABSOLUTE	GOOD_STATUS 		= 0x1
671da177e4SLinus Torvalds
681da177e4SLinus Torvalds; Combinations, since the script assembler can't process |
691da177e4SLinus TorvaldsABSOLUTE	NOT_MSG_OUT_AFTER_SELECTION = 0x110
701da177e4SLinus TorvaldsABSOLUTE	UNEXPECTED_PHASE_BEFORE_CMD = 0x220
711da177e4SLinus TorvaldsABSOLUTE	UNEXPECTED_PHASE_AFTER_CMD = 0x320
721da177e4SLinus TorvaldsABSOLUTE	NOT_MSG_IN_AFTER_STATUS = 0x430
731da177e4SLinus TorvaldsABSOLUTE	GOOD_STATUS_AFTER_STATUS = 0x401
741da177e4SLinus TorvaldsABSOLUTE	UNEXPECTED_PHASE_AFTER_DATA_IN = 0x520
751da177e4SLinus TorvaldsABSOLUTE	UNEXPECTED_PHASE_AFTER_DATA_OUT = 0x620
761da177e4SLinus TorvaldsABSOLUTE	UNEXPECTED_MSG_BEFORE_CMD = 0x240
771da177e4SLinus TorvaldsABSOLUTE	MSG_IN_BEFORE_CMD = 0x250
781da177e4SLinus TorvaldsABSOLUTE	MSG_IN_AFTER_CMD = 0x350
791da177e4SLinus TorvaldsABSOLUTE	SDTR_MSG_BEFORE_CMD = 0x260
801da177e4SLinus TorvaldsABSOLUTE	REJECT_MSG_BEFORE_CMD = 0x270
811da177e4SLinus TorvaldsABSOLUTE	DISCONNECT_AFTER_CMD = 0x380
821da177e4SLinus TorvaldsABSOLUTE	SDTR_MSG_AFTER_CMD = 0x360
831da177e4SLinus TorvaldsABSOLUTE	WDTR_MSG_AFTER_CMD = 0x3A0
841da177e4SLinus TorvaldsABSOLUTE	MSG_IN_AFTER_STATUS = 0x440
851da177e4SLinus TorvaldsABSOLUTE	DISCONNECT_AFTER_DATA = 0x580
861da177e4SLinus TorvaldsABSOLUTE	MSG_IN_AFTER_DATA_IN = 0x550
871da177e4SLinus TorvaldsABSOLUTE	MSG_IN_AFTER_DATA_OUT = 0x650
881da177e4SLinus TorvaldsABSOLUTE	MSG_OUT_AFTER_DATA_IN = 0x590
891da177e4SLinus TorvaldsABSOLUTE	DATA_IN_AFTER_DATA_IN = 0x5a0
901da177e4SLinus TorvaldsABSOLUTE	MSG_IN_DURING_DATA_IN = 0x750
911da177e4SLinus TorvaldsABSOLUTE	DISCONNECT_DURING_DATA = 0x780
921da177e4SLinus Torvalds
931da177e4SLinus Torvalds;
941da177e4SLinus Torvalds; Other interrupt conditions
951da177e4SLinus Torvalds;
961da177e4SLinus TorvaldsABSOLUTE	RESELECTED_DURING_SELECTION = 0x1000
971da177e4SLinus TorvaldsABSOLUTE	COMPLETED_SELECTION_AS_TARGET = 0x1001
981da177e4SLinus TorvaldsABSOLUTE	RESELECTION_IDENTIFIED = 0x1003
991da177e4SLinus Torvalds;
1001da177e4SLinus Torvalds; Fatal interrupt conditions.  If you add to this, also add to the
1011da177e4SLinus Torvalds; array of corresponding messages
1021da177e4SLinus Torvalds;
1031da177e4SLinus TorvaldsABSOLUTE	FATAL = 0x2000
1041da177e4SLinus TorvaldsABSOLUTE	FATAL_UNEXPECTED_RESELECTION_MSG = 0x2000
1051da177e4SLinus TorvaldsABSOLUTE	FATAL_SEND_MSG = 0x2001
1061da177e4SLinus TorvaldsABSOLUTE	FATAL_NOT_MSG_IN_AFTER_SELECTION = 0x2002
1071da177e4SLinus TorvaldsABSOLUTE	FATAL_ILLEGAL_MSG_LENGTH = 0x2003
1081da177e4SLinus Torvalds
1091da177e4SLinus TorvaldsABSOLUTE	DEBUG_INTERRUPT	= 0x3000
1101da177e4SLinus TorvaldsABSOLUTE	DEBUG_INTERRUPT1 = 0x3001
1111da177e4SLinus TorvaldsABSOLUTE	DEBUG_INTERRUPT2 = 0x3002
1121da177e4SLinus TorvaldsABSOLUTE	DEBUG_INTERRUPT3 = 0x3003
1131da177e4SLinus TorvaldsABSOLUTE	DEBUG_INTERRUPT4 = 0x3004
1141da177e4SLinus TorvaldsABSOLUTE	DEBUG_INTERRUPT5 = 0x3005
1151da177e4SLinus TorvaldsABSOLUTE	DEBUG_INTERRUPT6 = 0x3006
1161da177e4SLinus Torvalds
1171da177e4SLinus Torvalds
1181da177e4SLinus Torvalds;
1191da177e4SLinus Torvalds; SCSI Messages we interpret in the script
1201da177e4SLinus Torvalds;
1211da177e4SLinus TorvaldsABSOLUTE	COMMAND_COMPLETE_MSG	= 0x00
1221da177e4SLinus TorvaldsABSOLUTE	EXTENDED_MSG		= 0x01
1231da177e4SLinus TorvaldsABSOLUTE	SDTR_MSG		= 0x01
1241da177e4SLinus TorvaldsABSOLUTE	SAVE_DATA_PTRS_MSG	= 0x02
1251da177e4SLinus TorvaldsABSOLUTE	RESTORE_DATA_PTRS_MSG	= 0x03
1261da177e4SLinus TorvaldsABSOLUTE	WDTR_MSG		= 0x03
1271da177e4SLinus TorvaldsABSOLUTE	DISCONNECT_MSG		= 0x04
1281da177e4SLinus TorvaldsABSOLUTE	REJECT_MSG		= 0x07
1291da177e4SLinus TorvaldsABSOLUTE	PARITY_ERROR_MSG	= 0x09
1301da177e4SLinus TorvaldsABSOLUTE	SIMPLE_TAG_MSG		= 0x20
1311da177e4SLinus TorvaldsABSOLUTE	IDENTIFY_MSG		= 0x80
1321da177e4SLinus TorvaldsABSOLUTE	IDENTIFY_MSG_MASK	= 0x7F
1331da177e4SLinus TorvaldsABSOLUTE	TWO_BYTE_MSG		= 0x20
1341da177e4SLinus TorvaldsABSOLUTE	TWO_BYTE_MSG_MASK	= 0x0F
1351da177e4SLinus Torvalds
1361da177e4SLinus Torvalds; This is where the script begins
1371da177e4SLinus Torvalds
1381da177e4SLinus TorvaldsENTRY	StartUp
1391da177e4SLinus Torvalds
1401da177e4SLinus TorvaldsStartUp:
1411da177e4SLinus Torvalds	SELECT	ATN Device_ID, Reselect
1421da177e4SLinus Torvalds	JUMP	Finish, WHEN STATUS
1431da177e4SLinus Torvalds	JUMP	SendIdentifyMsg, IF MSG_OUT
1441da177e4SLinus Torvalds	INT	NOT_MSG_OUT_AFTER_SELECTION
1451da177e4SLinus Torvalds
1461da177e4SLinus TorvaldsReselect:
1471da177e4SLinus Torvalds	WAIT	RESELECT SelectedAsTarget
1481da177e4SLinus Torvalds	INT	RESELECTED_DURING_SELECTION, WHEN MSG_IN
1491da177e4SLinus Torvalds	INT	FATAL_NOT_MSG_IN_AFTER_SELECTION
1501da177e4SLinus Torvalds
1511da177e4SLinus Torvalds	ENTRY	GetReselectionData
1521da177e4SLinus TorvaldsGetReselectionData:
1531da177e4SLinus Torvalds	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
1541da177e4SLinus Torvalds	INT	RESELECTION_IDENTIFIED
1551da177e4SLinus Torvalds
1561da177e4SLinus Torvalds	ENTRY	GetReselectionWithTag
1571da177e4SLinus TorvaldsGetReselectionWithTag:
1581da177e4SLinus Torvalds	MOVE	3, ReceiveMsgAddress, WHEN MSG_IN
1591da177e4SLinus Torvalds	INT	RESELECTION_IDENTIFIED
1601da177e4SLinus Torvalds
1611da177e4SLinus Torvalds	ENTRY	SelectedAsTarget
1621da177e4SLinus TorvaldsSelectedAsTarget:
1631da177e4SLinus Torvalds; Basically tell the selecting device that there's nothing here
1641da177e4SLinus Torvalds	SET	TARGET
1651da177e4SLinus Torvalds	DISCONNECT
1661da177e4SLinus Torvalds	CLEAR	TARGET
1671da177e4SLinus Torvalds	INT	COMPLETED_SELECTION_AS_TARGET
1681da177e4SLinus Torvalds;
1691da177e4SLinus Torvalds; These are the messaging entries
1701da177e4SLinus Torvalds;
1711da177e4SLinus Torvalds; Send a message.  Message count should be correctly patched
1721da177e4SLinus Torvalds	ENTRY	SendMessage
1731da177e4SLinus TorvaldsSendMessage:
1741da177e4SLinus Torvalds	MOVE	MessageCount, MessageLocation, WHEN MSG_OUT
1751da177e4SLinus TorvaldsResumeSendMessage:
1761da177e4SLinus Torvalds	RETURN,	WHEN NOT MSG_OUT
1771da177e4SLinus Torvalds	INT	FATAL_SEND_MSG
1781da177e4SLinus Torvalds
1791da177e4SLinus Torvalds	ENTRY	SendMessagePhaseMismatch
1801da177e4SLinus TorvaldsSendMessagePhaseMismatch:
1811da177e4SLinus Torvalds	CLEAR	ACK
1821da177e4SLinus Torvalds	JUMP	ResumeSendMessage
1831da177e4SLinus Torvalds;
1841da177e4SLinus Torvalds; Receive a message.  Need to identify the message to
1851da177e4SLinus Torvalds; receive it correctly
1861da177e4SLinus Torvalds	ENTRY	ReceiveMessage
1871da177e4SLinus TorvaldsReceiveMessage:
1881da177e4SLinus Torvalds	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
1891da177e4SLinus Torvalds;
1901da177e4SLinus Torvalds; Use this entry if we've just tried to look at the first byte
1911da177e4SLinus Torvalds; of the message and want to process it further
1921da177e4SLinus TorvaldsProcessReceiveMessage:
1931da177e4SLinus Torvalds	JUMP	ReceiveExtendedMessage, IF EXTENDED_MSG
1941da177e4SLinus Torvalds	RETURN,	IF NOT TWO_BYTE_MSG, AND MASK TWO_BYTE_MSG_MASK
1951da177e4SLinus Torvalds	CLEAR	ACK
1961da177e4SLinus Torvalds	MOVE	1, ReceiveMsgAddress + 1, WHEN MSG_IN
1971da177e4SLinus Torvalds	RETURN
1981da177e4SLinus TorvaldsReceiveExtendedMessage:
1991da177e4SLinus Torvalds	CLEAR	ACK
2001da177e4SLinus Torvalds	MOVE	1, ReceiveMsgAddress + 1, WHEN MSG_IN
2011da177e4SLinus Torvalds	JUMP	Receive1Byte, IF 0x01
2021da177e4SLinus Torvalds	JUMP	Receive2Byte, IF 0x02
2031da177e4SLinus Torvalds	JUMP	Receive3Byte, IF 0x03
2041da177e4SLinus Torvalds	JUMP	Receive4Byte, IF 0x04
2051da177e4SLinus Torvalds	JUMP	Receive5Byte, IF 0x05
2061da177e4SLinus Torvalds	INT	FATAL_ILLEGAL_MSG_LENGTH
2071da177e4SLinus TorvaldsReceive1Byte:
2081da177e4SLinus Torvalds	CLEAR	ACK
2091da177e4SLinus Torvalds	MOVE	1, ReceiveMsgAddress + 2, WHEN MSG_IN
2101da177e4SLinus Torvalds	RETURN
2111da177e4SLinus TorvaldsReceive2Byte:
2121da177e4SLinus Torvalds	CLEAR	ACK
2131da177e4SLinus Torvalds	MOVE	2, ReceiveMsgAddress + 2, WHEN MSG_IN
2141da177e4SLinus Torvalds	RETURN
2151da177e4SLinus TorvaldsReceive3Byte:
2161da177e4SLinus Torvalds	CLEAR	ACK
2171da177e4SLinus Torvalds	MOVE	3, ReceiveMsgAddress + 2, WHEN MSG_IN
2181da177e4SLinus Torvalds	RETURN
2191da177e4SLinus TorvaldsReceive4Byte:
2201da177e4SLinus Torvalds	CLEAR	ACK
2211da177e4SLinus Torvalds	MOVE	4, ReceiveMsgAddress + 2, WHEN MSG_IN
2221da177e4SLinus Torvalds	RETURN
2231da177e4SLinus TorvaldsReceive5Byte:
2241da177e4SLinus Torvalds	CLEAR	ACK
2251da177e4SLinus Torvalds	MOVE	5, ReceiveMsgAddress + 2, WHEN MSG_IN
2261da177e4SLinus Torvalds	RETURN
2271da177e4SLinus Torvalds;
2281da177e4SLinus Torvalds; Come here from the message processor to ignore the message
2291da177e4SLinus Torvalds;
2301da177e4SLinus Torvalds	ENTRY	IgnoreMessage
2311da177e4SLinus TorvaldsIgnoreMessage:
2321da177e4SLinus Torvalds	CLEAR	ACK
2331da177e4SLinus Torvalds	RETURN
2341da177e4SLinus Torvalds;
2351da177e4SLinus Torvalds; Come here to send a reply to a message
2361da177e4SLinus Torvalds;
2371da177e4SLinus Torvalds	ENTRY	SendMessageWithATN
2381da177e4SLinus TorvaldsSendMessageWithATN:
2391da177e4SLinus Torvalds	SET	ATN
2401da177e4SLinus Torvalds	CLEAR	ACK
2411da177e4SLinus Torvalds	JUMP	SendMessage
2421da177e4SLinus Torvalds
2431da177e4SLinus TorvaldsSendIdentifyMsg:
2441da177e4SLinus Torvalds	CALL	SendMessage
2451da177e4SLinus Torvalds	CLEAR	ATN
2461da177e4SLinus Torvalds
2471da177e4SLinus TorvaldsIgnoreMsgBeforeCommand:
2481da177e4SLinus Torvalds	CLEAR	ACK
2491da177e4SLinus Torvalds	ENTRY	SendCommand
2501da177e4SLinus TorvaldsSendCommand:
2511da177e4SLinus Torvalds	JUMP	Finish, WHEN STATUS
2521da177e4SLinus Torvalds	JUMP	MsgInBeforeCommand, IF MSG_IN
2531da177e4SLinus Torvalds	INT	UNEXPECTED_PHASE_BEFORE_CMD, IF NOT CMD
2541da177e4SLinus Torvalds	MOVE	CommandCount, CommandAddress, WHEN CMD
2551da177e4SLinus TorvaldsResumeSendCommand:
2561da177e4SLinus Torvalds	JUMP	Finish, WHEN STATUS
2571da177e4SLinus Torvalds	JUMP	MsgInAfterCmd, IF MSG_IN
2581da177e4SLinus Torvalds	JUMP	DataIn, IF DATA_IN
2591da177e4SLinus Torvalds	JUMP	DataOut, IF DATA_OUT
2601da177e4SLinus Torvalds	INT	UNEXPECTED_PHASE_AFTER_CMD
2611da177e4SLinus Torvalds
2621da177e4SLinus TorvaldsIgnoreMsgDuringData:
2631da177e4SLinus Torvalds	CLEAR	ACK
2641da177e4SLinus Torvalds	; fall through to MsgInDuringData
2651da177e4SLinus Torvalds
2661da177e4SLinus TorvaldsEntry MsgInDuringData
2671da177e4SLinus TorvaldsMsgInDuringData:
2681da177e4SLinus Torvalds;
2691da177e4SLinus Torvalds; Could be we have nothing more to transfer
2701da177e4SLinus Torvalds;
2711da177e4SLinus Torvalds	JUMP	Finish, WHEN STATUS
2721da177e4SLinus Torvalds	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
2731da177e4SLinus Torvalds	JUMP	DisconnectDuringDataIn, IF DISCONNECT_MSG
2741da177e4SLinus Torvalds	JUMP	IgnoreMsgDuringData, IF SAVE_DATA_PTRS_MSG
2751da177e4SLinus Torvalds	JUMP	IgnoreMsgDuringData, IF RESTORE_DATA_PTRS_MSG
2761da177e4SLinus Torvalds	INT	MSG_IN_DURING_DATA_IN
2771da177e4SLinus Torvalds
2781da177e4SLinus TorvaldsMsgInAfterCmd:
2791da177e4SLinus Torvalds	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
2801da177e4SLinus Torvalds	JUMP	DisconnectAfterCmd, IF DISCONNECT_MSG
2811da177e4SLinus Torvalds	JUMP	IgnoreMsgInAfterCmd, IF SAVE_DATA_PTRS_MSG
2821da177e4SLinus Torvalds	JUMP	IgnoreMsgInAfterCmd, IF RESTORE_DATA_PTRS_MSG
2831da177e4SLinus Torvalds	CALL	ProcessReceiveMessage
2841da177e4SLinus Torvalds	INT	MSG_IN_AFTER_CMD
2851da177e4SLinus Torvalds	CLEAR	ACK
2861da177e4SLinus Torvalds	JUMP	ResumeSendCommand
2871da177e4SLinus Torvalds
2881da177e4SLinus TorvaldsIgnoreMsgInAfterCmd:
2891da177e4SLinus Torvalds	CLEAR	ACK
2901da177e4SLinus Torvalds	JUMP	ResumeSendCommand
2911da177e4SLinus Torvalds
2921da177e4SLinus TorvaldsDisconnectAfterCmd:
2931da177e4SLinus Torvalds	CLEAR	ACK
2941da177e4SLinus Torvalds	WAIT	DISCONNECT
2951da177e4SLinus Torvalds	ENTRY	Disconnect1
2961da177e4SLinus TorvaldsDisconnect1:
2971da177e4SLinus Torvalds	INT	DISCONNECT_AFTER_CMD
2981da177e4SLinus Torvalds	ENTRY	Disconnect2
2991da177e4SLinus TorvaldsDisconnect2:
3001da177e4SLinus Torvalds; We return here after a reselection
3011da177e4SLinus Torvalds	CLEAR	ACK
3021da177e4SLinus Torvalds	JUMP	ResumeSendCommand
3031da177e4SLinus Torvalds
3041da177e4SLinus TorvaldsMsgInBeforeCommand:
3051da177e4SLinus Torvalds	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
3061da177e4SLinus Torvalds	JUMP	IgnoreMsgBeforeCommand, IF SAVE_DATA_PTRS_MSG
3071da177e4SLinus Torvalds	JUMP	IgnoreMsgBeforeCommand, IF RESTORE_DATA_PTRS_MSG
3081da177e4SLinus Torvalds	CALL	ProcessReceiveMessage
3091da177e4SLinus Torvalds	INT	MSG_IN_BEFORE_CMD
3101da177e4SLinus Torvalds	CLEAR	ACK
3111da177e4SLinus Torvalds	JUMP	SendCommand
3121da177e4SLinus Torvalds
3131da177e4SLinus TorvaldsDataIn:
3141da177e4SLinus Torvalds	CALL	SGScriptStartAddress
3151da177e4SLinus TorvaldsResumeDataIn:
3161da177e4SLinus Torvalds	JUMP	Finish, WHEN STATUS
3171da177e4SLinus Torvalds	JUMP	MsgInAfterDataIn, IF MSG_IN
3181da177e4SLinus Torvalds	JUMP	DataInAfterDataIn, if DATA_IN
3191da177e4SLinus Torvalds	INT	MSG_OUT_AFTER_DATA_IN, if MSG_OUT
3201da177e4SLinus Torvalds	INT	UNEXPECTED_PHASE_AFTER_DATA_IN
3211da177e4SLinus Torvalds
3221da177e4SLinus TorvaldsDataInAfterDataIn:
3231da177e4SLinus Torvalds	INT	DATA_IN_AFTER_DATA_IN
3241da177e4SLinus Torvalds	JUMP	ResumeDataIn
3251da177e4SLinus Torvalds
3261da177e4SLinus TorvaldsDataOut:
3271da177e4SLinus Torvalds	CALL	SGScriptStartAddress
3281da177e4SLinus TorvaldsResumeDataOut:
3291da177e4SLinus Torvalds	JUMP	Finish, WHEN STATUS
3301da177e4SLinus Torvalds	JUMP	MsgInAfterDataOut, IF MSG_IN
3311da177e4SLinus Torvalds	INT	UNEXPECTED_PHASE_AFTER_DATA_OUT
3321da177e4SLinus Torvalds
3331da177e4SLinus TorvaldsMsgInAfterDataIn:
3341da177e4SLinus Torvalds	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
3351da177e4SLinus Torvalds	JUMP	DisconnectAfterDataIn, IF DISCONNECT_MSG
3361da177e4SLinus Torvalds	JUMP	IgnoreMsgAfterData, IF SAVE_DATA_PTRS_MSG
3371da177e4SLinus Torvalds	JUMP	IgnoreMsgAfterData, IF RESTORE_DATA_PTRS_MSG
3381da177e4SLinus Torvalds	CALL	ProcessReceiveMessage
3391da177e4SLinus Torvalds	INT	MSG_IN_AFTER_DATA_IN
3401da177e4SLinus Torvalds	CLEAR	ACK
3411da177e4SLinus Torvalds	JUMP	ResumeDataIn
3421da177e4SLinus Torvalds
3431da177e4SLinus TorvaldsDisconnectDuringDataIn:
3441da177e4SLinus Torvalds	CLEAR	ACK
3451da177e4SLinus Torvalds	WAIT	DISCONNECT
3461da177e4SLinus Torvalds	ENTRY	Disconnect3
3471da177e4SLinus TorvaldsDisconnect3:
3481da177e4SLinus Torvalds	INT	DISCONNECT_DURING_DATA
3491da177e4SLinus Torvalds	ENTRY	Disconnect4
3501da177e4SLinus TorvaldsDisconnect4:
3511da177e4SLinus Torvalds; we return here after a reselection
3521da177e4SLinus Torvalds	CLEAR	ACK
3531da177e4SLinus Torvalds	JUMP	ResumeSendCommand
3541da177e4SLinus Torvalds
3551da177e4SLinus Torvalds
3561da177e4SLinus TorvaldsDisconnectAfterDataIn:
3571da177e4SLinus Torvalds	CLEAR	ACK
3581da177e4SLinus Torvalds	WAIT	DISCONNECT
3591da177e4SLinus Torvalds	ENTRY	Disconnect5
3601da177e4SLinus TorvaldsDisconnect5:
3611da177e4SLinus Torvalds	INT	DISCONNECT_AFTER_DATA
3621da177e4SLinus Torvalds	ENTRY	Disconnect6
3631da177e4SLinus TorvaldsDisconnect6:
3641da177e4SLinus Torvalds; we return here after a reselection
3651da177e4SLinus Torvalds	CLEAR	ACK
3661da177e4SLinus Torvalds	JUMP	ResumeDataIn
3671da177e4SLinus Torvalds
3681da177e4SLinus TorvaldsMsgInAfterDataOut:
3691da177e4SLinus Torvalds	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
3701da177e4SLinus Torvalds	JUMP	DisconnectAfterDataOut, if DISCONNECT_MSG
3711da177e4SLinus Torvalds	JUMP	IgnoreMsgAfterData, IF SAVE_DATA_PTRS_MSG
3721da177e4SLinus Torvalds	JUMP	IgnoreMsgAfterData, IF RESTORE_DATA_PTRS_MSG
3731da177e4SLinus Torvalds	CALL	ProcessReceiveMessage
3741da177e4SLinus Torvalds	INT	MSG_IN_AFTER_DATA_OUT
3751da177e4SLinus Torvalds	CLEAR	ACK
3761da177e4SLinus Torvalds	JUMP	ResumeDataOut
3771da177e4SLinus Torvalds
3781da177e4SLinus TorvaldsIgnoreMsgAfterData:
3791da177e4SLinus Torvalds	CLEAR	ACK
3801da177e4SLinus Torvalds; Data in and out do the same thing on resume, so pick one
3811da177e4SLinus Torvalds	JUMP	ResumeDataIn
3821da177e4SLinus Torvalds
3831da177e4SLinus TorvaldsDisconnectAfterDataOut:
3841da177e4SLinus Torvalds	CLEAR	ACK
3851da177e4SLinus Torvalds	WAIT	DISCONNECT
3861da177e4SLinus Torvalds	ENTRY	Disconnect7
3871da177e4SLinus TorvaldsDisconnect7:
3881da177e4SLinus Torvalds	INT	DISCONNECT_AFTER_DATA
3891da177e4SLinus Torvalds	ENTRY	Disconnect8
3901da177e4SLinus TorvaldsDisconnect8:
3911da177e4SLinus Torvalds; we return here after a reselection
3921da177e4SLinus Torvalds	CLEAR	ACK
3931da177e4SLinus Torvalds	JUMP	ResumeDataOut
3941da177e4SLinus Torvalds
3951da177e4SLinus TorvaldsFinish:
3961da177e4SLinus Torvalds	MOVE	1, StatusAddress, WHEN STATUS
3971da177e4SLinus Torvalds	INT	NOT_MSG_IN_AFTER_STATUS, WHEN NOT MSG_IN
3981da177e4SLinus Torvalds	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
3991da177e4SLinus Torvalds	JUMP	FinishCommandComplete, IF COMMAND_COMPLETE_MSG
4001da177e4SLinus Torvalds	CALL	ProcessReceiveMessage
4011da177e4SLinus Torvalds	INT	MSG_IN_AFTER_STATUS
4021da177e4SLinus Torvalds	ENTRY	FinishCommandComplete
4031da177e4SLinus TorvaldsFinishCommandComplete:
4041da177e4SLinus Torvalds	CLEAR	ACK
4051da177e4SLinus Torvalds	WAIT	DISCONNECT
4061da177e4SLinus Torvalds	ENTRY	Finish1
4071da177e4SLinus TorvaldsFinish1:
4081da177e4SLinus Torvalds	INT	GOOD_STATUS_AFTER_STATUS
4091da177e4SLinus Torvalds	ENTRY	Finish2
4101da177e4SLinus TorvaldsFinish2:
4111da177e4SLinus Torvalds
412