aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/sound
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2020-03-11 08:26:52 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2020-03-11 08:26:52 +0000
commite7c57d93d982740c2067b3e2ff838db56c80ffb1 (patch)
treec7d8784dd55d7a00a877519847a49b30ad1f0544 /sys/dev/sound
parent2824daf0a4a93cffb83d950bd5731316b8038144 (diff)
Notes
Diffstat (limited to 'sys/dev/sound')
-rw-r--r--sys/dev/sound/pcm/dsp.c16
-rw-r--r--sys/dev/sound/pcm/mixer.c10
-rw-r--r--sys/dev/sound/pcm/sound.c2
-rw-r--r--sys/dev/sound/pcm/sound.h13
4 files changed, 20 insertions, 21 deletions
diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c
index 52c69963c3e6..ec9543fa8b87 100644
--- a/sys/dev/sound/pcm/dsp.c
+++ b/sys/dev/sound/pcm/dsp.c
@@ -457,7 +457,7 @@ dsp_open(struct cdev *i_dev, int flags, int mode, struct thread *td)
return (ENODEV);
d = dsp_get_info(i_dev);
- if (!PCM_REGISTERED(d))
+ if (PCM_DETACHING(d) || !PCM_REGISTERED(d))
return (EBADF);
PCM_GIANT_ENTER(d);
@@ -827,7 +827,7 @@ dsp_io_ops(struct cdev *i_dev, struct uio *buf)
("%s(): io train wreck!", __func__));
d = dsp_get_info(i_dev);
- if (!DSP_REGISTERED(d, i_dev))
+ if (PCM_DETACHING(d) || !DSP_REGISTERED(d, i_dev))
return (EBADF);
PCM_GIANT_ENTER(d);
@@ -1072,7 +1072,7 @@ dsp_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
int *arg_i, ret, tmp;
d = dsp_get_info(i_dev);
- if (!DSP_REGISTERED(d, i_dev))
+ if (PCM_DETACHING(d) || !DSP_REGISTERED(d, i_dev))
return (EBADF);
PCM_GIANT_ENTER(d);
@@ -2167,9 +2167,11 @@ dsp_poll(struct cdev *i_dev, int events, struct thread *td)
int ret, e;
d = dsp_get_info(i_dev);
- if (!DSP_REGISTERED(d, i_dev))
- return (EBADF);
-
+ if (PCM_DETACHING(d) || !DSP_REGISTERED(d, i_dev)) {
+ /* XXX many clients don't understand POLLNVAL */
+ return (events & (POLLHUP | POLLPRI | POLLIN |
+ POLLRDNORM | POLLOUT | POLLWRNORM));
+ }
PCM_GIANT_ENTER(d);
wrch = NULL;
@@ -2240,7 +2242,7 @@ dsp_mmap_single(struct cdev *i_dev, vm_ooffset_t *offset,
return (EINVAL);
d = dsp_get_info(i_dev);
- if (!DSP_REGISTERED(d, i_dev))
+ if (PCM_DETACHING(d) || !DSP_REGISTERED(d, i_dev))
return (EINVAL);
PCM_GIANT_ENTER(d);
diff --git a/sys/dev/sound/pcm/mixer.c b/sys/dev/sound/pcm/mixer.c
index 0f4cca8d79e4..952abbc84903 100644
--- a/sys/dev/sound/pcm/mixer.c
+++ b/sys/dev/sound/pcm/mixer.c
@@ -152,7 +152,7 @@ mixer_set_softpcmvol(struct snd_mixer *m, struct snddev_info *d,
struct pcm_channel *c;
int dropmtx, acquiremtx;
- if (!PCM_REGISTERED(d))
+ if (PCM_DETACHING(d) || !PCM_REGISTERED(d))
return (EINVAL);
if (mtx_owned(m->lock))
@@ -205,7 +205,7 @@ mixer_set_eq(struct snd_mixer *m, struct snddev_info *d,
else
return (EINVAL);
- if (!PCM_REGISTERED(d))
+ if (PCM_DETACHING(d) || !PCM_REGISTERED(d))
return (EINVAL);
if (mtx_owned(m->lock))
@@ -1045,7 +1045,7 @@ mixer_open(struct cdev *i_dev, int flags, int mode, struct thread *td)
m = i_dev->si_drv1;
d = device_get_softc(m->dev);
- if (!PCM_REGISTERED(d))
+ if (PCM_DETACHING(d) || !PCM_REGISTERED(d))
return (EBADF);
/* XXX Need Giant magic entry ??? */
@@ -1201,7 +1201,7 @@ mixer_ioctl(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
return (EBADF);
d = device_get_softc(((struct snd_mixer *)i_dev->si_drv1)->dev);
- if (!PCM_REGISTERED(d))
+ if (PCM_DETACHING(d) || !PCM_REGISTERED(d))
return (EBADF);
PCM_GIANT_ENTER(d);
@@ -1412,7 +1412,7 @@ mixer_oss_mixerinfo(struct cdev *i_dev, oss_mixerinfo *mi)
for (i = 0; pcm_devclass != NULL &&
i < devclass_get_maxunit(pcm_devclass); i++) {
d = devclass_get_softc(pcm_devclass, i);
- if (!PCM_REGISTERED(d))
+ if (PCM_DETACHING(d) || !PCM_REGISTERED(d))
continue;
/* XXX Need Giant magic entry */
diff --git a/sys/dev/sound/pcm/sound.c b/sys/dev/sound/pcm/sound.c
index 4a813dab2351..687898e45739 100644
--- a/sys/dev/sound/pcm/sound.c
+++ b/sys/dev/sound/pcm/sound.c
@@ -1161,6 +1161,8 @@ pcm_unregister(device_t dev)
PCM_LOCK(d);
PCM_WAIT(d);
+ d->flags |= SD_F_DETACHING;
+
if (d->inprog != 0) {
device_printf(dev, "unregister: operation in progress\n");
PCM_UNLOCK(d);
diff --git a/sys/dev/sound/pcm/sound.h b/sys/dev/sound/pcm/sound.h
index 80cc64588f48..0436f8d09c61 100644
--- a/sys/dev/sound/pcm/sound.h
+++ b/sys/dev/sound/pcm/sound.h
@@ -135,15 +135,8 @@ struct snd_mixer;
#define SD_F_SIMPLEX 0x00000001
#define SD_F_AUTOVCHAN 0x00000002
#define SD_F_SOFTPCMVOL 0x00000004
-/*
- * Obsolete due to better matrixing
- */
-#if 0
-#define SD_F_PSWAPLR 0x00000008
-#define SD_F_RSWAPLR 0x00000010
-#endif
#define SD_F_DYING 0x00000008
-#define SD_F_SUICIDE 0x00000010
+#define SD_F_DETACHING 0x00000010
#define SD_F_BUSY 0x00000020
#define SD_F_MPSAFE 0x00000040
#define SD_F_REGISTERED 0x00000080
@@ -169,7 +162,7 @@ struct snd_mixer;
"\002AUTOVCHAN" \
"\003SOFTPCMVOL" \
"\004DYING" \
- "\005SUICIDE" \
+ "\005DETACHING" \
"\006BUSY" \
"\007MPSAFE" \
"\010REGISTERED" \
@@ -188,6 +181,8 @@ struct snd_mixer;
#define PCM_REGISTERED(x) (PCM_ALIVE(x) && \
((x)->flags & SD_F_REGISTERED))
+#define PCM_DETACHING(x) ((x)->flags & SD_F_DETACHING)
+
/* many variables should be reduced to a range. Here define a macro */
#define RANGE(var, low, high) (var) = \
(((var)<(low))? (low) : ((var)>(high))? (high) : (var))