]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ALSA: usb-audio: scarlett2: Fix wrong resume call
authorTakashi Iwai <tiwai@suse.de>
Tue, 22 Jun 2021 17:00:49 +0000 (02:30 +0930)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Jul 2021 14:52:59 +0000 (16:52 +0200)
commit 785b6f29a795f109685f286b91e0250c206fbffb 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>
sound/usb/mixer.c
sound/usb/mixer.h
sound/usb/mixer_scarlett_gen2.c

index 7d62791a96dd34724bc1b85123a1e507d34a5d8b..22841ed2411e223d79894ea1a601bb375f48143b 100644 (file)
@@ -3599,6 +3599,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++) {
index 01b5e5cc22210871f3e1883492ccb0929f6d5e58..0e813cd85bee706002d6b8d16a3857b8d9f3708d 100644 (file)
@@ -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,
index 7a10c9e22c46c18272989c0061a16dedf96fd9fb..54bcf1c14bc24300d380cdb600880a2f0964cf22 100644 (file)
@@ -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) {