aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/sound/pcm/dsp.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound/pcm/dsp.c')
-rw-r--r--sys/dev/sound/pcm/dsp.c36
1 files changed, 12 insertions, 24 deletions
diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c
index 1ae090f252c2..62db4592f206 100644
--- a/sys/dev/sound/pcm/dsp.c
+++ b/sys/dev/sound/pcm/dsp.c
@@ -464,8 +464,7 @@ dsp_io_ops(struct dsp_cdevpriv *priv, struct uio *buf)
struct snddev_info *d;
struct pcm_channel *ch;
int (*chn_io)(struct pcm_channel *, struct uio *);
- int prio, ret;
- pid_t runpid;
+ int ret;
d = priv->sc;
if (!DSP_REGISTERED(d))
@@ -475,37 +474,27 @@ dsp_io_ops(struct dsp_cdevpriv *priv, struct uio *buf)
switch (buf->uio_rw) {
case UIO_READ:
- prio = FREAD;
ch = priv->rdch;
chn_io = chn_read;
break;
case UIO_WRITE:
- prio = FWRITE;
ch = priv->wrch;
chn_io = chn_write;
break;
}
-
- runpid = buf->uio_td->td_proc->p_pid;
-
- dsp_lock_chans(priv, prio);
-
- if (ch == NULL || !(ch->flags & CHN_F_BUSY)) {
- if (priv->rdch != NULL || priv->wrch != NULL)
- dsp_unlock_chans(priv, prio);
+ if (ch == NULL) {
PCM_GIANT_EXIT(d);
- return (EBADF);
+ return (ENXIO);
}
+ CHN_LOCK(ch);
- if (ch->flags & (CHN_F_MMAP | CHN_F_DEAD) ||
- (ch->flags & CHN_F_RUNNING && ch->pid != runpid)) {
- dsp_unlock_chans(priv, prio);
+ if (!(ch->flags & CHN_F_BUSY) ||
+ (ch->flags & (CHN_F_MMAP | CHN_F_DEAD))) {
+ CHN_UNLOCK(ch);
PCM_GIANT_EXIT(d);
- return (EINVAL);
- } else if (!(ch->flags & CHN_F_RUNNING)) {
+ return (ENXIO);
+ } else if (!(ch->flags & CHN_F_RUNNING))
ch->flags |= CHN_F_RUNNING;
- ch->pid = runpid;
- }
/*
* chn_read/write must give up channel lock in order to copy bytes
@@ -517,8 +506,7 @@ dsp_io_ops(struct dsp_cdevpriv *priv, struct uio *buf)
ch->inprog--;
CHN_BROADCAST(&ch->cv);
-
- dsp_unlock_chans(priv, prio);
+ CHN_UNLOCK(ch);
PCM_GIANT_LEAVE(d);
@@ -1609,7 +1597,7 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
struct snd_dbuf *bs;
CHN_LOCK(wrch);
while (wrch->inprog != 0)
- cv_wait(&wrch->cv, wrch->lock);
+ cv_wait(&wrch->cv, &wrch->lock);
bs = wrch->bufsoft;
if ((bs->shadbuf != NULL) && (sndbuf_getready(bs) > 0)) {
bs->sl = sndbuf_getready(bs);
@@ -1633,7 +1621,7 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
struct snd_dbuf *bs;
CHN_LOCK(wrch);
while (wrch->inprog != 0)
- cv_wait(&wrch->cv, wrch->lock);
+ cv_wait(&wrch->cv, &wrch->lock);
bs = wrch->bufsoft;
if ((bs->shadbuf != NULL) && (bs->sl > 0)) {
sndbuf_softreset(bs);