Skip to content

Commit ae602c0

Browse files
CassivsGabriellisgregkh
authored andcommitted
ALSA: usb-audio: Update Babyface Pro control caches only after successful writes
commit d8f802c upstream. snd_bbfpro_ctl_put() and snd_bbfpro_vol_put() cache the requested packed control state in kcontrol->private_value before issuing the USB write. Their get and resume paths use that cached value directly, so a failed write can leave the driver reporting and later replaying a setting the hardware never accepted. Update the cached state only after a successful USB write. Fixes: 3e8f3bd ("ALSA: usb-audio: RME Babyface Pro mixer patch") Cc: stable@vger.kernel.org Signed-off-by: Cássio Gabriel <cassiogabrielcontato@gmail.com> Link: https://patch.msgid.link/20260429-alsa-usb-quirks-cache-rollback-v1-2-01b35c688b80@gmail.com Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent b9db615 commit ae602c0

1 file changed

Lines changed: 10 additions & 6 deletions

File tree

sound/usb/mixer_quirks.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2950,12 +2950,14 @@ static int snd_bbfpro_ctl_put(struct snd_kcontrol *kcontrol,
29502950
if (val == old_value)
29512951
return 0;
29522952

2953+
err = snd_bbfpro_ctl_update(mixer, reg, idx, val);
2954+
if (err < 0)
2955+
return err;
2956+
29532957
kcontrol->private_value = reg
29542958
| ((idx & SND_BBFPRO_CTL_IDX_MASK) << SND_BBFPRO_CTL_IDX_SHIFT)
29552959
| ((val & SND_BBFPRO_CTL_VAL_MASK) << SND_BBFPRO_CTL_VAL_SHIFT);
2956-
2957-
err = snd_bbfpro_ctl_update(mixer, reg, idx, val);
2958-
return err < 0 ? err : 1;
2960+
return 1;
29592961
}
29602962

29612963
static int snd_bbfpro_ctl_resume(struct usb_mixer_elem_list *list)
@@ -3040,11 +3042,13 @@ static int snd_bbfpro_vol_put(struct snd_kcontrol *kcontrol,
30403042

30413043
new_val = uvalue & SND_BBFPRO_MIXER_VAL_MASK;
30423044

3045+
err = snd_bbfpro_vol_update(mixer, idx, new_val);
3046+
if (err < 0)
3047+
return err;
3048+
30433049
kcontrol->private_value = idx
30443050
| (new_val << SND_BBFPRO_MIXER_VAL_SHIFT);
3045-
3046-
err = snd_bbfpro_vol_update(mixer, idx, new_val);
3047-
return err < 0 ? err : 1;
3051+
return 1;
30483052
}
30493053

30503054
static int snd_bbfpro_vol_resume(struct usb_mixer_elem_list *list)

0 commit comments

Comments
 (0)