diff options
author | hselasky <hselasky@FreeBSD.org> | 2015-05-21 07:10:49 +0000 |
---|---|---|
committer | hselasky <hselasky@FreeBSD.org> | 2015-05-21 07:10:49 +0000 |
commit | cbbe96a6ffee1b806bd553eeaa916bfa86e68178 (patch) | |
tree | 3f623ebcc55291beb1c09a41c4a789e1333e941f /sys | |
parent | 12519b3e4d2f63e3c5e8dea07cdb673d10215046 (diff) | |
download | FreeBSD-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.c | 16 |
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 |