diff options
| author | Hans Petter Selasky <hselasky@FreeBSD.org> | 2020-03-11 08:26:52 +0000 |
|---|---|---|
| committer | Hans Petter Selasky <hselasky@FreeBSD.org> | 2020-03-11 08:26:52 +0000 |
| commit | e7c57d93d982740c2067b3e2ff838db56c80ffb1 (patch) | |
| tree | c7d8784dd55d7a00a877519847a49b30ad1f0544 /sys/dev/sound | |
| parent | 2824daf0a4a93cffb83d950bd5731316b8038144 (diff) | |
Notes
Diffstat (limited to 'sys/dev/sound')
| -rw-r--r-- | sys/dev/sound/pcm/dsp.c | 16 | ||||
| -rw-r--r-- | sys/dev/sound/pcm/mixer.c | 10 | ||||
| -rw-r--r-- | sys/dev/sound/pcm/sound.c | 2 | ||||
| -rw-r--r-- | sys/dev/sound/pcm/sound.h | 13 |
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)) |
