From 8dce160cd1fa024a8ba3539d43d1c53e83f93913 Mon Sep 17 00:00:00 2001 From: fredette Date: Wed, 5 Dec 2001 18:27:13 +0000 Subject: New script for the Symbios/NCR 53c700 SCSI controller. This is closely related to osiop.ss, the script for the 53c710. --- sys/dev/microcode/siop/oosiop.ss | 243 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 sys/dev/microcode/siop/oosiop.ss (limited to 'sys/dev/microcode') diff --git a/sys/dev/microcode/siop/oosiop.ss b/sys/dev/microcode/siop/oosiop.ss new file mode 100644 index 00000000000..284b0aeca56 --- /dev/null +++ b/sys/dev/microcode/siop/oosiop.ss @@ -0,0 +1,243 @@ +; $NetBSD: oosiop.ss,v 1.1 2001/12/05 18:27:13 fredette Exp $ + +; +; Copyright (c) 2001 Matt Fredette +; Copyright (c) 1995 Michael L. Hitch +; All rights reserved. +; +; Redistribution and use in source and binary forms, with or without +; modification, are permitted provided that the following conditions +; are met: +; 1. Redistributions of source code must retain the above copyright +; notice, this list of conditions and the following disclaimer. +; 2. Redistributions in binary form must reproduce the above copyright +; notice, this list of conditions and the following disclaimer in the +; documentation and/or other materials provided with the distribution. +; 3. All advertising materials mentioning features or use of this software +; must display the following acknowledgement: +; This product includes software developed by Michael L. Hitch. +; 4. The name of the author may not be used to endorse or promote products +; derived from this software without specific prior written permission +; +; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +; + +; NCR 53c700 script +; +ARCH 700 +; +EXTERNAL ds_Device +EXTERNAL ds_MsgOut +EXTERNAL ds_Cmd +EXTERNAL ds_Status +EXTERNAL ds_Msg +EXTERNAL ds_MsgIn +EXTERNAL ds_ExtMsg +EXTERNAL ds_SyncMsg +EXTERNAL ds_Data1 + + +ABSOLUTE ok = 0xff00 +ABSOLUTE int_disc = 0xff01 +ABSOLUTE int_disc_wodp = 0xff02 +ABSOLUTE int_reconnect = 0xff03 +ABSOLUTE int_connect = 0xff04 +ABSOLUTE int_phase = 0xff05 +ABSOLUTE int_msgin = 0xff06 +ABSOLUTE int_extmsg = 0xff07 +ABSOLUTE int_msgsdp = 0xff08 +ABSOLUTE int_identify = 0xff09 +ABSOLUTE int_status = 0xff0a +ABSOLUTE int_syncmsg = 0xff0b + +ENTRY scripts +ENTRY switch +ENTRY wait_reselect +ENTRY dataout +ENTRY datain +ENTRY clear_ack + +PROC oosiop_script: + +scripts: + + SELECT ATN ds_Device, reselect +; +switch: + JUMP msgin, WHEN MSG_IN + JUMP msgout, IF MSG_OUT + JUMP command_phase, IF CMD + JUMP dataout, IF DATA_OUT + JUMP datain, IF DATA_IN + JUMP end, IF STATUS + + INT int_phase ; Unrecognized phase + +msgin: + MOVE 0, ds_MsgIn, WHEN MSG_IN + JUMP ext_msg, IF 0x01 ; extended message + JUMP disc, IF 0x04 ; disconnect message + JUMP msg_sdp, IF 0x02 ; save data pointers + JUMP msg_rej, IF 0x07 ; message reject + JUMP msg_rdp, IF 0x03 ; restore data pointers + INT int_msgin ; unrecognized message + +msg_rej: +; Do we need to interrupt host here to let it handle the reject? +msg_rdp: +clear_ack: + CLEAR ACK + CLEAR ATN + JUMP switch + +ext_msg: + CLEAR ACK + MOVE 0, ds_ExtMsg, WHEN MSG_IN + JUMP sync_msg, IF 0x03 + int int_extmsg ; extended message not SDTR + +sync_msg: + CLEAR ACK + MOVE 0, ds_SyncMsg, WHEN MSG_IN + int int_syncmsg ; Let host handle the message +; If we continue from the interrupt, the host has set up a response +; message to be sent. Set ATN, clear ACK, and continue. + SET ATN + CLEAR ACK + JUMP switch + +disc: + CLEAR ACK + WAIT DISCONNECT + + int int_disc_wodp ; signal disconnect w/o save DP + +msg_sdp: + CLEAR ACK ; acknowledge message + JUMP switch, WHEN NOT MSG_IN + MOVE 0, ds_ExtMsg, WHEN MSG_IN + INT int_msgsdp, IF NOT 0x04 ; interrupt if not disconnect + CLEAR ACK + WAIT DISCONNECT + + INT int_disc ; signal disconnect + +reselect: +wait_reselect: + WAIT RESELECT select_adr + ; NB: these NOPs are CRITICAL to preserve the 1:1 + ; correspondence between instructions in this script + ; and instructions in the osiop (53c710) script: + NOP + NOP ; reselect ID already in SFBR + + INT int_identify, WHEN NOT MSG_IN + MOVE 0, ds_Msg, WHEN MSG_IN + INT int_reconnect ; let host know about reconnect + CLEAR ACK ; acknowlege the message + JUMP switch + +select_adr: + MOVE SCNTL1 & 0x10 to SFBR ; get connected status + INT int_connect, IF 0x00 ; tell host if not connected + NOP ; Sig_P doesn't exist on the 53c700 + JUMP wait_reselect ; and try reselect again + +msgout: + MOVE 0, ds_MsgOut, WHEN MSG_OUT + JUMP switch + +command_phase: + CLEAR ATN + MOVE 0, ds_Cmd, WHEN CMD + JUMP switch + +dataout: + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch, WHEN NOT DATA_OUT + MOVE 0, ds_Data1, WHEN DATA_OUT + CALL switch + +datain: + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch, WHEN NOT DATA_IN + MOVE 0, ds_Data1, WHEN DATA_IN + CALL switch + +end: + MOVE 0, ds_Status, WHEN STATUS + int int_status, WHEN NOT MSG_IN ; status not followed by msg + MOVE 0, ds_Msg, WHEN MSG_IN + CLEAR ACK + WAIT DISCONNECT + INT ok ; signal completion + JUMP wait_reselect -- cgit