summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorjmcneill <jmcneill@NetBSD.org>2001-12-25 02:37:39 +0000
committerjmcneill <jmcneill@NetBSD.org>2001-12-25 02:37:39 +0000
commitc4669fd0d0374c80355fc32c470d34f2f6b2ed8e (patch)
treee6d724f410544d7e783e41cff7b9fa313eaa7352 /sys/dev
parent0228f218d3d2101b5067e14508a5c0d176c99714 (diff)
Fixes output at 44kHz, 16-bit, stereo. Thanks to Charles Hannum and
Lennart Augustsson for providing proper fixes.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/pcmcia/esl.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/sys/dev/pcmcia/esl.c b/sys/dev/pcmcia/esl.c
index ca4acf1f3ef..a48947a8aff 100644
--- a/sys/dev/pcmcia/esl.c
+++ b/sys/dev/pcmcia/esl.c
@@ -1,4 +1,4 @@
-/* $NetBSD: esl.c,v 1.6 2001/11/13 07:26:32 lukem Exp $ */
+/* $NetBSD: esl.c,v 1.7 2001/12/25 02:37:39 jmcneill Exp $ */
/*
* Copyright (c) 2001 Jared D. McNeill <jmcneill@invisible.yi.org>
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: esl.c,v 1.6 2001/11/13 07:26:32 lukem Exp $");
+__KERNEL_RCSID(0, "$NetBSD: esl.c,v 1.7 2001/12/25 02:37:39 jmcneill Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -648,20 +648,24 @@ esl_intr(void *hdl)
reg = bus_space_read_1(iot, ioh, ESS_CLEAR_INTR);
if (sc->sc_esl.active) {
- pos = sc->sc_esl.sc_dmaaddr;
- bus_space_write_multi_1(iot, ioh, ESS_FIFO_WRITE, pos,
- ESS_FIFO_SIZE / 2);
-
- sc->sc_esl.sc_blkpos += (ESS_FIFO_SIZE / 2);
- if (sc->sc_esl.sc_blkpos > sc->sc_esl.sc_blksize) {
- (*sc->sc_esl.intr)(sc->sc_esl.arg);
- sc->sc_esl.sc_blkpos -= sc->sc_esl.sc_blksize;
+ reg = bus_space_read_1(iot, ioh, ESS_DSP_RW_STATUS);
+ while (reg & ESS_DSP_READ_HALF) {
+ pos = sc->sc_esl.sc_dmaaddr;
+ bus_space_write_multi_1(iot, ioh, ESS_FIFO_WRITE, pos,
+ ESS_FIFO_SIZE / 2);
+
+ sc->sc_esl.sc_blkpos += (ESS_FIFO_SIZE / 2);
+ if (sc->sc_esl.sc_blkpos > sc->sc_esl.sc_blksize) {
+ (*sc->sc_esl.intr)(sc->sc_esl.arg);
+ sc->sc_esl.sc_blkpos -= sc->sc_esl.sc_blksize;
+ }
+ pos += (ESS_FIFO_SIZE / 2);
+ if (pos >= sc->sc_esl.sc_dmaend)
+ pos = sc->sc_esl.sc_dmastart;
+
+ sc->sc_esl.sc_dmaaddr = pos;
+ reg = bus_space_read_1(iot, ioh, ESS_DSP_RW_STATUS);
}
- pos += (ESS_FIFO_SIZE / 2);
- if (pos >= sc->sc_esl.sc_dmaend)
- pos = sc->sc_esl.sc_dmastart;
-
- sc->sc_esl.sc_dmaaddr = pos;
}
return (1);