summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/sound/isa/ad1816.c4
-rw-r--r--sys/dev/sound/isa/ess.c10
-rw-r--r--sys/dev/sound/isa/mss.c16
3 files changed, 26 insertions, 4 deletions
diff --git a/sys/dev/sound/isa/ad1816.c b/sys/dev/sound/isa/ad1816.c
index 696b1a3..7eb8179 100644
--- a/sys/dev/sound/isa/ad1816.c
+++ b/sys/dev/sound/isa/ad1816.c
@@ -138,12 +138,16 @@ ad1816_intr(void *arg)
}
/* check for capture interupt */
if (sndbuf_runsz(ad1816->rch.buffer) && (c & AD1816_INTRCI)) {
+ ad1816_unlock(ad1816);
chn_intr(ad1816->rch.channel);
+ ad1816_lock(ad1816);
served |= AD1816_INTRCI; /* cp served */
}
/* check for playback interupt */
if (sndbuf_runsz(ad1816->pch.buffer) && (c & AD1816_INTRPI)) {
+ ad1816_unlock(ad1816);
chn_intr(ad1816->pch.channel);
+ ad1816_lock(ad1816);
served |= AD1816_INTRPI; /* pb served */
}
if (served == 0) {
diff --git a/sys/dev/sound/isa/ess.c b/sys/dev/sound/isa/ess.c
index 248aebe..64d617c 100644
--- a/sys/dev/sound/isa/ess.c
+++ b/sys/dev/sound/isa/ess.c
@@ -361,8 +361,11 @@ ess_intr(void *arg)
rirq = (src & sc->rch.hwch)? 1 : 0;
if (pirq) {
- if (sc->pch.run)
+ if (sc->pch.run) {
+ ess_unlock(sc);
chn_intr(sc->pch.channel);
+ ess_lock(sc);
+ }
if (sc->pch.stopping) {
sc->pch.run = 0;
sndbuf_dma(sc->pch.buffer, PCMTRIG_STOP);
@@ -375,8 +378,11 @@ ess_intr(void *arg)
}
if (rirq) {
- if (sc->rch.run)
+ if (sc->rch.run) {
+ ess_unlock(sc);
chn_intr(sc->rch.channel);
+ ess_lock(sc);
+ }
if (sc->rch.stopping) {
sc->rch.run = 0;
sndbuf_dma(sc->rch.buffer, PCMTRIG_STOP);
diff --git a/sys/dev/sound/isa/mss.c b/sys/dev/sound/isa/mss.c
index 5ff38fc..53bf70e 100644
--- a/sys/dev/sound/isa/mss.c
+++ b/sys/dev/sound/isa/mss.c
@@ -795,11 +795,15 @@ mss_intr(void *arg)
c &= ~served;
if (sndbuf_runsz(mss->pch.buffer) && (c & 0x10)) {
served |= 0x10;
+ mss_unlock(mss);
chn_intr(mss->pch.channel);
+ mss_lock(mss);
}
if (sndbuf_runsz(mss->rch.buffer) && (c & 0x20)) {
served |= 0x20;
+ mss_unlock(mss);
chn_intr(mss->rch.channel);
+ mss_unlock(mss);
}
/* now ack the interrupt */
if (FULL_DUPLEX(mss)) ad_write(mss, 24, ~c); /* ack selectively */
@@ -1111,8 +1115,16 @@ opti931_intr(void *arg)
return;
}
- if (sndbuf_runsz(mss->rch.buffer) && (mc11 & 8)) chn_intr(mss->rch.channel);
- if (sndbuf_runsz(mss->pch.buffer) && (mc11 & 4)) chn_intr(mss->pch.channel);
+ if (sndbuf_runsz(mss->rch.buffer) && (mc11 & 8)) {
+ mss_unlock(mss);
+ chn_intr(mss->rch.channel);
+ mss_lock(mss);
+ }
+ if (sndbuf_runsz(mss->pch.buffer) && (mc11 & 4)) {
+ mss_unlock(mss);
+ chn_intr(mss->pch.channel);
+ mss_lock(mss);
+ }
opti_wr(mss, 11, ~mc11); /* ack */
if (--loops) goto again;
mss_unlock(mss);
OpenPOWER on IntegriCloud