summaryrefslogtreecommitdiffstats
path: root/sound/usb
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2021-01-23 16:58:42 +0100
committerTakashi Iwai <tiwai@suse.de>2021-01-23 16:59:42 +0100
commitfe773b8711e3be4190994ea54bf7a5a0564245a1 (patch)
treece4e7fbf7519c397442c37f2bf664bbdb02c16e6 /sound/usb
parent23b53d4417426edc7c3078e1c1530c242e496c1e (diff)
downloadlinux-stable-fe773b8711e3be4190994ea54bf7a5a0564245a1.tar.gz
linux-stable-fe773b8711e3be4190994ea54bf7a5a0564245a1.tar.bz2
linux-stable-fe773b8711e3be4190994ea54bf7a5a0564245a1.zip
ALSA: usb-audio: workaround for iface reset issue
The recently introduced sample rate validation code seems causing a problem on some devices; namely, after performing this, the bus gets screwed and it influences even on other USB devices. As a quick workaround, perform it only for the necessary devices; currently MOTU devices are known to need the valid altset checks, so filter out other devices. Fixes: 93db51d06b32 ("ALSA: usb-audio: Check valid altsetting at parsing rates for UAC2/3") Reported-by: Jamie Heilman <jamie@audible.transient.net> BugLink: https://bugzilla.suse.com/show_bug.cgi?id=1178203 Link: https://lore.kernel.org/r/20210123155842.22652-1-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/usb')
-rw-r--r--sound/usb/format.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/sound/usb/format.c b/sound/usb/format.c
index 9ebc5d202c87..e6ff317a6785 100644
--- a/sound/usb/format.c
+++ b/sound/usb/format.c
@@ -466,6 +466,17 @@ static int validate_sample_rate_table_v2v3(struct snd_usb_audio *chip,
unsigned int nr_rates;
int i, err;
+ /* performing the rate verification may lead to unexpected USB bus
+ * behavior afterwards by some unknown reason. Do this only for the
+ * known devices.
+ */
+ switch (USB_ID_VENDOR(chip->usb_id)) {
+ case 0x07fd: /* MOTU */
+ break;
+ default:
+ return 0; /* don't perform the validation as default */
+ }
+
table = kcalloc(fp->nr_rates, sizeof(*table), GFP_KERNEL);
if (!table)
return -ENOMEM;