summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pcm
diff options
context:
space:
mode:
authorcg <cg@FreeBSD.org>2001-06-23 17:36:51 +0000
committercg <cg@FreeBSD.org>2001-06-23 17:36:51 +0000
commitf4d67f070515aea9b806739c31a68a83a74664a3 (patch)
treef4eb53502dd9da5cf589d2fef965f6d9a6c863dc /sys/dev/sound/pcm
parent601ee32495961d995a6be39f850536c07504bc40 (diff)
downloadFreeBSD-src-f4d67f070515aea9b806739c31a68a83a74664a3.zip
FreeBSD-src-f4d67f070515aea9b806739c31a68a83a74664a3.tar.gz
add defines and ifdefs so this code will compile on 4.x
add spls so this code will work on 4.x
Diffstat (limited to 'sys/dev/sound/pcm')
-rw-r--r--sys/dev/sound/pcm/channel.c4
-rw-r--r--sys/dev/sound/pcm/channel.h6
-rw-r--r--sys/dev/sound/pcm/dsp.c46
-rw-r--r--sys/dev/sound/pcm/mixer.c24
-rw-r--r--sys/dev/sound/pcm/sndstat.c38
-rw-r--r--sys/dev/sound/pcm/sound.c2
-rw-r--r--sys/dev/sound/pcm/sound.h7
7 files changed, 113 insertions, 14 deletions
diff --git a/sys/dev/sound/pcm/channel.c b/sys/dev/sound/pcm/channel.c
index 99aa391..9d9fa8f 100644
--- a/sys/dev/sound/pcm/channel.c
+++ b/sys/dev/sound/pcm/channel.c
@@ -105,7 +105,11 @@ chn_sleep(struct pcm_channel *c, char *str, int timeout)
int ret;
CHN_LOCKASSERT(c);
+#ifdef USING_MUTEX
ret = msleep(bs, c->lock, PRIBIO | PCATCH, str, timeout);
+#else
+ ret = tsleep(bs, PRIBIO | PCATCH, str, timeout);
+#endif
return ret;
}
diff --git a/sys/dev/sound/pcm/channel.h b/sys/dev/sound/pcm/channel.h
index bc0dff2..9095c1b 100644
--- a/sys/dev/sound/pcm/channel.h
+++ b/sys/dev/sound/pcm/channel.h
@@ -97,9 +97,15 @@ void chn_rdupdate(struct pcm_channel *c);
int chn_notify(struct pcm_channel *c, u_int32_t flags);
+#ifdef USING_MUTEX
#define CHN_LOCK(c) mtx_lock((struct mtx *)((c)->lock))
#define CHN_UNLOCK(c) mtx_unlock((struct mtx *)((c)->lock))
#define CHN_LOCKASSERT(c)
+#else
+#define CHN_LOCK(c)
+#define CHN_UNLOCK(c)
+#define CHN_LOCKASSERT(c)
+#endif
int fmtvalid(u_int32_t fmt, u_int32_t *fmtlist);
diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c
index 2652d9a..1b12326 100644
--- a/sys/dev/sound/pcm/dsp.c
+++ b/sys/dev/sound/pcm/dsp.c
@@ -57,7 +57,9 @@ static struct cdevsw dsp_cdevsw = {
/* flags */ 0,
};
+#ifdef USING_DEVFS
static eventhandler_tag dsp_ehtag;
+#endif
static struct snddev_info *
dsp_get_info(dev_t dev)
@@ -139,9 +141,11 @@ dsp_open(dev_t i_dev, int flags, int mode, struct proc *p)
{
struct pcm_channel *rdch, *wrch;
struct snddev_info *d;
+ intrmask_t s;
u_int32_t fmt;
int devtype;
+ s = spltty();
d = dsp_get_info(i_dev);
devtype = PCMDEV(i_dev);
@@ -172,6 +176,7 @@ dsp_open(dev_t i_dev, int flags, int mode, struct proc *p)
if ((d->flags & SD_F_SIMPLEX) && (i_dev->si_drv1 || i_dev->si_drv2)) {
/* simplex device, already open, exit */
snd_mtxunlock(d->lock);
+ splx(s);
return EBUSY;
}
@@ -187,12 +192,14 @@ dsp_open(dev_t i_dev, int flags, int mode, struct proc *p)
if (!rdch) {
/* no channel available, exit */
snd_mtxunlock(d->lock);
+ splx(s);
return EBUSY;
}
/* got a channel, already locked for us */
} else {
/* already open for read, exit */
snd_mtxunlock(d->lock);
+ splx(s);
return EBUSY;
}
}
@@ -210,6 +217,7 @@ dsp_open(dev_t i_dev, int flags, int mode, struct proc *p)
}
/* exit */
snd_mtxunlock(d->lock);
+ splx(s);
return EBUSY;
}
/* got a channel, already locked for us */
@@ -221,6 +229,7 @@ dsp_open(dev_t i_dev, int flags, int mode, struct proc *p)
}
/* exit */
snd_mtxunlock(d->lock);
+ splx(s);
return EBUSY;
}
}
@@ -253,6 +262,7 @@ dsp_open(dev_t i_dev, int flags, int mode, struct proc *p)
}
CHN_UNLOCK(wrch);
}
+ splx(s);
return 0;
}
@@ -261,8 +271,10 @@ dsp_close(dev_t i_dev, int flags, int mode, struct proc *p)
{
struct pcm_channel *rdch, *wrch;
struct snddev_info *d;
+ intrmask_t s;
int exit;
+ s = spltty();
d = dsp_get_info(i_dev);
snd_mtxlock(d->lock);
rdch = i_dev->si_drv1;
@@ -287,6 +299,7 @@ dsp_close(dev_t i_dev, int flags, int mode, struct proc *p)
}
if (exit) {
snd_mtxunlock(d->lock);
+ splx(s);
return 0;
}
@@ -314,6 +327,7 @@ dsp_close(dev_t i_dev, int flags, int mode, struct proc *p)
pcm_chnrelease(wrch);
}
+ splx(s);
return 0;
}
@@ -321,8 +335,10 @@ static int
dsp_read(dev_t i_dev, struct uio *buf, int flag)
{
struct pcm_channel *rdch, *wrch;
+ intrmask_t s;
int ret;
+ s = spltty();
getchns(i_dev, &rdch, &wrch, SD_F_PRIO_RD);
KASSERT(rdch, ("dsp_read: nonexistant channel"));
@@ -330,6 +346,7 @@ dsp_read(dev_t i_dev, struct uio *buf, int flag)
if (rdch->flags & (CHN_F_MAPPED | CHN_F_DEAD)) {
relchns(i_dev, rdch, wrch, SD_F_PRIO_RD);
+ splx(s);
return EINVAL;
}
if (!(rdch->flags & CHN_F_RUNNING))
@@ -337,6 +354,7 @@ dsp_read(dev_t i_dev, struct uio *buf, int flag)
ret = chn_read(rdch, buf);
relchns(i_dev, rdch, wrch, SD_F_PRIO_RD);
+ splx(s);
return ret;
}
@@ -344,8 +362,10 @@ static int
dsp_write(dev_t i_dev, struct uio *buf, int flag)
{
struct pcm_channel *rdch, *wrch;
+ intrmask_t s;
int ret;
+ s = spltty();
getchns(i_dev, &rdch, &wrch, SD_F_PRIO_WR);
KASSERT(wrch, ("dsp_write: nonexistant channel"));
@@ -353,6 +373,7 @@ dsp_write(dev_t i_dev, struct uio *buf, int flag)
if (wrch->flags & (CHN_F_MAPPED | CHN_F_DEAD)) {
relchns(i_dev, rdch, wrch, SD_F_PRIO_WR);
+ splx(s);
return EINVAL;
}
if (!(wrch->flags & CHN_F_RUNNING))
@@ -360,6 +381,7 @@ dsp_write(dev_t i_dev, struct uio *buf, int flag)
ret = chn_write(wrch, buf);
relchns(i_dev, rdch, wrch, SD_F_PRIO_WR);
+ splx(s);
return ret;
}
@@ -368,9 +390,9 @@ dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct proc *p)
{
struct pcm_channel *wrch, *rdch;
struct snddev_info *d;
+ intrmask_t s;
int kill;
int ret = 0, *arg_i = (int *)arg, tmp;
- u_long s;
/*
* this is an evil hack to allow broken apps to perform mixer ioctls
@@ -384,6 +406,7 @@ dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct proc *p)
return mixer_ioctl(pdev, cmd, arg, mode, p);
}
+ s = spltty();
d = dsp_get_info(i_dev);
getchns(i_dev, &rdch, &wrch, 0);
@@ -394,6 +417,7 @@ dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct proc *p)
kill |= 2;
if (kill == 3) {
relchns(i_dev, rdch, wrch, 0);
+ splx(s);
return EINVAL;
}
if (kill & 1)
@@ -405,7 +429,6 @@ dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct proc *p)
* all routines are called with int. blocked. Make sure that
* ints are re-enabled when calling slow or blocking functions!
*/
- s = spltty();
switch(cmd) {
#ifdef OLDPCM_IOCTL
/*
@@ -902,9 +925,11 @@ dsp_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct proc *p)
static int
dsp_poll(dev_t i_dev, int events, struct proc *p)
{
- int ret, e;
struct pcm_channel *wrch = NULL, *rdch = NULL;
+ intrmask_t s;
+ int ret, e;
+ s = spltty();
ret = 0;
getchns(i_dev, &rdch, &wrch, SD_F_PRIO_RD | SD_F_PRIO_WR);
@@ -920,6 +945,7 @@ dsp_poll(dev_t i_dev, int events, struct proc *p)
}
relchns(i_dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR);
+ splx(s);
return ret;
}
@@ -927,11 +953,13 @@ static int
dsp_mmap(dev_t i_dev, vm_offset_t offset, int nprot)
{
struct pcm_channel *wrch = NULL, *rdch = NULL, *c;
+ intrmask_t s;
int ret;
if (nprot & PROT_EXEC)
return -1;
+ s = spltty();
getchns(i_dev, &rdch, &wrch, SD_F_PRIO_RD | SD_F_PRIO_WR);
#if 0
/*
@@ -939,18 +967,21 @@ dsp_mmap(dev_t i_dev, vm_offset_t offset, int nprot)
* our vm system doesn't allow this, so force write buffer
*/
- if (wrch && (nprot & PROT_WRITE))
+ if (wrch && (nprot & PROT_WRITE)) {
c = wrch;
- else if (rdch && (nprot & PROT_READ))
+ } else if (rdch && (nprot & PROT_READ)) {
c = rdch;
- else
+ } else {
+ splx(s);
return -1;
+ }
#else
c = wrch;
#endif
if (c == NULL) {
relchns(i_dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR);
+ splx(s);
return -1;
}
@@ -958,6 +989,7 @@ dsp_mmap(dev_t i_dev, vm_offset_t offset, int nprot)
ret = atop(vtophys(((char *)sndbuf_getbuf(c->bufsoft)) + offset));
relchns(i_dev, rdch, wrch, SD_F_PRIO_RD | SD_F_PRIO_WR);
+ splx(s);
return ret;
}
@@ -989,6 +1021,7 @@ dsp_unregister(int unit, int channel)
return 0;
}
+#ifdef USING_DEVFS
static void
dsp_clone(void *arg, char *name, int namelen, dev_t *dev)
{
@@ -1056,5 +1089,6 @@ dsp_sysuninit(void *p)
SYSINIT(dsp_sysinit, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, dsp_sysinit, NULL);
SYSUNINIT(dsp_sysuninit, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, dsp_sysuninit, NULL);
+#endif
diff --git a/sys/dev/sound/pcm/mixer.c b/sys/dev/sound/pcm/mixer.c
index a71e127..75812ea 100644
--- a/sys/dev/sound/pcm/mixer.c
+++ b/sys/dev/sound/pcm/mixer.c
@@ -87,7 +87,9 @@ static struct cdevsw mixer_cdevsw = {
/* flags */ 0,
};
+#ifdef USING_DEVFS
static eventhandler_tag mixer_ehtag;
+#endif
static dev_t
mixer_get_devt(device_t dev)
@@ -394,12 +396,17 @@ static int
mixer_open(dev_t i_dev, int flags, int mode, struct proc *p)
{
struct snd_mixer *m;
+ intrmask_t s;
+ s = spltty();
m = i_dev->si_drv1;
- if (m->busy)
+ if (m->busy) {
+ splx(s);
return EBUSY;
+ }
m->busy = 1;
+ splx(s);
return 0;
}
@@ -407,26 +414,33 @@ static int
mixer_close(dev_t i_dev, int flags, int mode, struct proc *p)
{
struct snd_mixer *m;
+ intrmask_t s;
+ s = spltty();
m = i_dev->si_drv1;
- if (!m->busy)
+ if (!m->busy) {
+ splx(s);
return EBADF;
+ }
m->busy = 0;
+ splx(s);
return 0;
}
int
mixer_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct proc *p)
{
+ struct snd_mixer *m;
+ intrmask_t s;
int ret, *arg_i = (int *)arg;
int v = -1, j = cmd & 0xff;
- struct snd_mixer *m;
m = i_dev->si_drv1;
if (!m->busy)
return EBADF;
+ s = spltty();
snd_mtxlock(m->lock);
if ((cmd & MIXER_WRITE(0)) == MIXER_WRITE(0)) {
if (j == SOUND_MIXER_RECSRC)
@@ -434,6 +448,7 @@ mixer_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct proc *p)
else
ret = mixer_set(m, j, *arg_i);
snd_mtxunlock(m->lock);
+ splx(s);
return (ret == 0)? 0 : ENXIO;
}
@@ -461,9 +476,11 @@ mixer_ioctl(dev_t i_dev, u_long cmd, caddr_t arg, int mode, struct proc *p)
return (v != -1)? 0 : ENXIO;
}
snd_mtxunlock(m->lock);
+ splx(s);
return ENXIO;
}
+#ifdef USING_DEVFS
static void
mixer_clone(void *arg, char *name, int namelen, dev_t *dev)
{
@@ -493,5 +510,6 @@ mixer_sysuninit(void *p)
SYSINIT(mixer_sysinit, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, mixer_sysinit, NULL);
SYSUNINIT(mixer_sysuninit, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, mixer_sysuninit, NULL);
+#endif
diff --git a/sys/dev/sound/pcm/sndstat.c b/sys/dev/sound/pcm/sndstat.c
index a16c07e..6792700 100644
--- a/sys/dev/sound/pcm/sndstat.c
+++ b/sys/dev/sound/pcm/sndstat.c
@@ -58,7 +58,11 @@ static int sndstat_isopen = 0;
static int sndstat_bufptr;
static int sndstat_verbose = 0;
+#ifdef USING_MUTEX
TUNABLE_INT("hw.snd.verbose", &sndstat_verbose);
+#else
+TUNABLE_INT_DECL("hw.snd.verbose", 0, sndstat_verbose);
+#endif
static int sndstat_prepare(struct sbuf *s);
@@ -83,42 +87,60 @@ SYSCTL_PROC(_hw_snd, OID_AUTO, verbose, CTLTYPE_INT | CTLFLAG_RW,
static int
sndstat_open(dev_t i_dev, int flags, int mode, struct proc *p)
{
+ intrmask_t s;
int err;
- if (sndstat_isopen)
+ s = spltty();
+ if (sndstat_isopen) {
+ splx(s);
return EBUSY;
- if (sbuf_new(&sndstat_sbuf, NULL, 4096, 0) == NULL)
+ }
+ if (sbuf_new(&sndstat_sbuf, NULL, 4096, 0) == NULL) {
+ splx(s);
return ENXIO;
+ }
sndstat_bufptr = 0;
err = (sndstat_prepare(&sndstat_sbuf) > 0)? 0 : ENOMEM;
if (!err)
sndstat_isopen = 1;
+ splx(s);
return err;
}
static int
sndstat_close(dev_t i_dev, int flags, int mode, struct proc *p)
{
- if (!sndstat_isopen)
+ intrmask_t s;
+
+ s = spltty();
+ if (!sndstat_isopen) {
+ splx(s);
return EBADF;
+ }
sbuf_delete(&sndstat_sbuf);
sndstat_isopen = 0;
+ splx(s);
return 0;
}
static int
sndstat_read(dev_t i_dev, struct uio *buf, int flag)
{
+ intrmask_t s;
int l, err;
- if (!sndstat_isopen)
+ s = spltty();
+ if (!sndstat_isopen) {
+ splx(s);
return EBADF;
+ }
l = min(buf->uio_resid, sbuf_len(&sndstat_sbuf) - sndstat_bufptr);
err = (l > 0)? uiomove(sbuf_data(&sndstat_sbuf) + sndstat_bufptr, l, buf) : 0;
sndstat_bufptr += l;
+ splx(s);
return err;
}
@@ -212,13 +234,19 @@ sndstat_init(void)
static int
sndstat_uninit(void)
{
- if (sndstat_isopen)
+ intrmask_t s;
+
+ s = spltty();
+ if (sndstat_isopen) {
+ splx(s);
return EBUSY;
+ }
if (sndstat_dev)
destroy_dev(sndstat_dev);
sndstat_dev = 0;
+ splx(s);
return 0;
}
diff --git a/sys/dev/sound/pcm/sound.c b/sys/dev/sound/pcm/sound.c
index baf90e0..fe13d73 100644
--- a/sys/dev/sound/pcm/sound.c
+++ b/sys/dev/sound/pcm/sound.c
@@ -72,10 +72,12 @@ void
snd_mtxassert(void *m)
{
#ifdef USING_MUTEX
+#ifdef INVARIANTS
struct mtx *mtx = m;
mtx_assert(mtx, MA_OWNED);
#endif
+#endif
}
void
diff --git a/sys/dev/sound/pcm/sound.h b/sys/dev/sound/pcm/sound.h
index 124c9db..b90fced 100644
--- a/sys/dev/sound/pcm/sound.h
+++ b/sys/dev/sound/pcm/sound.h
@@ -69,12 +69,19 @@
#include <vm/vm.h>
#include <vm/pmap.h>
+#undef USING_MUTEX
+#undef USING_DEVFS
+
#if __FreeBSD_version > 500000
#define USING_MUTEX
#define USING_DEVFS
#endif
#define SND_DYNSYSCTL
+#ifndef INTR_MPSAFE
+#define INTR_MPSAFE 0
+#endif
+
#else
struct isa_device { int dummy; };
#define d_open_t void
OpenPOWER on IntegriCloud