diff options
author | netchild <netchild@FreeBSD.org> | 2005-07-31 13:51:04 +0000 |
---|---|---|
committer | netchild <netchild@FreeBSD.org> | 2005-07-31 13:51:04 +0000 |
commit | 390c36aab07cbefd3431dcaf2e7def68bd6e75fb (patch) | |
tree | 3ec66b454e488da43ce42dc8ada82c8f0cde65a0 /sys/dev/sound/isa/mss.c | |
parent | 988358baf08228d32968544bc6774ba3616f67ff (diff) | |
download | FreeBSD-src-390c36aab07cbefd3431dcaf2e7def68bd6e75fb.zip FreeBSD-src-390c36aab07cbefd3431dcaf2e7def68bd6e75fb.tar.gz |
- Fixup the locking.
- Don't mark MPSAFE (yet).
Submitted by: Ariff Abdullah <skywizard@MyBSD.org.my>
Diffstat (limited to 'sys/dev/sound/isa/mss.c')
-rw-r--r-- | sys/dev/sound/isa/mss.c | 16 |
1 files changed, 14 insertions, 2 deletions
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); |