[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;