ALSA: usb-audio: Add skip_validation option
authorTakashi Iwai <tiwai@suse.de>
Thu, 14 Nov 2019 16:56:13 +0000 (17:56 +0100)
committerTakashi Iwai <tiwai@suse.de>
Thu, 14 Nov 2019 17:02:38 +0000 (18:02 +0100)
The unit descriptor validation may lead to a probe error when the
device provides a buggy descriptor or the validator detected
incorrectly.  For identifying such an error and band-aiding, give a
new module option, skip_validation.  With this option, the driver
ignores the validation errors with the hexdump of the unit
descriptor, so we can check it in a bit more details.

Link: https://lore.kernel.org/r/20191114165613.7422-2-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/card.c
sound/usb/usbaudio.h
sound/usb/validate.c

index db91dc76cc915fa832b197d14a7abfb28a11060b..9f743ebae615d7c03a3e4afc62df3255149dfe7b 100644 (file)
@@ -74,6 +74,7 @@ static bool autoclock = true;
 static char *quirk_alias[SNDRV_CARDS];
 
 bool snd_usb_use_vmalloc = true;
+bool snd_usb_skip_validation;
 
 module_param_array(index, int, NULL, 0444);
 MODULE_PARM_DESC(index, "Index value for the USB audio adapter.");
@@ -96,6 +97,8 @@ module_param_array(quirk_alias, charp, NULL, 0444);
 MODULE_PARM_DESC(quirk_alias, "Quirk aliases, e.g. 0123abcd:5678beef.");
 module_param_named(use_vmalloc, snd_usb_use_vmalloc, bool, 0444);
 MODULE_PARM_DESC(use_vmalloc, "Use vmalloc for PCM intermediate buffers (default: yes).");
+module_param_named(skip_validation, snd_usb_skip_validation, bool, 0444);
+MODULE_PARM_DESC(skip_validation, "Skip unit descriptor validation (default: no).");
 
 /*
  * we keep the snd_usb_audio_t instances by ourselves for merging
index feb30f9c17165c42b5a16702493091a8ab95ff7f..ff3cbf653de80df519891866969db4615a27e70e 100644 (file)
@@ -120,5 +120,6 @@ int snd_usb_lock_shutdown(struct snd_usb_audio *chip);
 void snd_usb_unlock_shutdown(struct snd_usb_audio *chip);
 
 extern bool snd_usb_use_vmalloc;
+extern bool snd_usb_skip_validation;
 
 #endif /* __USBAUDIO_H */
index 389e8657434ac40e8521e6b2858af1da7b5af9a6..36ae78c3da3da98ced76215d31c1344e72b492cb 100644 (file)
@@ -322,11 +322,28 @@ static bool validate_desc(unsigned char *hdr, int protocol,
 
 bool snd_usb_validate_audio_desc(void *p, int protocol)
 {
-       return validate_desc(p, protocol, audio_validators);
+       unsigned char *c = p;
+       bool valid;
+
+       valid = validate_desc(p, protocol, audio_validators);
+       if (!valid && snd_usb_skip_validation) {
+               print_hex_dump(KERN_ERR, "USB-audio: buggy audio desc: ",
+                              DUMP_PREFIX_NONE, 16, 1, c, c[0], true);
+               valid = true;
+       }
+       return valid;
 }
 
 bool snd_usb_validate_midi_desc(void *p)
 {
-       return validate_desc(p, UAC_VERSION_1, midi_validators);
+       unsigned char *c = p;
+       bool valid;
+
+       valid = validate_desc(p, UAC_VERSION_1, midi_validators);
+       if (!valid && snd_usb_skip_validation) {
+               print_hex_dump(KERN_ERR, "USB-audio: buggy midi desc: ",
+                              DUMP_PREFIX_NONE, 16, 1, c, c[0], true);
+               valid = true;
+       }
+       return valid;
 }
-