Commit f35ef592 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: usb-audio: Add skip_validation option

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.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent cb45722b
...@@ -74,6 +74,7 @@ static bool autoclock = true; ...@@ -74,6 +74,7 @@ static bool autoclock = true;
static char *quirk_alias[SNDRV_CARDS]; static char *quirk_alias[SNDRV_CARDS];
bool snd_usb_use_vmalloc = true; bool snd_usb_use_vmalloc = true;
bool snd_usb_skip_validation;
module_param_array(index, int, NULL, 0444); module_param_array(index, int, NULL, 0444);
MODULE_PARM_DESC(index, "Index value for the USB audio adapter."); MODULE_PARM_DESC(index, "Index value for the USB audio adapter.");
...@@ -96,6 +97,8 @@ module_param_array(quirk_alias, charp, NULL, 0444); ...@@ -96,6 +97,8 @@ module_param_array(quirk_alias, charp, NULL, 0444);
MODULE_PARM_DESC(quirk_alias, "Quirk aliases, e.g. 0123abcd:5678beef."); MODULE_PARM_DESC(quirk_alias, "Quirk aliases, e.g. 0123abcd:5678beef.");
module_param_named(use_vmalloc, snd_usb_use_vmalloc, bool, 0444); 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_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 * we keep the snd_usb_audio_t instances by ourselves for merging
......
...@@ -120,5 +120,6 @@ int snd_usb_lock_shutdown(struct snd_usb_audio *chip); ...@@ -120,5 +120,6 @@ int snd_usb_lock_shutdown(struct snd_usb_audio *chip);
void snd_usb_unlock_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_use_vmalloc;
extern bool snd_usb_skip_validation;
#endif /* __USBAUDIO_H */ #endif /* __USBAUDIO_H */
...@@ -322,11 +322,28 @@ static bool validate_desc(unsigned char *hdr, int protocol, ...@@ -322,11 +322,28 @@ static bool validate_desc(unsigned char *hdr, int protocol,
bool snd_usb_validate_audio_desc(void *p, 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) 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;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment