diff options
author | truckman <truckman@FreeBSD.org> | 2004-05-13 11:32:54 +0000 |
---|---|---|
committer | truckman <truckman@FreeBSD.org> | 2004-05-13 11:32:54 +0000 |
commit | 305fdebeb32934840c996fe567234d265b03da04 (patch) | |
tree | 89cc28bc9f80dee94d8c608e4f6414e1b5f01466 | |
parent | 3aa9288a48ca6d866ef3eb1b40a5eaf98e32f8d5 (diff) | |
download | FreeBSD-src-305fdebeb32934840c996fe567234d265b03da04.zip FreeBSD-src-305fdebeb32934840c996fe567234d265b03da04.tar.gz |
Implement sbc_lockassert() and sb_lockassert() functions to allow
proper locking to be checked at runtime.
Remove sb_lock() and sb_unlock() calls from sb_reset_dsp() because the
latter is called from sb_setup() with the lock already held. Add a
call to sb_lockassert().
Surround the call to sb_reset_dsp() in sb16_attach() with sb_lock()
and sb_unlock() calls.
Tested by: Bartek Marcinkiewicz <junior AT p233.if.pwr.wroc.pl>
-rw-r--r-- | sys/dev/sound/isa/sb.h | 1 | ||||
-rw-r--r-- | sys/dev/sound/isa/sb16.c | 15 | ||||
-rw-r--r-- | sys/dev/sound/isa/sbc.c | 6 |
3 files changed, 19 insertions, 3 deletions
diff --git a/sys/dev/sound/isa/sb.h b/sys/dev/sound/isa/sb.h index ff09ef2..ddcb863 100644 --- a/sys/dev/sound/isa/sb.h +++ b/sys/dev/sound/isa/sb.h @@ -8,6 +8,7 @@ struct sbc_softc; void sbc_lock(struct sbc_softc *); +void sbc_lockassert(struct sbc_softc *); void sbc_unlock(struct sbc_softc *); /* diff --git a/sys/dev/sound/isa/sb16.c b/sys/dev/sound/isa/sb16.c index 87683ce..66fe122 100644 --- a/sys/dev/sound/isa/sb16.c +++ b/sys/dev/sound/isa/sb16.c @@ -124,6 +124,12 @@ sb_lock(struct sb_info *sb) { } static void +sb_lockassert(struct sb_info *sb) { + + sbc_lockassert(device_get_softc(sb->parent_dev)); +} + +static void sb_unlock(struct sb_info *sb) { sbc_unlock(device_get_softc(sb->parent_dev)); @@ -266,12 +272,11 @@ sb_reset_dsp(struct sb_info *sb) { u_char b; - sb_lock(sb); + sb_lockassert(sb); sb_wr(sb, SBDSP_RST, 3); DELAY(100); sb_wr(sb, SBDSP_RST, 0); b = sb_get_byte(sb); - sb_unlock(sb); if (b != 0xAA) { DEB(printf("sb_reset_dsp 0x%lx failed\n", rman_get_start(sb->io_base))); @@ -799,8 +804,12 @@ sb16_attach(device_t dev) if (sb16_alloc_resources(sb, dev)) goto no; - if (sb_reset_dsp(sb)) + sb_lock(sb); + if (sb_reset_dsp(sb)) { + sb_unlock(sb); goto no; + } + sb_unlock(sb); if (mixer_init(dev, &sb16mix_mixer_class, sb)) goto no; if (snd_setup_intr(dev, sb->irq, 0, sb_intr, sb, &sb->ih)) diff --git a/sys/dev/sound/isa/sbc.c b/sys/dev/sound/isa/sbc.c index 3badd65..bd06b69 100644 --- a/sys/dev/sound/isa/sbc.c +++ b/sys/dev/sound/isa/sbc.c @@ -132,6 +132,12 @@ sbc_lock(struct sbc_softc *scp) } void +sbc_lockassert(struct sbc_softc *scp) +{ + snd_mtxassert(scp->lock); +} + +void sbc_unlock(struct sbc_softc *scp) { snd_mtxunlock(scp->lock); |