NetBSD/sys/dev/microcode/siop/oosiop.ss
tsutsui 7b4697bdbe 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.
2003-04-06 09:48:41 +00:00

151 lines
3.5 KiB
Scheme

; $NetBSD: oosiop.ss,v 1.2 2003/04/06 09:48:42 tsutsui Exp $
;
; 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
; 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. 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
; 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:
CLEAR ATN
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
JUMP REL(phasedispatch)
ENTRY sendmsg
sendmsg:
SET ATN
CLEAR ACK
msgout:
p_msgout_move:
MOVE 0, 0, WHEN MSG_OUT
CLEAR ATN
JUMP REL(phasedispatch)
cmdout:
CLEAR ATN
p_cmdout_move:
MOVE 0, 0, WHEN CMD
JUMP REL(phasedispatch)
status:
p_status_move:
MOVE 0, 0, WHEN STATUS
JUMP REL(phasedispatch)
disconnect:
CLEAR ACK
WAIT DISCONNECT
INT int_disc
complete:
CLEAR ACK
WAIT DISCONNECT
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