From nobody Mon Jun 8 14:39:17 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 9140C423158; Thu, 28 May 2026 18:39:12 +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=1779993554; cv=pass; b=s7H0ElmFY3TKTS6X6f9OBrQr32t1lvYbkiMfmmp1E+e88Ast+683W1lCFAWi2N3WvImKOCHAqoBYUoBQZthqa1vToQJKMH9Wbp89OzA1fImS5p5ikpwWVEdq7y8igKqULYRabE5mg4T2G+cZ+rEc1Fmj1Tcs5Oq2guuk/V2YKXA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779993554; c=relaxed/simple; bh=XFCT7QM5x9Wyg7F0zfwMVf5BvX0zHygYBxuKJYbYkqM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gCnPATFl0BSypq3PNJZgMGdRB8uIM7xBZ2UexZ75tf7i32ogPjpeE/pZXDihLrxDQxkVShmVSBPLStRRPt1ImqMtQeST3JIlj2FywFotGjOl0tSUYxYg9s1lDecI998eqbveKcEW64hRld79r/uD3JJPegumE6klz+yffkfyknE= 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=hXCWbuep; 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="hXCWbuep" ARC-Seal: i=1; a=rsa-sha256; t=1779993546; cv=none; d=zohomail.com; s=zohoarc; b=nXQW1cUH2UZivLRH+SYCxjz1+F3zzAIZAlkRmGab/7aqufNrL7P4NXGFankbLwCCw5THOvY4lB8IJbyMLmCoVVrdTWzVaRI8RAw+P2+GqYICljlJqkqTCoO/QtetY6ONtsi5QjLUwiogvOgs89b6kIRbL9W0oiGvYHWrA5CoG2U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1779993546; 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=My/BSTGmOJ33JdmtGlz19/gSkg3qwjXVacyUj4910Eg=; b=RdMeY4y01rQvbFAqQ4aAVdsnbgVqEF5o2Mc0Ytu7zTrNQ/O01xIeZ5Yw9LOJoJPHAKQOIGCnEzx897Olo7d2k0FK0lwk+g7gvDL87gW7+Ix9APuyWZZ4N43OlJn7oaNQ7SrPPuyLyEGVur+JkII25n4nrfYGGpmVKuWlrQ9TsH4= 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=1779993546; 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=My/BSTGmOJ33JdmtGlz19/gSkg3qwjXVacyUj4910Eg=; b=hXCWbuep+sjj6Kilr5Lbws014V8wEv+zk1WwIQymaXuKn/f3GWb7LlCEePsocwiD diHmk/i32GUsGzyEhqjaHIAuNRDrcSx4eARx8d5upLrIJhDXeJQmwpuu6pI4UCyU/p3 TMpFzcZ0YS25pk5+fYolJh5q/rTTq0Y9PSaa28BBpaefYLcFcoaTfl9fjm9IZKk5qlK y8l+vOOP2atZWgefD8m4wvxbneb3TIBHOZoeflDJTA4exTzl09gKB+QCPv5rmvDSgnS EpW2jZhONOv99On6fHXcLfXCWVJRNkhEfDUlq5kz0y6fYYGKiAiLztgJv5OzWYNcFLk RBbWdbzkPw== Received: by mx.zohomail.com with SMTPS id 1779993543608204.332132728347; Thu, 28 May 2026 11:39:03 -0700 (PDT) From: Rong Zhang Date: Fri, 29 May 2026 02:38:55 +0800 Subject: [PATCH v3 1/2] 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: <20260529-uac-quirk-get-cur-vol-v3-1-bde363188ca4@rong.moe> References: <20260529-uac-quirk-get-cur-vol-v3-0-bde363188ca4@rong.moe> In-Reply-To: <20260529-uac-quirk-get-cur-vol-v3-0-bde363188ca4@rong.moe> To: Jaroslav Kysela , Takashi Iwai , Jonathan Corbet , Shuah Khan Cc: 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. Signed-off-by: Rong Zhang --- Documentation/sound/alsa-configuration.rst | 12 +++++++ sound/usb/mixer.c | 58 ++++++++++++++++++++++++--= ---- sound/usb/mixer.h | 1 + sound/usb/quirks.c | 1 + sound/usb/usbaudio.h | 13 +++++++ 5 files changed, 75 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 d61bde654219..b98222e5f697 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,6 +1271,16 @@ static int check_sticky_volume_control(struct usb_mi= xer_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), @@ -1304,7 +1327,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,10 +1383,12 @@ 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) { snd_usb_set_cur_mix_value(cval, minchn, 0, saved); return ret; } + if (ret) + goto no_checks; =20 if (cval->min + cval->res < cval->max) check_volume_control_res(cval, minchn, saved); @@ -1372,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 @@ -3513,7 +3548,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); } @@ -3610,10 +3646,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 e2c95be38aca..ac2f0f6039be 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -2605,6 +2605,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 14:39:17 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 9136C41C308; Thu, 28 May 2026 18:39:12 +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=1779993553; cv=pass; b=bTibKwP7IbvPylBdSbX+ZZ4Z84cBXzLoV32o6mq93O2v/3T63h2AINnGR+GStJ2r/byokWoD1eA0i+wp1rfuZ5/z1B32Ftz28R62xAjnRctPmQUSu3zzvljy8inqqwQ9FxMv+sRNrZ5RxahrMRJceqMnnDsT6PyEioJVGL0S5fM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779993553; c=relaxed/simple; bh=dPsqvFMUthronaDNPsO9Nf2AfzZZGos2VFwXOO1haoQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CBKA0G694QHGkNiZOuLwWkOorHvwzFLwLDCRDpoe/84Tlwh5kC8qsfkT55V/zCZJKtPLhb9la8JwDw6wM7FC5tlyop1+AcoO8B56KLFEJxXm6tHBCdZQA1tiHYKFS3x9OrEcakgvHEzSwYiQctS2HgWDJe+a633mVre1Hh2ND4g= 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=mm7wiFpK; 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="mm7wiFpK" ARC-Seal: i=1; a=rsa-sha256; t=1779993548; cv=none; d=zohomail.com; s=zohoarc; b=NiwS1tX5SPU6QAD1sWcau8ryA0rUVkruGWwrcY+bQRXkzN1qpYRZ+FoCNlgwP5oR+SnkcS9d8Vo4X6+8/Vl/0GJd7rP2F5//8109RRjJx+S6jXOO4diiZBaWTOJnsUaFJSq05RCz534oUNzZHUiqmH/WeAAcU18+XvLvEcGbEKU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1779993548; 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=1BN6G/rgB9O80LfDMRyXKYCm7YGnt9QXu63DWzyvDnA=; b=gsPK4hJfVIbFf907QbVPrdYnBMA6PTmSGweNnHBQS8jR/3Ka25X7BCTkuvCMDPtFO1+q/crjftoncfjtx02FDOZQuuNs2jZyMAKB8ki93NWbV1auTM9O/HViWrdLpaEKwyZ1wQuxfmIV4IIJms0fgcyWDxKYWjemKn131UfRSY8= 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=1779993548; 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=1BN6G/rgB9O80LfDMRyXKYCm7YGnt9QXu63DWzyvDnA=; b=mm7wiFpKeewwaioEPbFQF7Ua6SrD4FD8LTRLdBnG9uRgXDR0c8uKbohbH///1H27 jOAgtZAIkjVU2FDavyWpU8oY/7THc/i9JjevxojVn+DS8EUubOGNvEspkRK0VLkxuKR dXXiUorHFnkU21HGfDhylRGAy6WI9H5BU9qqa6OnE15j8pnIb9s/5SXNWos+lla/fG5 E5QBDG7gvtPHVIISv6j+55ApWdXUpySqFWBKDy545xHhPF/GliHnO8jyhtHx8aI1aAz tHkMaA4U+zmTzYrq+j6ml5wpRmO6rroYbqwKbsSRWEWWA93+0OvsZgGf5kacWK7Kh38 9+EB90oJHg== Received: by mx.zohomail.com with SMTPS id 1779993546036502.82666565770455; Thu, 28 May 2026 11:39:06 -0700 (PDT) From: Rong Zhang Date: Fri, 29 May 2026 02:38:56 +0800 Subject: [PATCH v3 2/2] 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: <20260529-uac-quirk-get-cur-vol-v3-2-bde363188ca4@rong.moe> References: <20260529-uac-quirk-get-cur-vol-v3-0-bde363188ca4@rong.moe> In-Reply-To: <20260529-uac-quirk-get-cur-vol-v3-0-bde363188ca4@rong.moe> To: Jaroslav Kysela , Takashi Iwai , Jonathan Corbet , Shuah Khan Cc: 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 ac2f0f6039be..149f2009df12 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