aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb
diff options
context:
space:
mode:
authorDaniel Mack <zonque@gmail.com>2013-03-19 16:09:25 -0400
committerTakashi Iwai <tiwai@suse.de>2013-03-20 03:43:00 -0400
commit83ea5d18d74f032a760fecde78c0210f66f7f70c (patch)
treeb9c37c3c341692eba1bbe54402a081be9d45759e /sound/usb
parent4d7b86c98e445b075c2c4c3757eb6d3d6efbe72e (diff)
ALSA: snd-usb: mixer: ignore -EINVAL in snd_usb_mixer_controls()
Creation of individual mixer controls may fail, but that shouldn't cause the entire mixer creation to fail. Even worse, if the mixer creation fails, that will error out the entire device probing. All the functions called by parse_audio_unit() should return -EINVAL if they find descriptors that are unsupported or believed to be malformed, so we can safely handle this error code as a non-fatal condition in snd_usb_mixer_controls(). That fixes a long standing bug which is commonly worked around by adding quirks which make the driver ignore entire interfaces. Some of them might now be unnecessary. Signed-off-by: Daniel Mack <zonque@gmail.com> Reported-and-tested-by: Rodolfo Thomazelli <pe.soberbo@gmail.com> Cc: <stable@vger.kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/usb')
-rw-r--r--sound/usb/mixer.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
index 45cc0aff9c3e..ca4739c3f650 100644
--- a/sound/usb/mixer.c
+++ b/sound/usb/mixer.c
@@ -2123,7 +2123,7 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer)
2123 state.oterm.type = le16_to_cpu(desc->wTerminalType); 2123 state.oterm.type = le16_to_cpu(desc->wTerminalType);
2124 state.oterm.name = desc->iTerminal; 2124 state.oterm.name = desc->iTerminal;
2125 err = parse_audio_unit(&state, desc->bSourceID); 2125 err = parse_audio_unit(&state, desc->bSourceID);
2126 if (err < 0) 2126 if (err < 0 && err != -EINVAL)
2127 return err; 2127 return err;
2128 } else { /* UAC_VERSION_2 */ 2128 } else { /* UAC_VERSION_2 */
2129 struct uac2_output_terminal_descriptor *desc = p; 2129 struct uac2_output_terminal_descriptor *desc = p;
@@ -2135,12 +2135,12 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer)
2135 state.oterm.type = le16_to_cpu(desc->wTerminalType); 2135 state.oterm.type = le16_to_cpu(desc->wTerminalType);
2136 state.oterm.name = desc->iTerminal; 2136 state.oterm.name = desc->iTerminal;
2137 err = parse_audio_unit(&state, desc->bSourceID); 2137 err = parse_audio_unit(&state, desc->bSourceID);
2138 if (err < 0) 2138 if (err < 0 && err != -EINVAL)
2139 return err; 2139 return err;
2140 2140
2141 /* for UAC2, use the same approach to also add the clock selectors */ 2141 /* for UAC2, use the same approach to also add the clock selectors */
2142 err = parse_audio_unit(&state, desc->bCSourceID); 2142 err = parse_audio_unit(&state, desc->bCSourceID);
2143 if (err < 0) 2143 if (err < 0 && err != -EINVAL)
2144 return err; 2144 return err;
2145 } 2145 }
2146 } 2146 }