summaryrefslogtreecommitdiff
path: root/sys/arch/sparc
diff options
context:
space:
mode:
authorJason Wright <jason@cvs.openbsd.org>2002-01-11 00:11:42 +0000
committerJason Wright <jason@cvs.openbsd.org>2002-01-11 00:11:42 +0000
commit3e3650d9509f45221f3c86696a83e53df53f3ec9 (patch)
treef374b2500b6eedfd1b90442f0c55611ae45cf6fb /sys/arch/sparc
parent61f7997e1714f586a704ae49a791587c442e5c1d (diff)
Only check for playback interrupts if we're actually expecting them.
(This fixes the crash in pr2212, but the magma still doesn't want to talk to the world... looks like oscillator problems). [Many thanks to John Baker <jdbaker@blkbox.com> for donating a MAGMA board for testing]
Diffstat (limited to 'sys/arch/sparc')
-rw-r--r--sys/arch/sparc/dev/cs4231.c53
-rw-r--r--sys/arch/sparc/dev/cs4231var.h3
2 files changed, 32 insertions, 24 deletions
diff --git a/sys/arch/sparc/dev/cs4231.c b/sys/arch/sparc/dev/cs4231.c
index 44e491f4dda..4cf5c40d7ff 100644
--- a/sys/arch/sparc/dev/cs4231.c
+++ b/sys/arch/sparc/dev/cs4231.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cs4231.c,v 1.5 2000/09/18 16:57:34 brad Exp $ */
+/* $OpenBSD: cs4231.c,v 1.6 2002/01/11 00:11:41 jason Exp $ */
/*
* Copyright (c) 1999 Jason L. Wright (jason@thought.net)
@@ -271,37 +271,42 @@ cs4231_hwintr(v)
}
regs->dma_csr = csr;
- if (csr & (CS_DMACSR_PI|CS_DMACSR_PMI|CS_DMACSR_PIE|CS_DMACSR_PD))
- r = 1;
-
- if (csr & CS_DMACSR_PM) {
- u_int32_t nextaddr, togo;
-
- p = sc->sc_nowplaying;
- togo = sc->sc_playsegsz - sc->sc_playcnt;
- if (togo == 0) {
- nextaddr = (u_int32_t)p->addr_dva;
- sc->sc_playcnt = togo = sc->sc_blksz;
- } else {
- nextaddr = regs->dma_pnva + sc->sc_blksz;
- if (togo > sc->sc_blksz)
- togo = sc->sc_blksz;
- sc->sc_playcnt += togo;
- }
- regs->dma_pnva = nextaddr;
- regs->dma_pnc = togo;
- if (sc->sc_pintr != NULL)
- (*sc->sc_pintr)(sc->sc_parg);
- r = 1;
+ if (sc->sc_playing) {
+ if (csr & (CS_DMACSR_PI|CS_DMACSR_PMI|CS_DMACSR_PIE|CS_DMACSR_PD))
+ r = 1;
+
+ if (csr & CS_DMACSR_PM) {
+ u_int32_t nextaddr, togo;
+
+ p = sc->sc_nowplaying;
+ togo = sc->sc_playsegsz - sc->sc_playcnt;
+ if (togo == 0) {
+ nextaddr = (u_int32_t)p->addr_dva;
+ sc->sc_playcnt = togo = sc->sc_blksz;
+ } else {
+ nextaddr = regs->dma_pnva + sc->sc_blksz;
+ if (togo > sc->sc_blksz)
+ togo = sc->sc_blksz;
+ sc->sc_playcnt += togo;
+ }
+
+ regs->dma_pnva = nextaddr;
+ regs->dma_pnc = togo;
+ if (sc->sc_pintr != NULL)
+ (*sc->sc_pintr)(sc->sc_parg);
+ r = 1;
+ }
}
+#if 0
if (csr & CS_DMACSR_CI) {
if (sc->sc_rintr != NULL) {
r = 1;
(*sc->sc_rintr)(sc->sc_rarg);
}
}
+#endif
return (r);
}
@@ -787,6 +792,7 @@ cs4231_halt_output(addr)
regs->iar = CS_IAR_IC;
regs->idr = r;
sc->sc_locked = 0;
+ sc->sc_playing = 0;
return (0);
}
@@ -1439,6 +1445,7 @@ cs4231_trigger_output(addr, start, end, blksize, intr, arg, param)
sc->sc_locked = 1;
sc->sc_pintr = intr;
sc->sc_parg = arg;
+ sc->sc_playing = 1;
p = sc->sc_dmas;
while (p != NULL && p->addr != start)
diff --git a/sys/arch/sparc/dev/cs4231var.h b/sys/arch/sparc/dev/cs4231var.h
index 90ae2b26c42..9258080ddd1 100644
--- a/sys/arch/sparc/dev/cs4231var.h
+++ b/sys/arch/sparc/dev/cs4231var.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: cs4231var.h,v 1.3 2001/10/05 17:32:20 jason Exp $ */
+/* $OpenBSD: cs4231var.h,v 1.4 2002/01/11 00:11:41 jason Exp $ */
/*
* Copyright (c) 1999 Jason L. Wright (jason@thought.net)
@@ -78,6 +78,7 @@ struct cs4231_softc {
u_int32_t sc_blksz;
u_int32_t sc_playcnt;
u_int32_t sc_playsegsz;
+ int sc_playing; /* currently playing */
struct cs_dma *sc_dmas; /* dma list */
struct cs_dma *sc_nowplaying;
};