[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Fujitsu MB87030/MB89352 (SPC) manual



筒井です。テストどうもありがとうございます。

<20030719133259T.isaki@par.odn.ne.jp>の記事において
isaki@par.odn.ne.jpさんは書きました。

> > 前者の変更が問題だとするとますます謎の #ifdef x68k が必要になるかも……
 :
> 前者は前と同様に固まってしまいました。

というわけで message-in と status を TEMP レジスタ経由の
手動で転送するようにした変更のほうが引っかかってるわけですが、
ひとまず思いつく修正をいろいろ入れたもの(添付diff)を
http://www.ceres.dti.ne.jp/~tsutsui/netbsd/netbsd-x68k-GENERIC-20030713-3.gz
に置いたのでまた試してみて下さい。

#本来ならどこの busy loop でひっかかってるか調べるべきですけど……

これでもダメだとすると x68k では TEMP レジスタ経由ではなく
SCMD_XFR コマンドの DREG レジスタ経由でないとダメ、
ということになって #ifdef x68k は避けられないかも……
---
Izumi Tsutsui
tsutsui@ceres.dti.ne.jp

--- /sys/dev/ic/mb89352.c	2003-07-06 05:12:01.000000000 +0900
+++ mb89352.c	2003-07-19 15:29:28.000000000 +0900
@@ -893,9 +893,11 @@
 	bus_space_tag_t iot = sc->sc_iot;
 	bus_space_handle_t ioh = sc->sc_ioh;
 	int n;
+	u_int8_t msg;
 
 	SPC_TRACE(("spc_msgin  "));
 
+	bus_space_write_1(iot, ioh, PCTL, PH_MSGIN);
 	if (sc->sc_prevphase == PH_MSGIN) {
 		/* This is a continuation of the previous message. */
 		n = sc->sc_imp - sc->sc_imess;
@@ -929,13 +931,15 @@
 		while ((bus_space_read_1(iot, ioh, PSNS) & PSNS_REQ) == 0) {
 			/* XXX needs timeout */
 			if ((bus_space_read_1(iot, ioh, PSNS) & PH_MASK)
-			     != PH_MSGIN ||
-			    (bus_space_read_1(iot, ioh, SSTS) & SSTS_INITIATOR)
-			     == 0)
+			     != PH_MSGIN)
+				/*
+				 * Target left MESSAGE_IN, probably because it
+				 * a) noticed our ATN signal, or
+				 * b) ran out of messages.
+				 */
 				goto out;
 		}
-
-		bus_space_write_1(iot, ioh, PCTL, PH_MSGIN);
+		msg = bus_space_read_1(iot, ioh, TEMP);
 		bus_space_write_1(iot, ioh, SCMD, SCMD_SET_ACK);
 		while ((bus_space_read_1(iot, ioh, PSNS) & PSNS_REQ) != 0)
 			continue;	/* XXX needs timeout */
@@ -943,12 +947,10 @@
 		/* Gather incoming message bytes if needed. */
 		if ((sc->sc_flags & SPC_DROP_MSGIN) == 0) {
 			if (n >= SPC_MAX_MSG_LEN) {
-				(void) bus_space_read_1(iot, ioh, TEMP);
 				sc->sc_flags |= SPC_DROP_MSGIN;
 				spc_sched_msgout(sc, SEND_REJECT);
 			} else {
-				*sc->sc_imp++ =
-				    bus_space_read_1(iot, ioh, TEMP);
+				*sc->sc_imp++ = msg;
 				n++;
 				/*
 				 * This testing is suboptimal, but most
@@ -964,8 +966,7 @@
 				    n == sc->sc_imess[1] + 2)
 					break;
 			}
-		} else
-			(void) bus_space_read_1(iot, ioh, TEMP);
+		}
 
 		/*
 		 * If we reach this spot we're either:
@@ -1152,12 +1153,9 @@
 	goto nextmsg;
 
 out:
+	/* Ack the last message byte. */
 	bus_space_write_1(iot, ioh, SCMD, SCMD_RST_ACK);
 	SPC_MISC(("n=%d imess=0x%02x  ", n, sc->sc_imess[0]));
-
-	while ((bus_space_read_1(iot, ioh, SSTS) & SSTS_ACTIVE) 
-	    == SSTS_INITIATOR)
-		continue;	/* XXX needs timeout */
 }
 
 /*
@@ -1960,13 +1958,13 @@
 
 		if ((bus_space_read_1(iot, ioh, PSNS) & PSNS_ATN) != 0)
 			bus_space_write_1(iot, ioh, SCMD, SCMD_RST_ATN);
+		bus_space_write_1(iot, ioh, PCTL, PH_STAT);
 		while ((bus_space_read_1(iot, ioh, PSNS) & PSNS_REQ) == 0)
 			continue;	/* XXX needs timeout */
-		bus_space_write_1(iot, ioh, PCTL, PH_STAT);
+		acb->target_stat = bus_space_read_1(iot, ioh, TEMP);
 		bus_space_write_1(iot, ioh, SCMD, SCMD_SET_ACK);
 		while ((bus_space_read_1(iot, ioh, PSNS) & PSNS_REQ) != 0)
 			continue;	/* XXX needs timeout */
-		acb->target_stat = bus_space_read_1(iot, ioh, TEMP);
 		bus_space_write_1(iot, ioh, SCMD, SCMD_RST_ACK);
 
 		SPC_MISC(("target_stat=0x%02x  ", acb->target_stat));