Skip to content

Commit

Permalink
ALSA: usb-audio: scarlett2: Fix wrong resume call
Browse files Browse the repository at this point in the history
commit 785b6f2 upstream.

The current way of the scarlett2 mixer code managing the
usb_mixer_elem_info object is wrong in two ways: it passes its
internal index to the head.id field, and the val_type field is
uninitialized.  This ended up with the wrong execution at the resume
because a bogus unit id is passed wrongly.  Also, in the later code
extensions, we'll have more mixer elements, and passing the index will
overflow the unit id size (of 256).

This patch corrects those issues.  It introduces a new value type,
USB_MIXER_BESPOKEN, which indicates a non-standard mixer element, and
use this type for all scarlett2 mixer elements, as well as
initializing the fixed unit id 0 for avoiding the overflow.

Tested-by: Geoffrey D. Bennett <g@b4.vu>
Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/49721219f45b7e175e729b0d9d9c142fd8f4342a.1624379707.git.g@b4.vu
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
tiwai authored and gregkh committed Jul 14, 2021
1 parent 5c4d51b commit 19418ed
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 1 deletion.
3 changes: 3 additions & 0 deletions sound/usb/mixer.c
Expand Up @@ -3631,6 +3631,9 @@ static int restore_mixer_value(struct usb_mixer_elem_list *list)
struct usb_mixer_elem_info *cval = mixer_elem_list_to_info(list);
int c, err, idx;

if (cval->val_type == USB_MIXER_BESPOKEN)
return 0;

if (cval->cmask) {
idx = 0;
for (c = 0; c < MAX_CHANNELS; c++) {
Expand Down
1 change: 1 addition & 0 deletions sound/usb/mixer.h
Expand Up @@ -55,6 +55,7 @@ enum {
USB_MIXER_U16,
USB_MIXER_S32,
USB_MIXER_U32,
USB_MIXER_BESPOKEN, /* non-standard type */
};

typedef void (*usb_mixer_elem_dump_func_t)(struct snd_info_buffer *buffer,
Expand Down
7 changes: 6 additions & 1 deletion sound/usb/mixer_scarlett_gen2.c
Expand Up @@ -949,10 +949,15 @@ static int scarlett2_add_new_ctl(struct usb_mixer_interface *mixer,
if (!elem)
return -ENOMEM;

/* We set USB_MIXER_BESPOKEN type, so that the core USB mixer code
* ignores them for resume and other operations.
* Also, the head.id field is set to 0, as we don't use this field.
*/
elem->head.mixer = mixer;
elem->control = index;
elem->head.id = index;
elem->head.id = 0;
elem->channels = channels;
elem->val_type = USB_MIXER_BESPOKEN;

kctl = snd_ctl_new1(ncontrol, elem);
if (!kctl) {
Expand Down

0 comments on commit 19418ed

Please sign in to comment.