summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorhselasky <hselasky@FreeBSD.org>2015-05-21 07:10:49 +0000
committerhselasky <hselasky@FreeBSD.org>2015-05-21 07:10:49 +0000
commitcbbe96a6ffee1b806bd553eeaa916bfa86e68178 (patch)
tree3f623ebcc55291beb1c09a41c4a789e1333e941f /sys
parent12519b3e4d2f63e3c5e8dea07cdb673d10215046 (diff)
downloadFreeBSD-src-cbbe96a6ffee1b806bd553eeaa916bfa86e68178.zip
FreeBSD-src-cbbe96a6ffee1b806bd553eeaa916bfa86e68178.tar.gz
MFC r282652:
Ensure the USB audio driver doesn't attach twice on the same USB device by grabbing all the USB audio device interfaces.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/sound/usb/uaudio.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
index a6e8e6e..f3a6de5 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -1574,6 +1574,19 @@ uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb_device *udev,
asf1d.v1 = NULL;
ed1 = NULL;
sed.v1 = NULL;
+
+ /*
+ * There can only be one USB audio instance
+ * per USB device. Grab all USB audio
+ * interfaces on this USB device so that we
+ * don't attach USB audio twice:
+ */
+ if (alt_index == 0 && curidx != sc->sc_mixer_iface_index &&
+ (id->bInterfaceClass == UICLASS_AUDIO || audio_if != 0 ||
+ midi_if != 0)) {
+ usbd_set_parent_iface(sc->sc_udev, curidx,
+ sc->sc_mixer_iface_index);
+ }
}
if (audio_if == 0) {
@@ -1809,9 +1822,6 @@ uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb_device *udev,
chan_alt->iface_index = curidx;
chan_alt->iface_alt_index = alt_index;
- usbd_set_parent_iface(sc->sc_udev, curidx,
- sc->sc_mixer_iface_index);
-
if (ep_dir == UE_DIR_IN)
chan_alt->usb_cfg = uaudio_cfg_record;
else
OpenPOWER on IntegriCloud