From 7b4697bdbe6320980d8b9fdb78d353b7bf9a6aa4 Mon Sep 17 00:00:00 2001 From: tsutsui Date: Sun, 6 Apr 2003 09:48:41 +0000 Subject: Add MI NCR/Symbios 53c700 SCSI driver. This "oosiop" driver was originally written by Shuichiro URATA for arc port, and then it was modified by me to make it work also on hp700. This driver has been tested on my NEC Express5800/240 with 53c700-66 for several months, and also tested on HP9000 735/125 with 53c700 (though current hp700 port has been broken since SA merge). Both sync transfer and disconnect/reselect work fine, but tagged queuing is not implemented yet. --- sys/dev/microcode/siop/oosiop.ss | 307 ++++++++++++++------------------------- 1 file changed, 107 insertions(+), 200 deletions(-) (limited to 'sys/dev/microcode') diff --git a/sys/dev/microcode/siop/oosiop.ss b/sys/dev/microcode/siop/oosiop.ss index 284b0aeca56..b1c084f803c 100644 --- a/sys/dev/microcode/siop/oosiop.ss +++ b/sys/dev/microcode/siop/oosiop.ss @@ -1,9 +1,7 @@ -; $NetBSD: oosiop.ss,v 1.1 2001/12/05 18:27:13 fredette Exp $ +; $NetBSD: oosiop.ss,v 1.2 2003/04/06 09:48:42 tsutsui Exp $ ; -; Copyright (c) 2001 Matt Fredette -; Copyright (c) 1995 Michael L. Hitch -; All rights reserved. +; Copyright (c) 2001 Shuichiro URATA. All rights reserved. ; ; Redistribution and use in source and binary forms, with or without ; modification, are permitted provided that the following conditions @@ -13,11 +11,8 @@ ; 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 +; 3. 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 @@ -33,211 +28,123 @@ ; 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 +; interrupt codes +ABSOLUTE int_done = 0xbeef0000 +ABSOLUTE int_msgin = 0xbeef0001 +ABSOLUTE int_extmsg = 0xbeef0002 +ABSOLUTE int_resel = 0xbeef0003 +ABSOLUTE int_res_id = 0xbeef0004 +ABSOLUTE int_resfail = 0xbeef0005 +ABSOLUTE int_disc = 0xbeef0006 +ABSOLUTE int_err = 0xdeadbeef + +; patch entries +ENTRY p_resel_msgin_move +ENTRY p_select +ENTRY p_datain_jump +ENTRY p_dataout_jump +ENTRY p_msgin_move +ENTRY p_msgout_move +ENTRY p_cmdout_move +ENTRY p_status_move +ENTRY p_extmsglen_move +ENTRY p_extmsgin_move + + +PROC oosiop_script: + +ENTRY wait_reselect +wait_reselect: + WAIT RESELECT REL(reselect_fail) + INT int_resel +reselect_fail: + INT int_resfail + +ENTRY wait_resel_identify +wait_resel_identify: + INT int_err, WHEN NOT MSG_IN +p_resel_msgin_move: + MOVE 0, 0, WHEN MSG_IN + INT int_res_id + +ENTRY start_select +start_select: +p_select: + SELECT ATN 0, REL(wait_reselect) + +ENTRY phasedispatch +phasedispatch: + JUMP REL(msgin), WHEN MSG_IN + JUMP REL(msgout), WHEN MSG_OUT + JUMP REL(status), WHEN STATUS + JUMP REL(cmdout), WHEN CMD +p_datain_jump: + JUMP 0, WHEN DATA_IN +p_dataout_jump: + JUMP 0, WHEN DATA_OUT + INT int_err 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: +p_msgin_move: + MOVE 0, 0, WHEN MSG_IN + JUMP REL(complete), IF 0x00 + JUMP REL(extmsgsetup), IF 0x01 + JUMP REL(disconnect), IF 0x04 + INT int_msgin + +ENTRY ack_msgin +ack_msgin: CLEAR ACK - MOVE 0, ds_ExtMsg, WHEN MSG_IN - JUMP sync_msg, IF 0x03 - int int_extmsg ; extended message not SDTR + JUMP REL(phasedispatch) -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. +ENTRY sendmsg +sendmsg: SET ATN CLEAR ACK - JUMP switch +msgout: +p_msgout_move: + MOVE 0, 0, WHEN MSG_OUT + CLEAR ATN + JUMP REL(phasedispatch) -disc: - CLEAR ACK - WAIT DISCONNECT +cmdout: + CLEAR ATN +p_cmdout_move: + MOVE 0, 0, WHEN CMD + JUMP REL(phasedispatch) - int int_disc_wodp ; signal disconnect w/o save DP +status: +p_status_move: + MOVE 0, 0, WHEN STATUS + JUMP REL(phasedispatch) -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 +disconnect: CLEAR ACK WAIT DISCONNECT + INT int_disc - 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 +complete: CLEAR ACK WAIT DISCONNECT - INT ok ; signal completion - JUMP wait_reselect + INT int_done + +; receive extended message length +extmsgsetup: + CLEAR ACK + INT int_err, IF NOT MSG_IN +p_extmsglen_move: + MOVE 0, 0, WHEN MSG_IN + INT int_extmsg + +; receive extended message +ENTRY rcv_extmsg +rcv_extmsg: + CLEAR ACK + INT int_err, IF NOT MSG_IN +p_extmsgin_move: + MOVE 0, 0, WHEN MSG_IN + INT int_msgin -- cgit