From nobody Mon Jun 8 07:28:13 2026 Received: from sender4-op-o15.zoho.com (sender4-op-o15.zoho.com [136.143.188.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DB14E390CAA; Sun, 31 May 2026 15:45:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780242349; cv=pass; b=QD5HCRlaAkxCvZUcnIEg2AjHmI8xOf6lWbSvp8+OSH5GbGt2X62CwmqG7PxkR/mqN8wqmJ6zcR9Xp/MfR5bFpeFz6oiEXoqyHvJ9qW3vM/BqN11KKFZLjThV0Vpiy4V4ZYfnbTHCHgQ8wAlzRThOCHRBOt8Rm3swma5P9JpddsM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780242349; c=relaxed/simple; bh=Wm8oPqT6fUpO1btWZ0z38k1ZxXqRRuR1iXIoVvTBtSM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=etEIZ2o3cdan/FBE72tRGHO/zML8Zed8Yb/y4rv35jKxGItjhRLkg22kdvGboBcqWbZ0Voet88io92DMgZ/7i21DLuaB5kE6LuBTkYgsA0XgMAJ5xhd0yhk2LOVZYRFC+sV6RHredKUSPVsEg95lFExEBbSa2augubjnxjQhiTM= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rong.moe; spf=pass smtp.mailfrom=rong.moe; dkim=pass (2048-bit key) header.d=rong.moe header.i=i@rong.moe header.b=ebMOOTOn; arc=pass smtp.client-ip=136.143.188.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rong.moe Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rong.moe Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rong.moe header.i=i@rong.moe header.b="ebMOOTOn" ARC-Seal: i=1; a=rsa-sha256; t=1780242340; cv=none; d=zohomail.com; s=zohoarc; b=S0nAXF1oO62dz9ttmJhyhTbeg40eJQSDG2zMxYiITiZXlvf2jaRxebqNpuewU0s52+BTG9GLz91f0s2TdzoyxT76g3DO2kZT0e54h67UnO7LDEMvpBZhVb2bq/IRQCSKOu6XlpTnZ87HlFldhuzpkBT1OG15ieu9ooLlpyn1qNE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1780242340; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=YO+PcA8YhwvAv1GPjfnyFQJCsMUZOiD+Q42rQZRxTS4=; b=CoO0sZETUfT5drvXuDdVAP13inKRVMITEEJCc8xDL+i6dtwXUPB+sFFIuGQpB01OS1jmtnjokMUG61HBQwaLFqW6ZP0jq8G4dTXMz4DQEb/cXHX9oENkiyWR6slbAbz3ZpW3mlL11R0IwsQftTFZsOAVwuS0MOKOQmUB+VEYCkA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=rong.moe; spf=pass smtp.mailfrom=i@rong.moe; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1780242340; s=zmail2048; d=rong.moe; i=i@rong.moe; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=YO+PcA8YhwvAv1GPjfnyFQJCsMUZOiD+Q42rQZRxTS4=; b=ebMOOTOnQNp2Y8SKLG46/q0D+XCad+hH6S2H69b0qrk4S0V1owLz1DOHbN0xXFLz wzKkoiQpytHWt1yjDRJFWn8in7unMmtQDP6wA39yTzPA8xt92kGp6AIJS4YgxsoxdxP 0+t9VHZuuBGNlL/bImkXBo7MCtFdgMHndS2Mby8EG82P/sVvMtGfQCCEUuhJ3nMMmJO tvFKR4HKonPJ8Qj42kzU3T59hWHstcSCP3onrrhgM5JSBbYlo25up6EH6Otqqo5Y29A J/q9wTaJneXo4NiKXziLvyMcl8jNcQQKb177hMzgrIrPMCnAVsmxUvMCFYB4MV0oDTt Hdgamk5Cow== Received: by mx.zohomail.com with SMTPS id 1780242338497438.26380018282407; Sun, 31 May 2026 08:45:38 -0700 (PDT) From: Rong Zhang Date: Sun, 31 May 2026 23:45:20 +0800 Subject: [PATCH v4 1/3] ALSA: usb-audio: Add QUIRK_FLAG_MIXER_GET_CUR_BROKEN Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260531-uac-quirk-get-cur-vol-v4-1-ede643dca151@rong.moe> References: <20260531-uac-quirk-get-cur-vol-v4-0-ede643dca151@rong.moe> In-Reply-To: <20260531-uac-quirk-get-cur-vol-v4-0-ede643dca151@rong.moe> To: Jaroslav Kysela , Takashi Iwai , Jonathan Corbet , Shuah Khan Cc: Takashi Iwai , Steve Smith , linux-sound@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Rong Zhang X-Mailer: b4 0.16-dev-d5d98 X-ZohoMailClient: External Since commit 86aa1ea1f15c ("ALSA: usb-audio: Do not expose sticky mixers"), the UAC mixer core utilizes volume SET_CUR and GET_CUR to identify devices with sticky mixers. Unfortunately, even though most devices with sticky GET_CUR also have corresponding sticky SET_CUR, which I actually met more since the commit had been merged, there is also a rare case that some devices may have volume mixers that responds to SET_CUR properly but with its GET_CUR stubbed. This cause the sticky check to consider the mixer to be sticky and unnecessarily disable it. As the sticky check can't distinguish between sticky mixers and working SET_CUR but broken GET_CUR, add QUIRK_FLAG_MIXER_GET_CUR_BROKEN to tell that the device should fall into the second category when GET_CUR returns a constant value. In this case, the sticky check becomes non-fatal and only disables GET_CUR instead of the whole mixer. The current volume will then be provided by the internal cache that stores the last set volume. An info message prompting users to check MIXER_GET_CUR_BROKEN for potential sticky mixers is also added, so that users can learn how to do some experiments to determine what's going on. If the mixer surprisingly turns out to be non-sticky, they can submit a patch for a new quirk table entry. Signed-off-by: Rong Zhang --- Documentation/sound/alsa-configuration.rst | 12 ++++++ sound/usb/mixer.c | 60 +++++++++++++++++++++++++-= ---- sound/usb/mixer.h | 1 + sound/usb/quirks.c | 1 + sound/usb/usbaudio.h | 13 +++++++ 5 files changed, 77 insertions(+), 10 deletions(-) diff --git a/Documentation/sound/alsa-configuration.rst b/Documentation/sou= nd/alsa-configuration.rst index 4b30cd63c5a5..78fb484e8b04 100644 --- a/Documentation/sound/alsa-configuration.rst +++ b/Documentation/sound/alsa-configuration.rst @@ -2389,6 +2389,18 @@ quirk_flags from snd_usb_handle_sync_urb. Instead fall through and enqueue a packet_info containing only size-0 packets, so the OUT ring keeps moving (emits silence). Needed by Behringer Flow 8 (1397:050c). + * bit 30: ``mixer_get_cur_broken`` + Some mixers are sticky, which means that setting their current v= olume + is a no-op, and reading the current volume returns a constant va= lue. + The sticky check disables these mixers to prevent confusing user= space. + However, some devices do have a tunable volume despite the repor= ted + current volume being constant. As the sticky check can't disting= uish + between the two categories, setting this flag tells that the dev= ice + should fall into the second category when GET_CUR returns a cons= tant + value, resulting in the sticky check being non-fatal and only + disabling GET_CUR instead of the whole mixer. The current volume= will + then be provided by the internal cache that stores the last set + volume =20 This module supports multiple devices, autoprobe and hotplugging. =20 diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index b30af79f716c..b4c855c25eef 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -434,6 +434,11 @@ int snd_usb_get_cur_mix_value(struct usb_mixer_elem_in= fo *cval, *value =3D cval->cache_val[index]; return 0; } + + /* The current value is always provided by the cache after initialization= . */ + if (cval->get_cur_broken) + return -ENXIO; + err =3D get_cur_mix_raw(cval, channel, value); if (err < 0) { if (!cval->head.mixer->ignore_ctl_error) @@ -1223,7 +1228,7 @@ static void init_cur_mix_raw(struct usb_mixer_elem_in= fo *cval, int ch, int idx) err =3D snd_usb_get_cur_mix_value(cval, ch, idx, &val); if (!err) return; - if (!cval->head.mixer->ignore_ctl_error) + if (!cval->head.mixer->ignore_ctl_error && !cval->get_cur_broken) usb_audio_warn(cval->head.mixer->chip, "%d:%d: failed to get current value for ch %d (%d)\n", cval->head.id, mixer_ctrl_intf(cval->head.mixer), @@ -1237,8 +1242,16 @@ static void init_cur_mix_raw(struct usb_mixer_elem_i= nfo *cval, int ch, int idx) * Some devices' volume control mixers are sticky, which accept SET_CUR but * do absolutely nothing. * - * Prevent sticky mixers from being registered, otherwise they confuses - * userspace and results in ineffective volume control. + * Check the return values of GET_CUR with different SET_CUR values. Consi= der + * the mixer as sticky if GET_CUR always returns a constant value. + * + * Some devices have effective SET_CUR despite GET_CUR being constant. Do = not + * consider the mixer as sticky if a quirk flag indicates that. + * + * Gate the registration of sticky mixers to prevent confusing userspace, = so + * that they won't cause ineffective volume control. However, for mixers w= ith + * effective SET_CUR but broken GET_CUR, the registration can continue nor= mally + * but further GET_CUR requests will be gated. */ static int check_sticky_volume_control(struct usb_mixer_elem_info *cval, int channel, int saved) @@ -1258,10 +1271,22 @@ static int check_sticky_volume_control(struct usb_m= ixer_elem_info *cval, return 0; } =20 + if (cval->head.mixer->chip->quirk_flags & QUIRK_FLAG_MIXER_GET_CUR_BROKEN= ) { + usb_audio_info(cval->head.mixer->chip, + "%d:%d: broken mixer GET_CUR (%d/%d/%d =3D> %d)\n", + cval->head.id, mixer_ctrl_intf(cval->head.mixer), + cval->min, cval->max, cval->res, saved); + + cval->get_cur_broken =3D 1; + return -ENXIO; + } + usb_audio_err(cval->head.mixer->chip, "%d:%d: sticky mixer values (%d/%d/%d =3D> %d), disabling\n", cval->head.id, mixer_ctrl_intf(cval->head.mixer), cval->min, cval->max, cval->res, saved); + usb_audio_info(cval->head.mixer->chip, + "check MIXER_GET_CUR_BROKEN if you believe the mixer is non-stick= y"); =20 return -ENODEV; } @@ -1304,7 +1329,7 @@ static void check_volume_control_res(struct usb_mixer= _elem_info *cval, static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval, int default_min, struct snd_kcontrol *kctl) { - int i, idx, ret; + int i, idx, ret =3D 0; =20 /* for failsafe */ cval->min =3D default_min; @@ -1360,8 +1385,10 @@ static int get_min_max_with_quirks(struct usb_mixer_= elem_info *cval, goto no_checks; =20 ret =3D check_sticky_volume_control(cval, minchn, saved); - if (ret < 0) + if (ret =3D=3D -ENODEV) goto sticky; + if (ret) + goto no_checks; =20 if (cval->min + cval->res < cval->max) check_volume_control_res(cval, minchn, saved); @@ -1370,6 +1397,16 @@ static int get_min_max_with_quirks(struct usb_mixer_= elem_info *cval, } =20 no_checks: + /* + * Got a non-fatal failure during sanity checks. + * + * Do not propagate mixer values written by sanity checks. + * Instead, rely on init_cur_mix_raw() to initialize the mixer + * properly. + */ + if (ret) + cval->cached =3D 0; + cval->initialized =3D 1; } =20 @@ -3538,7 +3575,8 @@ void snd_usb_mixer_notify_id(struct usb_mixer_interfa= ce *mixer, int unitid) continue; info =3D mixer_elem_list_to_info(list); /* invalidate cache, so the value is read from the device */ - info->cached =3D 0; + if (!info->get_cur_broken) + info->cached =3D 0; snd_ctl_notify(mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &list->kctl->id); } @@ -3635,10 +3673,12 @@ static void snd_usb_mixer_interrupt_v2(struct usb_m= ixer_interface *mixer, switch (attribute) { case UAC2_CS_CUR: /* invalidate cache, so the value is read from the device */ - if (channel) - info->cached &=3D ~BIT(channel); - else /* master channel */ - info->cached =3D 0; + if (!info->get_cur_broken) { + if (channel) + info->cached &=3D ~BIT(channel); + else /* master channel */ + info->cached =3D 0; + } =20 snd_ctl_notify(mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &info->head.kctl->id); diff --git a/sound/usb/mixer.h b/sound/usb/mixer.h index afbb3dd9f177..3fa1bd96f858 100644 --- a/sound/usb/mixer.h +++ b/sound/usb/mixer.h @@ -94,6 +94,7 @@ struct usb_mixer_elem_info { int cache_val[MAX_CHANNELS]; u8 initialized; u8 min_mute; + u8 get_cur_broken; void *private_data; }; =20 diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index 410f5a92c0cf..10c32e633786 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -2607,6 +2607,7 @@ static const char *const snd_usb_audio_quirk_flag_nam= es[] =3D { QUIRK_STRING_ENTRY(MIXER_PLAYBACK_LINEAR_VOL), QUIRK_STRING_ENTRY(MIXER_CAPTURE_LINEAR_VOL), QUIRK_STRING_ENTRY(IFB_SILENCE_ON_EMPTY), + QUIRK_STRING_ENTRY(MIXER_GET_CUR_BROKEN), NULL }; =20 diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 9afcad8f143a..e472aef6eb87 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -242,6 +242,17 @@ extern bool snd_usb_skip_validation; * from snd_usb_handle_sync_urb. Instead fall through and enqueue a * packet_info containing only size-0 packets, so the OUT ring keeps * moving (emits silence). Needed by Behringer Flow 8 (1397:050c). + * QUIRK_FLAG_MIXER_GET_CUR_BROKEN + * Some mixers are sticky, which means that setting their current volume = is a + * no-op, and reading the current volume returns a constant value. The st= icky + * check disables these mixers to prevent confusing userspace. However, s= ome + * devices do have a tunable volume despite the reported current volume b= eing + * constant. As the sticky check can't distinguish between the two catego= ries, + * setting this flag tells that the device should fall into the second + * category when GET_CUR returns a constant value, resulting in the sticky + * check being non-fatal and only disabling GET_CUR instead of the whole = mixer. + * The current volume will then be provided by the internal cache that st= ores + * the last set volume */ =20 enum { @@ -275,6 +286,7 @@ enum { QUIRK_TYPE_MIXER_PLAYBACK_LINEAR_VOL =3D 27, QUIRK_TYPE_MIXER_CAPTURE_LINEAR_VOL =3D 28, QUIRK_TYPE_IFB_SILENCE_ON_EMPTY =3D 29, + QUIRK_TYPE_MIXER_GET_CUR_BROKEN =3D 30, /* Please also edit snd_usb_audio_quirk_flag_names */ }; =20 @@ -310,5 +322,6 @@ enum { #define QUIRK_FLAG_MIXER_PLAYBACK_LINEAR_VOL QUIRK_FLAG(MIXER_PLAYBACK_LIN= EAR_VOL) #define QUIRK_FLAG_MIXER_CAPTURE_LINEAR_VOL QUIRK_FLAG(MIXER_CAPTURE_LINEA= R_VOL) #define QUIRK_FLAG_IFB_SILENCE_ON_EMPTY QUIRK_FLAG(IFB_SILENCE_ON_EMPTY) +#define QUIRK_FLAG_MIXER_GET_CUR_BROKEN QUIRK_FLAG(MIXER_GET_CUR_BROKEN) =20 #endif /* __USBAUDIO_H */ --=20 2.53.0 From nobody Mon Jun 8 07:28:13 2026 Received: from sender4-op-o15.zoho.com (sender4-op-o15.zoho.com [136.143.188.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E1F7E3914FD; Sun, 31 May 2026 15:45:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780242362; cv=pass; b=PzJ+tDIiu4CruejukwMkTuHjEt4c6xUmaq03X9isPiDNRzn2CIzYFYxW+QEpTaTolO8hqaUVPve8qIaoAejd7XM/xduC39NPjdFCkdTbRf+gU3ZhYMUvciTjjiwEU7lP3UFfOLbhSHcyLYa8sHUG8KPOQCn+zqu8G74gzYTLhrQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780242362; c=relaxed/simple; bh=0Dz5xfVWdLxnQzArdTtBol3yQuVdm0/OvMpT7MVEL/M=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mgiF8r4Aa8HMryVNctXiH+ZKvEO4+RolCbRPDHxb5XhS/m/I5u4qw1igS08KRhymkJhFePH+ebvKGIA1RiGphyuGRwSmVqXVUuSgxmNipw63YuSAxnhUGxA3IMhRF2AM4TDR+xY39i23z3m30PvwLF/YgnCCpdstwF2ljUBwWbU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rong.moe; spf=pass smtp.mailfrom=rong.moe; dkim=pass (2048-bit key) header.d=rong.moe header.i=i@rong.moe header.b=LFeDBvaS; arc=pass smtp.client-ip=136.143.188.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rong.moe Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rong.moe Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rong.moe header.i=i@rong.moe header.b="LFeDBvaS" ARC-Seal: i=1; a=rsa-sha256; t=1780242352; cv=none; d=zohomail.com; s=zohoarc; b=mJX4AnsUfiBjZtY5hdNbZNTgJaviLXuXMxxxoDoZ/6fJvaxhP16yz/STTfn7Ia9n8yC+jjKodVKgHOfCspKbfljdFeUmoSzo6YJDFE41BH7exqGo06DGjlN3ALXw0u+6a01CeSFj+B9FLy3vfDVch6LmOGClKd005fCqSGQSRRk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1780242352; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=mD7J84PQ1T+xQ+GDzbHYrO1OyEKuzsq/Emq0e/KEyXQ=; b=K2uFZGN5PE8Ol6C7eY8S8MlUB7k+5144775AQzRqAv8AyU4NG7wl91QIgx6AH2gX7+6BWoiJ/ehxYHoMNL3K/o5YgvdSHsn6LgVVuz0ZMMZgSO9Y7e0keUGItJ/G8UCjdZ7moahYCoWbMuEUOffhgolOaF8yJCaDQAM8OU2EvkQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=rong.moe; spf=pass smtp.mailfrom=i@rong.moe; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1780242352; s=zmail2048; d=rong.moe; i=i@rong.moe; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=mD7J84PQ1T+xQ+GDzbHYrO1OyEKuzsq/Emq0e/KEyXQ=; b=LFeDBvaSf4jhtzTgimnMURByIw6UxIe/1y2NnEhA0Sk6uM1nnGm0rmqEIDqwBvvs RVG4ncSS/Wr9Ln+CYJJOw4SbjQayvUwziDh0VxKv7x5vZTSo1qZ7x4hwzaFatDqJRqc JKx6g6xpDAH22tHaQzASXGFPPjylueDVbVbdpIXUZIanRzwjdGVJAYgpL8Lc1VHVrbR WYynXStCESBfWFcRLm5QawYxBnZ+WGEcZmrHIFwvXKPJeiwrVb9CK4KaCOBc8d1datd KKPPSJaPIrY65S/yevM7dH7EJvq5a5/QIEp2XhZ+US03FrmVDPkO6jUTaBF0soPas1e 8FJncdyVhQ== Received: by mx.zohomail.com with SMTPS id 1780242350393799.1667336681013; Sun, 31 May 2026 08:45:50 -0700 (PDT) From: Rong Zhang Date: Sun, 31 May 2026 23:45:21 +0800 Subject: [PATCH v4 2/3] ALSA: usb-audio: Add quirk flag for Sennheiser MOMENTUM 3 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260531-uac-quirk-get-cur-vol-v4-2-ede643dca151@rong.moe> References: <20260531-uac-quirk-get-cur-vol-v4-0-ede643dca151@rong.moe> In-Reply-To: <20260531-uac-quirk-get-cur-vol-v4-0-ede643dca151@rong.moe> To: Jaroslav Kysela , Takashi Iwai , Jonathan Corbet , Shuah Khan Cc: Takashi Iwai , Steve Smith , linux-sound@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Rong Zhang X-Mailer: b4 0.16-dev-d5d98 X-ZohoMailClient: External The Sennheiser MOMENTUM 3 is a wireless around-ear headphones featuring ANC, which can be connected via Bluetooth or USB-C. When connecting via USB-C, its UAC mixer works fine and precisely corresponds to the reported dB range. However, the mixer's volume GET_CUR method is somehow stubbed and returns a constant value (15dB). Since commit 86aa1ea1f15c ("ALSA: usb-audio: Do not expose sticky mixers"), the sticky check considers the mixer to be sticky and unnecessarily disables the mixer. Add a quirk table entry matching VID/PID=3D0x1377/0x6004 and applying the MIXER_GET_CUR_BROKEN quirk flag, so that the mixer is usable again. Quirky device sample: usb 7-1.4.4.1.1.1: new full-speed USB device number 30 using xhci_hcd usb 7-1.4.4.1.1.1: New USB device found, idVendor=3D1377, idProduct=3D600= 4, bcdDevice=3D38.85 usb 7-1.4.4.1.1.1: New USB device strings: Mfr=3D1, Product=3D2, SerialNu= mber=3D3 usb 7-1.4.4.1.1.1: Product: MOMENTUM 3 usb 7-1.4.4.1.1.1: Manufacturer: Sennheiser electronic GmbH & Co. KG usb 7-1.4.4.1.1.1: SerialNumber: usb 7-1.4.4.1.1.1: Found last interface =3D 0 usb 7-1.4.4.1.1.1: 1:1: add audio endpoint 0x3 usb 7-1.4.4.1.1.1: Creating new data endpoint #3 usb 7-1.4.4.1.1.1: 1:1 Set sample rate 48000, clock 0 usb 7-1.4.4.1.1.1: 6:0: sticky mixer values (0/11520/768 =3D> 3840), disa= bling usb 7-1.4.4.1.1.1: [6] FU [PCM Playback Volume] skipped due to invalid vo= lume input: Sennheiser electronic GmbH & Co. KG MOMENTUM 3 as /devices/pci0000= :00/0000:00:08.3/0000:67:00.4/usb7/7-1/7-1.4/7-1.4.4/7-1.4.4.1/7-1.4.4.1.1/= 7-1.4.4.1.1.1/7-1.4.4.1.1.1:1.2/0003:1377:6004.002B/input/input208 input: Sennheiser electronic GmbH & Co. KG MOMENTUM 3 Consumer Control as= /devices/pci0000:00/0000:00:08.3/0000:67:00.4/usb7/7-1/7-1.4/7-1.4.4/7-1.4= .4.1/7-1.4.4.1.1/7-1.4.4.1.1.1/7-1.4.4.1.1.1:1.2/0003:1377:6004.002B/input/= input209 hid-generic 0003:1377:6004.002B: input,hiddev99,hidraw12: USB HID v1.11 D= evice [Sennheiser electronic GmbH & Co. KG MOMENTUM 3] on usb-0000:67:00.4-= 1.4.4.1.1.1/input2 Signed-off-by: Rong Zhang --- sound/usb/quirks.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index 10c32e633786..3adfda40d7cb 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -2357,6 +2357,8 @@ static const struct usb_audio_quirk_flags_table quirk= _flags_table[] =3D { QUIRK_FLAG_FORCE_IFACE_RESET | QUIRK_FLAG_IFACE_DELAY), DEVICE_FLG(0x1224, 0x2a25, /* Jieli Technology USB PHY 2.0 */ QUIRK_FLAG_GET_SAMPLE_RATE | QUIRK_FLAG_MIC_RES_16), + DEVICE_FLG(0x1377, 0x6004, /* Sennheiser MOMENTUM 3 */ + QUIRK_FLAG_MIXER_GET_CUR_BROKEN), DEVICE_FLG(0x1395, 0x740a, /* Sennheiser DECT */ QUIRK_FLAG_GET_SAMPLE_RATE), DEVICE_FLG(0x1397, 0x0507, /* Behringer UMC202HD */ --=20 2.53.0 From nobody Mon Jun 8 07:28:13 2026 Received: from sender4-op-o15.zoho.com (sender4-op-o15.zoho.com [136.143.188.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EBBAC3914E9; Sun, 31 May 2026 15:46:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.188.15 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780242371; cv=pass; b=RlwR+5j8yKx3sFNT0uTq5oCpIgBZthI0tsMdaREtYjuPUwBy7HWGwIQHP5ycI75XcXM8Oi0Vmj0Ut9rPr76wvLIk5kwtfRihVtaOTKKj7TIOjYl82KNFT4R0pJ8pANZ3eYc9qHcLe7kliy+bKqPqXw4lZNQzSVTeFpLI7yDOpk0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780242371; c=relaxed/simple; bh=qz4f7k7XXMvf7t8sSnt0JM3ozYhq80WEw4SCcFPambk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qobX3EYazFXFbgR771+cgTaF1lRhRdZiyDru7/pBZolKlUsJkDjXDyTsVnnRUxlW8mau8+WlEP3HRjanD3gXQiYFD9EckxYaennC54y1JJYmKiZY/8LsEEkdkNyq53uEylkTXWXjOUcSDzqhTu8593OfBSGr0Fsj4gymBAfGZdU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rong.moe; spf=pass smtp.mailfrom=rong.moe; dkim=pass (2048-bit key) header.d=rong.moe header.i=i@rong.moe header.b=ozJFX6g3; arc=pass smtp.client-ip=136.143.188.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=rong.moe Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rong.moe Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rong.moe header.i=i@rong.moe header.b="ozJFX6g3" ARC-Seal: i=1; a=rsa-sha256; t=1780242362; cv=none; d=zohomail.com; s=zohoarc; b=KLyyh//VsZCQnroaSdHpGeq/7nwnm8b+1RwH2at9PT2d70aXtjvjP3EAgsJDzSUS4rnMERFnyX/2t+zWJQr+/AXmzo7HnrtB1ymiMlzdV4DQERoKP6Kv1P+E5Kf0awKE2IQMrncD2LgWmTQQlbn0YOYZa7PxffUtiquM0Qymy44= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1780242362; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:References:Subject:Subject:To:To:Message-Id:Reply-To; bh=lt/+vOYXr8OB6WxWNVs2uD5rLVt5hK9HgzWwsdwpXEY=; b=jB709RhuSHTSogNCCHJJwKLhYl2KpYd2knkOH5JFSs5cNfVXAtIOqTslKHc/i2AoMZGOaSGMydwwU84u2ErLhTRO2QPwdeQ4hDEf3Lv+3oK+HLhTf+qDl+5k+3Ga0s9B7fNkshvqw+0GykjmNFwwNXNWzrQZfEfF37mrdyv0Vh8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=rong.moe; spf=pass smtp.mailfrom=i@rong.moe; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1780242362; s=zmail2048; d=rong.moe; i=i@rong.moe; h=From:From:Date:Date:Subject:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:Message-Id:Message-Id:References:In-Reply-To:To:To:Cc:Cc:Reply-To; bh=lt/+vOYXr8OB6WxWNVs2uD5rLVt5hK9HgzWwsdwpXEY=; b=ozJFX6g3F19hO8ac8c6eaWTO0CcHHJ3u0F52Z+CHvEx+u9EV1VRCPY3OfhgMbLkb xmNYPwlxWD+G7BGAYB175UMpX4S6yi+XPzwRaho9gn5neB6/J2uUV1RvbIymA+xihHD dLuRviGfVOg7p5jFv5MmYJAJkX0ellJb1N53tTazWvRhQkf/IdyKFXNlBolIQeYaqsD 1QcG9O/0Bm9dpr984jnAIkkJR08QbU1MQkGnUVFNlDfPUwzCLK6dMvzVlQw60vBajhn HPUbodPfesAFjq1V41B3IolSuYpKyoGvIdSo4/cLQvsQes8IeWhOgnaxoXRua411YRJ RxEpME957w== Received: by mx.zohomail.com with SMTPS id 1780242359500424.20636790121137; Sun, 31 May 2026 08:45:59 -0700 (PDT) From: Rong Zhang Date: Sun, 31 May 2026 23:45:22 +0800 Subject: [PATCH v4 3/3] ALSA: usb-audio: Add quirk flag for Edifier MF200 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260531-uac-quirk-get-cur-vol-v4-3-ede643dca151@rong.moe> References: <20260531-uac-quirk-get-cur-vol-v4-0-ede643dca151@rong.moe> In-Reply-To: <20260531-uac-quirk-get-cur-vol-v4-0-ede643dca151@rong.moe> To: Jaroslav Kysela , Takashi Iwai , Jonathan Corbet , Shuah Khan Cc: Takashi Iwai , Steve Smith , linux-sound@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Rong Zhang X-Mailer: b4 0.16-dev-d5d98 X-ZohoMailClient: External The UAC mixer of Edifier MF200 works fine except that its volume GET_CUR method is somehow stubbed and returns a constant value. Since commit 86aa1ea1f15c ("ALSA: usb-audio: Do not expose sticky mixers"), the sticky check considers the mixer to be sticky and unnecessarily disables the mixer. Add a quirk table entry matching VID/PID=3D0x2d99/0xa024 and applying the MIXER_SKIP_GET_CUR_VOL quirk flag, so that the mixer is usable again. Quirky device sample: usb 1-3.2: new full-speed USB device number 7 using xhci_hcd usb 1-3.2: New USB device found, idVendor=3D2d99, idProduct=3Da024, bcdDe= vice=3D 0.00 usb 1-3.2: New USB device strings: Mfr=3D1, Product=3D2, SerialNumber=3D3 usb 1-3.2: Product: EDIFIER MF200 usb 1-3.2: Manufacturer: EDIFIER usb 1-3.2: SerialNumber: EDI00000X06 input: EDIFIER EDIFIER MF200 Consumer Control as /devices/pci0000:00/0000= :00:02.1/0000:05:00.0/0000:06:0c.0/0000:0e:00.0/usb1/1-3/1-3.2/1-3.2:1.0/00= 03:2D99:A024.0003/input/input8 input: EDIFIER EDIFIER MF200 Mouse as /devices/pci0000:00/0000:00:02.1/00= 00:05:00.0/0000:06:0c.0/0000:0e:00.0/usb1/1-3/1-3.2/1-3.2:1.0/0003:2D99:A02= 4.0003/input/input9 input: EDIFIER EDIFIER MF200 Keyboard as /devices/pci0000:00/0000:00:02.1= /0000:05:00.0/0000:06:0c.0/0000:0e:00.0/usb1/1-3/1-3.2/1-3.2:1.0/0003:2D99:= A024.0003/input/input10 input: EDIFIER EDIFIER MF200 as /devices/pci0000:00/0000:00:02.1/0000:05:= 00.0/0000:06:0c.0/0000:0e:00.0/usb1/1-3/1-3.2/1-3.2:1.0/0003:2D99:A024.0003= /input/input11 input: EDIFIER EDIFIER MF200 as /devices/pci0000:00/0000:00:02.1/0000:05:= 00.0/0000:06:0c.0/0000:0e:00.0/usb1/1-3/1-3.2/1-3.2:1.0/0003:2D99:A024.0003= /input/input12 hid-generic 0003:2D99:A024.0003: input,hiddev1,hidraw2: USB HID v1.10 Mou= se [EDIFIER EDIFIER MF200] on usb-0000:0e:00.0-3.2/input0 usb 1-3.2: 9:1: sticky mixer values (-32768/-32513/1 =3D> -32702), disabl= ing Reported-by: Steve Smith Closes: https://lore.kernel.org/r/CAHLWS5FJCx66GQ-O10pu+nEudEo_QgQAM9vt76T7= vT0zGPPC1g@mail.gmail.com Tested-by: Steve Smith Signed-off-by: Rong Zhang --- sound/usb/quirks.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index 3adfda40d7cb..27fd8621e8f5 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -2477,6 +2477,8 @@ static const struct usb_audio_quirk_flags_table quirk= _flags_table[] =3D { QUIRK_FLAG_CTL_MSG_DELAY_1M), DEVICE_FLG(0x2d99, 0x0026, /* HECATE G2 GAMING HEADSET */ QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE), + DEVICE_FLG(0x2d99, 0xa024, /* Edifier MF200 */ + QUIRK_FLAG_MIXER_GET_CUR_BROKEN), DEVICE_FLG(0x2fc6, 0xf06b, /* MOONDROP Moonriver2 Ti */ QUIRK_FLAG_CTL_MSG_DELAY), DEVICE_FLG(0x2fc6, 0xf0b7, /* iBasso DC07 Pro */ --=20 2.53.0