Page MenuHomeFreeBSD

D43545.diff
No OneTemporary

D43545.diff

diff --git a/share/man/man4/snd_uaudio.4 b/share/man/man4/snd_uaudio.4
--- 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 January 29, 2024
+.Dd March 26, 2024
.Dt SND_UAUDIO 4
.Os
.Sh NAME
@@ -156,15 +156,6 @@
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
--- a/sys/dev/sound/pcm/dsp.c
+++ b/sys/dev/sound/pcm/dsp.c
@@ -274,7 +274,7 @@
d = priv->sc;
/* At this point pcm_unregister() will destroy all channels anyway. */
- if (!PCM_REGISTERED(d))
+ if (PCM_DETACHING(d))
goto skip;
PCM_GIANT_ENTER(d);
diff --git a/sys/dev/sound/pcm/mixer.c b/sys/dev/sound/pcm/mixer.c
--- a/sys/dev/sound/pcm/mixer.c
+++ b/sys/dev/sound/pcm/mixer.c
@@ -817,17 +817,6 @@
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
--- a/sys/dev/sound/pcm/sound.c
+++ b/sys/dev/sound/pcm/sound.c
@@ -1001,26 +1001,22 @@
CHN_FOREACH(ch, d, channels.pcm) {
CHN_LOCK(ch);
- 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);
+ 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;
}
+ chn_abort(ch);
CHN_UNLOCK(ch);
}
dsp_destroy_dev(dev);
- if (mixer_uninit(dev) == EBUSY) {
- device_printf(dev, "unregister: mixer busy\n");
- PCM_LOCK(d);
- PCM_RELEASE(d);
- PCM_UNLOCK(d);
- return (EBUSY);
- }
+ (void)mixer_uninit(dev);
/* remove /dev/sndstat entry first */
sndstat_unregister(dev);
diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -1255,20 +1255,13 @@
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);
}
- 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 */
+ return (error);
}
static int

File Metadata

Mime Type
text/plain
Expires
Fri, Nov 8, 5:01 AM (15 h, 51 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14508908
Default Alt Text
D43545.diff (3 KB)

Event Timeline