Skip to content

Commit a851636

Browse files
CassivsGabriellisgregkh
authored andcommitted
ALSA: usb-audio: Propagate US-16x08 write errors in route/mix EQ-switch put callbacks
commit 3c06aec upstream. 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: d2bb390 ("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>
1 parent 29dc393 commit a851636

1 file changed

Lines changed: 24 additions & 25 deletions

File tree

sound/usb/mixer_us16x08.c

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -225,14 +225,14 @@ static int snd_us16x08_route_put(struct snd_kcontrol *kcontrol,
225225

226226
err = snd_us16x08_send_urb(chip, buf, sizeof(route_msg));
227227

228-
if (err > 0) {
229-
elem->cached |= 1 << index;
230-
elem->cache_val[index] = val;
231-
} else {
228+
if (err < 0) {
232229
usb_audio_dbg(chip, "Failed to set routing, err:%d\n", err);
230+
return err;
233231
}
234232

235-
return err > 0 ? 1 : 0;
233+
elem->cached |= 1 << index;
234+
elem->cache_val[index] = val;
235+
return 1;
236236
}
237237

238238
static int snd_us16x08_master_info(struct snd_kcontrol *kcontrol,
@@ -284,14 +284,14 @@ static int snd_us16x08_master_put(struct snd_kcontrol *kcontrol,
284284
buf[5] = index + 1;
285285
err = snd_us16x08_send_urb(chip, buf, sizeof(mix_msg_out));
286286

287-
if (err > 0) {
288-
elem->cached |= 1 << index;
289-
elem->cache_val[index] = val;
290-
} else {
287+
if (err < 0) {
291288
usb_audio_dbg(chip, "Failed to set master, err:%d\n", err);
289+
return err;
292290
}
293291

294-
return err > 0 ? 1 : 0;
292+
elem->cached |= 1 << index;
293+
elem->cache_val[index] = val;
294+
return 1;
295295
}
296296

297297
static int snd_us16x08_bus_put(struct snd_kcontrol *kcontrol,
@@ -325,14 +325,14 @@ static int snd_us16x08_bus_put(struct snd_kcontrol *kcontrol,
325325
break;
326326
}
327327

328-
if (err > 0) {
329-
elem->cached |= 1;
330-
elem->cache_val[0] = val;
331-
} else {
328+
if (err < 0) {
332329
usb_audio_dbg(chip, "Failed to set bus parameter, err:%d\n", err);
330+
return err;
333331
}
334332

335-
return err > 0 ? 1 : 0;
333+
elem->cached |= 1;
334+
elem->cache_val[0] = val;
335+
return 1;
336336
}
337337

338338
static int snd_us16x08_bus_get(struct snd_kcontrol *kcontrol,
@@ -393,14 +393,14 @@ static int snd_us16x08_channel_put(struct snd_kcontrol *kcontrol,
393393

394394
err = snd_us16x08_send_urb(chip, buf, sizeof(mix_msg_in));
395395

396-
if (err > 0) {
397-
elem->cached |= 1 << index;
398-
elem->cache_val[index] = val;
399-
} else {
396+
if (err < 0) {
400397
usb_audio_dbg(chip, "Failed to set channel, err:%d\n", err);
398+
return err;
401399
}
402400

403-
return err > 0 ? 1 : 0;
401+
elem->cached |= 1 << index;
402+
elem->cache_val[index] = val;
403+
return 1;
404404
}
405405

406406
static int snd_us16x08_mix_info(struct snd_kcontrol *kcontrol,
@@ -530,13 +530,13 @@ static int snd_us16x08_eqswitch_put(struct snd_kcontrol *kcontrol,
530530
msleep(15);
531531
}
532532

533-
if (err > 0) {
534-
elem->cached |= 1 << index;
535-
elem->cache_val[index] = val;
536-
} else {
533+
if (err < 0) {
537534
usb_audio_dbg(chip, "Failed to set eq switch, err:%d\n", err);
535+
return err;
538536
}
539537

538+
elem->cached |= 1 << index;
539+
elem->cache_val[index] = val;
540540
return 1;
541541
}
542542

@@ -1419,4 +1419,3 @@ int snd_us16x08_controls_create(struct usb_mixer_interface *mixer)
14191419

14201420
return 0;
14211421
}
1422-

0 commit comments

Comments
 (0)