git: 365067e98e4e - main - Revert "sound: Implement asynchronous device detach"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 05 Apr 2024 10:38:25 UTC
The branch main has been updated by christos: URL: https://cgit.FreeBSD.org/src/commit/?id=365067e98e4e9deba18070f5ebd4e9eee7149b6d commit 365067e98e4e9deba18070f5ebd4e9eee7149b6d Author: Christos Margiolis <christos@FreeBSD.org> AuthorDate: 2024-04-05 10:27:47 +0000 Commit: Christos Margiolis <christos@FreeBSD.org> CommitDate: 2024-04-05 10:33:23 +0000 Revert "sound: Implement asynchronous device detach" This reverts commit 9eff58c6d52b66eb8abe7f724dabcd804a566df4. We are reverting dc831e93bad6 ("sound: Get rid of snd_clone and use DEVFS_CDEVPRIV(9)"), so revert this commit as well since it depends dc831e93bad6. --- share/man/man4/snd_uaudio.4 | 11 ++++++++++- sys/dev/sound/pcm/dsp.c | 2 +- sys/dev/sound/pcm/mixer.c | 11 +++++++++++ sys/dev/sound/pcm/sound.c | 24 ++++++++++++++---------- sys/dev/sound/usb/uaudio.c | 13 ++++++++++--- 5 files changed, 46 insertions(+), 15 deletions(-) diff --git a/share/man/man4/snd_uaudio.4 b/share/man/man4/snd_uaudio.4 index 6e2509b8f2ac..b6a6c06a2312 100644 --- a/share/man/man4/snd_uaudio.4 +++ b/share/man/man4/snd_uaudio.4 @@ -27,7 +27,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.Dd March 26, 2024 +.Dd January 29, 2024 .Dt SND_UAUDIO 4 .Os .Sh NAME @@ -156,6 +156,15 @@ and modified for by .An Hiten Pandya Aq Mt hmp@FreeBSD.org . .Sh BUGS +The PCM framework in +.Fx +only supports synchronous device detach. +That means all mixer and DSP character devices belonging to a given +USB audio device must be closed when receiving an error on a DSP read, +a DSP write or a DSP IOCTL request. +Else the USB audio driver will wait for this to happen, preventing +enumeration of new devices on the parenting USB controller. +.Pp Some USB audio devices might refuse to work properly unless the sample rate is configured the same for both recording and playback, even if only simplex is used. diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c index 754f09c7199e..b9693908da43 100644 --- a/sys/dev/sound/pcm/dsp.c +++ b/sys/dev/sound/pcm/dsp.c @@ -295,7 +295,7 @@ dsp_close(void *data) d = priv->sc; /* At this point pcm_unregister() will destroy all channels anyway. */ - if (PCM_DETACHING(d)) + if (!PCM_REGISTERED(d)) goto skip; PCM_GIANT_ENTER(d); diff --git a/sys/dev/sound/pcm/mixer.c b/sys/dev/sound/pcm/mixer.c index cc8cf5b1ceea..ee1ed11a8ed0 100644 --- a/sys/dev/sound/pcm/mixer.c +++ b/sys/dev/sound/pcm/mixer.c @@ -817,6 +817,17 @@ mixer_uninit(device_t dev) KASSERT(m->type == MIXER_TYPE_PRIMARY, ("%s(): illegal mixer type=%d", __func__, m->type)); + snd_mtxlock(m->lock); + + if (m->busy) { + snd_mtxunlock(m->lock); + return EBUSY; + } + + /* destroy dev can sleep --hps */ + + snd_mtxunlock(m->lock); + pdev->si_drv1 = NULL; destroy_dev(pdev); diff --git a/sys/dev/sound/pcm/sound.c b/sys/dev/sound/pcm/sound.c index 1517126210c4..53cde49c4905 100644 --- a/sys/dev/sound/pcm/sound.c +++ b/sys/dev/sound/pcm/sound.c @@ -1001,22 +1001,26 @@ pcm_unregister(device_t dev) CHN_FOREACH(ch, d, channels.pcm) { CHN_LOCK(ch); - if (ch->flags & CHN_F_SLEEPING) { - /* - * We are detaching, so do not wait for the timeout in - * chn_read()/chn_write(). Wake up the thread and kill - * the channel immediately. - */ - CHN_BROADCAST(&ch->intr_cv); - ch->flags |= CHN_F_DEAD; + if (ch->refcount > 0) { + device_printf(dev, + "unregister: channel %s busy (pid %d)\n", + ch->name, ch->pid); + CHN_UNLOCK(ch); + PCM_RELEASE_QUICK(d); + return (EBUSY); } - chn_abort(ch); CHN_UNLOCK(ch); } dsp_destroy_dev(dev); - (void)mixer_uninit(dev); + if (mixer_uninit(dev) == EBUSY) { + device_printf(dev, "unregister: mixer busy\n"); + PCM_LOCK(d); + PCM_RELEASE(d); + PCM_UNLOCK(d); + return (EBUSY); + } /* remove /dev/sndstat entry first */ sndstat_unregister(dev); diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c index 2351c2522021..5d7396c527e0 100644 --- a/sys/dev/sound/usb/uaudio.c +++ b/sys/dev/sound/usb/uaudio.c @@ -1255,13 +1255,20 @@ uaudio_detach_sub(device_t dev) unsigned i = uaudio_get_child_index_by_dev(sc, dev); int error = 0; +repeat: if (sc->sc_child[i].pcm_registered) { error = pcm_unregister(dev); - } else if (sc->sc_child[i].mixer_init) { - error = mixer_uninit(dev); + } else { + if (sc->sc_child[i].mixer_init) + error = mixer_uninit(dev); } - return (error); + if (error) { + device_printf(dev, "Waiting for sound application to exit!\n"); + usb_pause_mtx(NULL, 2 * hz); + goto repeat; /* try again */ + } + return (0); /* success */ } static int