From 41af47376ff68f5ec8d0cb4cbb4dd136ce64bceb Mon Sep 17 00:00:00 2001 From: bouyer Date: Thu, 2 May 2002 12:37:19 +0000 Subject: [PATCH] Move a few things around, to save some JUMP. --- sys/dev/microcode/siop/esiop.ss | 106 +++++++++++++++----------------- 1 file changed, 51 insertions(+), 55 deletions(-) diff --git a/sys/dev/microcode/siop/esiop.ss b/sys/dev/microcode/siop/esiop.ss index 8d62050de7bf..48aa71d35162 100644 --- a/sys/dev/microcode/siop/esiop.ss +++ b/sys/dev/microcode/siop/esiop.ss @@ -1,4 +1,4 @@ -; $NetBSD: esiop.ss,v 1.12 2002/04/27 18:46:50 bouyer Exp $ +; $NetBSD: esiop.ss,v 1.13 2002/05/02 12:37:19 bouyer Exp $ ; ; Copyright (c) 2002 Manuel Bouyer. @@ -176,7 +176,6 @@ nextisn: CLEAR ACK; INT int_msgin, IF NOT 0x20; not a simple tag message, let host handle it MOVE 1, abs_msgin2, WHEN MSG_IN; get tag - CLEAR ACK; MOVE SFBR to SCRATCHA2; MOVE SFBR to SCRATCHC3; MOVE SCRATCHC0 | f_c_tag to SCRATCHC0; save TAG @@ -197,12 +196,59 @@ nextisn: MOVE DSA2 + 0x00 TO DSA2 with CARRY; MOVE DSA3 + 0x00 TO DSA3 with CARRY; SCRACHA(2,3) + DSA to DSA LOAD DSA0, 4, from 0; load DSA for this tag - JUMP REL(waitphase); +msgin_ack: + CLEAR ACK; +waitphase: + JUMP REL(msgout), WHEN MSG_OUT; + JUMP REL(msgin), WHEN MSG_IN; + JUMP REL(dataout), WHEN DATA_OUT; + JUMP REL(datain), WHEN DATA_IN; + JUMP REL(cmdout), WHEN CMD; + JUMP REL(status), WHEN STATUS; + INT int_err; + +handle_cmpl: + CALL REL(disconnect); + MOVE SCRATCHE1 to SFBR; + INT int_done, IF NOT 0x00; if status is not "done", let host handle it + MOVE SCRATCHF0 to SFBR; load pointer in done ring + MOVE SFBR to DSA0; + MOVE SCRATCHF1 to SFBR; + MOVE SFBR to DSA1; + MOVE SCRATCHF2 to SFBR; + MOVE SFBR to DSA2; + MOVE SCRATCHF3 to SFBR; + MOVE SFBR to DSA3; +wait_free: + LOAD SCRATCHA0, 1, from 0; + MOVE SCRATCHA0 to SFBR; + JUMP REL(wait_free), if not 0; wait for slot to be free + STORE NOFLUSH SCRATCHC0, 4, from 0; save current target/lun/flag + MOVE SCRATCHF0 + 4 to SCRATCHF0; advance to next slot + MOVE SCRATCHF1 + 0 to SCRATCHF1 with carry; + MOVE SCRATCHF2 + 0 to SCRATCHF2 with carry; + MOVE SCRATCHF3 + 0 to SCRATCHF3 with carry; + MOVE SCRATCHE2 + 1 to SCRATCHE2; + MOVE SCRATCHE2 to SFBR; + JUMP REL(is_done), if not ndone_slots_last; +doner0: + MOVE 0xff to SCRATCHF0; driver will change 0xff to base of ring +doner1: + MOVE 0xff to SCRATCHF1; +doner2: + MOVE 0xff to SCRATCHF2; +doner3: + MOVE 0xff to SCRATCHF3; + MOVE 0 to SCRATCHE2; +is_done: + LOAD SCRATCHB0, 4, abs_sem; signal that a command is done + MOVE SCRATCHB0 | sem_done TO SCRATCHB0; + STORE NOFLUSH SCRATCHB0, 4, abs_sem; +; and attempt next command reselect_fail: - ; check that host asserted SIGP, this'll clear SIGP in ISTAT + ; clear SIGP in ISTAT MOVE CTEST2 & 0x40 TO SFBR; - INT int_resfail, IF 0x00; script_sched: ; Load ring DSA MOVE SCRATCHD0 to SFBR; @@ -282,17 +328,6 @@ msgout: CLEAR ATN; JUMP REL(waitphase); -msgin_ack: - CLEAR ACK; -waitphase: - JUMP REL(msgout), WHEN MSG_OUT; - JUMP REL(msgin), WHEN MSG_IN; - JUMP REL(dataout), WHEN DATA_OUT; - JUMP REL(datain), WHEN DATA_IN; - JUMP REL(cmdout), WHEN CMD; - JUMP REL(status), WHEN STATUS; - INT int_err; - handle_sdp: CLEAR ACK; @@ -381,45 +416,6 @@ disconnect: WAIT DISCONNECT; RETURN; -handle_cmpl: - CALL REL(disconnect); - MOVE SCRATCHE1 to SFBR; - INT int_done, IF NOT 0x00; if status is not "done", let host handle it - MOVE SCRATCHF0 to SFBR; load pointer in done ring - MOVE SFBR to DSA0; - MOVE SCRATCHF1 to SFBR; - MOVE SFBR to DSA1; - MOVE SCRATCHF2 to SFBR; - MOVE SFBR to DSA2; - MOVE SCRATCHF3 to SFBR; - MOVE SFBR to DSA3; -wait_free: - LOAD SCRATCHA0, 1, from 0; - MOVE SCRATCHA0 to SFBR; - JUMP REL(wait_free), if not 0; wait for slot to be free - STORE NOFLUSH SCRATCHC0, 4, from 0; save current target/lun/flag - MOVE SCRATCHF0 + 4 to SCRATCHF0; advance to next slot - MOVE SCRATCHF1 + 0 to SCRATCHF1 with carry; - MOVE SCRATCHF2 + 0 to SCRATCHF2 with carry; - MOVE SCRATCHF3 + 0 to SCRATCHF3 with carry; - MOVE SCRATCHE2 + 1 to SCRATCHE2; - MOVE SCRATCHE2 to SFBR; - JUMP REL(is_done), if not ndone_slots_last; -doner0: - MOVE 0xff to SCRATCHF0; driver will change 0xff to base of ring -doner1: - MOVE 0xff to SCRATCHF1; -doner2: - MOVE 0xff to SCRATCHF2; -doner3: - MOVE 0xff to SCRATCHF3; - MOVE 0 to SCRATCHE2; -is_done: - LOAD SCRATCHB0, 4, abs_sem; signal that a command is done - MOVE SCRATCHB0 | sem_done TO SCRATCHB0; - STORE NOFLUSH SCRATCHB0, 4, abs_sem; - JUMP REL(script_sched); and attempt next command - handle_extin: CLEAR ACK; MOVE FROM t_ext_msg_in, WHEN MSG_IN;