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

Re: Fujitsu MB87030/MB89352 (SPC) manual



<20040906.031329.112788630.oshimaya@sc.starcat.ne.jp>の記事において
oshimaya@sc.starcat.ne.jpさんは書きました。

> おおしまです。
 :
> 問題のデバイスを繋げて試してみました。結果、私の環境ではa) b)ともに
> 正常に動作しています。

どうもありがとうございます。 status phase のときは
TEMP register 経由のマニュアル転送で問題ないみたいですね。

spc_msgin() のほうをさらにいろいろ眺めてたんですが、
spc_intr() の中では bus free になったかどうかを
INTS register の INTS_DISCON を見て判断しているので、
spc_msgin() の中でも BUSY を直接見るよりも
NO_MANUAL_XFER の中でしているのと同じように
PCTL レジスタの PCTL_BFINT_ENAB を立てて
bus free になったら INTS register が立つように
すべきかなあ、という気もしてきました。

これから試される方は今回添付のパッチを試してみて下さい。
#おおしまさんのところではたぶんどちらでも同じと思いますが……
---
Izumi Tsutsui
tsutsui@ceres.dti.ne.jp


Index: mb89352.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/mb89352.c,v
retrieving revision 1.32
diff -u -r1.32 mb89352.c
--- mb89352.c	12 Aug 2004 03:39:11 -0000	1.32
+++ mb89352.c	8 Sep 2004 15:57:45 -0000
@@ -1006,20 +1006,21 @@
 #else
 		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, PCTL_BFINT_ENAB | PH_MSGIN);
 
 		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)
+			    != PH_MSGIN ||
+			    bus_space_read_1(iot, ioh, INTS) != 0)
 				/*
 				 * Target left MESSAGE IN, probably because it
 				 * a) noticed our ATN signal, or
 				 * b) ran out of messages.
 				 */
 				goto out;
+			DELAY(1); /* XXX needs timeout */
 		}
 
-		bus_space_write_1(iot, ioh, PCTL, PH_MSGIN);
 		msg = bus_space_read_1(iot, ioh, TEMP);
 #endif
 
@@ -1056,7 +1057,7 @@
 		/* Ack the last byte read. */
 		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 */
+			DELAY(1);	/* XXX needs timeout */
 		bus_space_write_1(iot, ioh, SCMD, SCMD_RST_ACK);
 #endif
 	}
@@ -1233,7 +1234,7 @@
 	/* Ack the last message byte. */
 	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 */
+		DELAY(1);	/* XXX needs timeout */
 	bus_space_write_1(iot, ioh, SCMD, SCMD_RST_ACK);
 #endif
 
@@ -1425,7 +1426,7 @@
 #endif
 
 		while ((bus_space_read_1(iot, ioh, SSTS) & SSTS_DREG_FULL) != 0)
-			;
+			DELAY(1);
 		/* Send message byte. */
 		bus_space_write_1(iot, ioh, DREG, *--sc->sc_omp);
 		--n;
@@ -1497,6 +1498,7 @@
 			break;
 		if (bus_space_read_1(iot, ioh, INTS) != 0)
 			break;
+		DELAY(1);
 	}
 
 	/*
@@ -1516,6 +1518,7 @@
 			/* Break on interrupt. */
 			if (intstat != 0)
 				goto phasechange;
+			DELAY(1);
 		}
 
 		xfer = min(DOUTAMOUNT, n);
@@ -1546,6 +1549,7 @@
 			/* Break on interrupt. */
 			if (intstat != 0)
 				goto phasechange;
+			DELAY(1);
 		}
 	}
 
@@ -1643,6 +1647,7 @@
 					goto phasechange;
 				intstat = bus_space_read_1(iot, ioh, INTS);
 			}
+			DELAY(1);
 		}
 		SPC_MISC(("extra data  "));
 	}
@@ -1674,18 +1679,18 @@
 	struct spc_tinfo *ti;
 	int n;
 
+	SPC_TRACE(("spc_intr  "));
+
+	ints = bus_space_read_1(iot, ioh, INTS);
+	if (ints == 0)
+		return 0;
+
 	/*
 	 * Disable interrupt.
 	 */
 	bus_space_write_1(iot, ioh, SCTL,
 	    bus_space_read_1(iot, ioh, SCTL) & ~SCTL_INTR_ENAB);
 
-	SPC_TRACE(("spc_intr  "));
-
-	ints = bus_space_read_1(iot, ioh, INTS);
-	if (ints == 0)
-		goto out;
-
 	if (sc->sc_dma_done != NULL &&
 	    sc->sc_state == SPC_CONNECTED &&
 	    (sc->sc_flags & SPC_DOINGDMA) != 0 &&
@@ -1943,7 +1948,7 @@
 	bus_space_write_1(iot, ioh, INTS, ints);
 	ints = 0;
 	while ((bus_space_read_1(iot, ioh, PSNS) & PSNS_REQ) == 0)
-		delay(1);	/* need timeout XXX */
+		DELAY(1);	/* need timeout XXX */
 #endif
 
 	/*
@@ -2027,20 +2032,16 @@
 		SPC_ASSERT(sc->sc_nexus != NULL);
 		acb = sc->sc_nexus;
 
-#ifdef NO_MANUAL_XFER
-		spc_datain_pio(sc, &acb->target_stat, 1);
-#else
 		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, PCTL_BFINT_ENAB | 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);
+			DELAY(1);	/* XXX needs timeout */
 		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 */
+			DELAY(1);	/* XXX needs timeout */
 		bus_space_write_1(iot, ioh, SCMD, SCMD_RST_ACK);
-#endif
 
 		SPC_MISC(("target_stat=0x%02x  ", acb->target_stat));
 		sc->sc_prevphase = PH_STAT;