mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-09-22 09:34:56 +02:00
ALSA: usb-audio: Propagate US-16x08 write errors in route/mix EQ-switch put callbacks
commit3c06aec8abupstream. Several US-16x08 mixer put callbacks log failed control URBs but still return success to userspace. That hides device write failures even though the requested value was not applied. Return the negative write error instead in the route, master, bus, channel, and EQ switch put callbacks. Fixes:d2bb390a20("ALSA: usb-audio: Tascam US-16x08 DSP mixer quirk") Cc: stable@vger.kernel.org Signed-off-by: Cássio Gabriel <cassiogabrielcontato@gmail.com> Signed-off-by: Takashi Iwai <tiwai@suse.de> Link: https://patch.msgid.link/20260419-usb-write-error-propagation-v1-3-5a3bd4a673ae@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
29dc393ab6
commit
a851636ef9
+24
-25
@@ -225,14 +225,14 @@ static int snd_us16x08_route_put(struct snd_kcontrol *kcontrol,
|
||||
|
||||
err = snd_us16x08_send_urb(chip, buf, sizeof(route_msg));
|
||||
|
||||
if (err > 0) {
|
||||
elem->cached |= 1 << index;
|
||||
elem->cache_val[index] = val;
|
||||
} else {
|
||||
if (err < 0) {
|
||||
usb_audio_dbg(chip, "Failed to set routing, err:%d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
return err > 0 ? 1 : 0;
|
||||
elem->cached |= 1 << index;
|
||||
elem->cache_val[index] = val;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int snd_us16x08_master_info(struct snd_kcontrol *kcontrol,
|
||||
@@ -284,14 +284,14 @@ static int snd_us16x08_master_put(struct snd_kcontrol *kcontrol,
|
||||
buf[5] = index + 1;
|
||||
err = snd_us16x08_send_urb(chip, buf, sizeof(mix_msg_out));
|
||||
|
||||
if (err > 0) {
|
||||
elem->cached |= 1 << index;
|
||||
elem->cache_val[index] = val;
|
||||
} else {
|
||||
if (err < 0) {
|
||||
usb_audio_dbg(chip, "Failed to set master, err:%d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
return err > 0 ? 1 : 0;
|
||||
elem->cached |= 1 << index;
|
||||
elem->cache_val[index] = val;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int snd_us16x08_bus_put(struct snd_kcontrol *kcontrol,
|
||||
@@ -325,14 +325,14 @@ static int snd_us16x08_bus_put(struct snd_kcontrol *kcontrol,
|
||||
break;
|
||||
}
|
||||
|
||||
if (err > 0) {
|
||||
elem->cached |= 1;
|
||||
elem->cache_val[0] = val;
|
||||
} else {
|
||||
if (err < 0) {
|
||||
usb_audio_dbg(chip, "Failed to set bus parameter, err:%d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
return err > 0 ? 1 : 0;
|
||||
elem->cached |= 1;
|
||||
elem->cache_val[0] = val;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int snd_us16x08_bus_get(struct snd_kcontrol *kcontrol,
|
||||
@@ -393,14 +393,14 @@ static int snd_us16x08_channel_put(struct snd_kcontrol *kcontrol,
|
||||
|
||||
err = snd_us16x08_send_urb(chip, buf, sizeof(mix_msg_in));
|
||||
|
||||
if (err > 0) {
|
||||
elem->cached |= 1 << index;
|
||||
elem->cache_val[index] = val;
|
||||
} else {
|
||||
if (err < 0) {
|
||||
usb_audio_dbg(chip, "Failed to set channel, err:%d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
return err > 0 ? 1 : 0;
|
||||
elem->cached |= 1 << index;
|
||||
elem->cache_val[index] = val;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int snd_us16x08_mix_info(struct snd_kcontrol *kcontrol,
|
||||
@@ -530,13 +530,13 @@ static int snd_us16x08_eqswitch_put(struct snd_kcontrol *kcontrol,
|
||||
msleep(15);
|
||||
}
|
||||
|
||||
if (err > 0) {
|
||||
elem->cached |= 1 << index;
|
||||
elem->cache_val[index] = val;
|
||||
} else {
|
||||
if (err < 0) {
|
||||
usb_audio_dbg(chip, "Failed to set eq switch, err:%d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
elem->cached |= 1 << index;
|
||||
elem->cache_val[index] = val;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1419,4 +1419,3 @@ int snd_us16x08_controls_create(struct usb_mixer_interface *mixer)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user