* [PATCH] ALSA: usb-audio: add IFB_SILENCE_ON_EMPTY quirk for Behringer Flow 8
@ 2026-05-26 7:29 Gordon Chen
2026-05-26 14:28 ` Takashi Iwai
2026-07-28 14:27 ` Mark Shi
0 siblings, 2 replies; 7+ messages in thread
From: Gordon Chen @ 2026-05-26 7:29 UTC (permalink / raw)
To: linux-sound; +Cc: Takashi Iwai, Jaroslav Kysela, linux-kernel, Gordon Chen
The Behringer Flow 8 (1397:050c) is an 8-channel USB mixer that
declares OUT EP 0x01 with implicit feedback from capture EP 0x81 via
its UAC2 endpoint companion descriptor. After 5-35 minutes of
continuous playback, the device occasionally returns a capture URB in
which every iso_frame_desc has a non-zero status (-EXDEV bursts,
visible as rate-limited "frame N active: -18" lines in dmesg from
pcm.c).
In that case snd_usb_handle_sync_urb() at endpoint.c counts bytes==0
and falls into the early "skip empty packets" return originally added
for M-Audio Fast Track Ultra. As a result the playback EP loses its
sole IFB-driven feeder and the OUT ring starves permanently: hw_ptr
stops advancing while substream state remains RUNNING. Only USB
re-enumeration recovers.
Three independent ftrace captures (taken at the moment of stall via a
userspace watchdog) consistently show:
- 60-70 capture URB completions in the 70ms window before the marker
- 0 retire_playback_urb / queue_pending_output_urbs /
snd_usb_endpoint_implicit_feedback_sink calls
- every usb_submit_urb in the window comes from
snd_complete_urb+0x64e (capture self-resubmit), none from the
queue_pending_output_urbs path
Add a new opt-in quirk QUIRK_FLAG_IFB_SILENCE_ON_EMPTY: when set, the
early return is skipped and we fall through to enqueue a packet_info
whose packet_size[i] are all 0 (the existing loop already maps
status!=0 packets to size 0). prepare_outbound_urb then emits a
silence packet, the OUT ring keeps moving, and the device rides
through the glitch.
The default behaviour (early return) is preserved for all existing
devices including M-Audio Fast Track Ultra. Only Flow 8 opts in here.
Cc: stable@vger.kernel.org
Signed-off-by: Gordon Chen <chengordon326@gmail.com>
---
sound/usb/endpoint.c | 10 +++++++++-
sound/usb/quirks.c | 3 +++
sound/usb/usbaudio.h | 8 ++++++++
3 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
index 6fbcb1175..24cd7692b 100644
--- a/sound/usb/endpoint.c
+++ b/sound/usb/endpoint.c
@@ -1780,8 +1780,16 @@ static void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep,
/*
* skip empty packets. At least M-Audio's Fast Track Ultra stops
* streaming once it received a 0-byte OUT URB
+ *
+ * However, on devices where bytes==0 means every sync-source
+ * packet errored (e.g. Behringer Flow 8 returning -EXDEV bursts
+ * for entire capture URBs), an unconditional return starves the
+ * IFB-fed OUT ring permanently. Such devices set
+ * QUIRK_FLAG_IFB_SILENCE_ON_EMPTY to fall through and enqueue a
+ * packet_info with size 0 packets, so playback emits silence
+ * and the OUT ring keeps moving.
*/
- if (bytes == 0)
+ if (bytes == 0 && !(ep->chip->quirk_flags & QUIRK_FLAG_IFB_SILENCE_ON_EMPTY))
return;
spin_lock_irqsave(&ep->lock, flags);
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index 31cbe383a..e2c95be38 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -2365,6 +2365,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
QUIRK_FLAG_PLAYBACK_FIRST | QUIRK_FLAG_GENERIC_IMPLICIT_FB),
DEVICE_FLG(0x1397, 0x0509, /* Behringer UMC404HD */
QUIRK_FLAG_PLAYBACK_FIRST | QUIRK_FLAG_GENERIC_IMPLICIT_FB),
+ DEVICE_FLG(0x1397, 0x050c, /* Behringer Flow 8 */
+ QUIRK_FLAG_IFB_SILENCE_ON_EMPTY),
DEVICE_FLG(0x13e5, 0x0001, /* Serato Phono */
QUIRK_FLAG_IGNORE_CTL_ERROR),
DEVICE_FLG(0x152a, 0x880a, /* NeuralDSP Quad Cortex */
@@ -2602,6 +2604,7 @@ static const char *const snd_usb_audio_quirk_flag_names[] = {
QUIRK_STRING_ENTRY(SKIP_IFACE_SETUP),
QUIRK_STRING_ENTRY(MIXER_PLAYBACK_LINEAR_VOL),
QUIRK_STRING_ENTRY(MIXER_CAPTURE_LINEAR_VOL),
+ QUIRK_STRING_ENTRY(IFB_SILENCE_ON_EMPTY),
NULL
};
diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
index 58fd07f8c..9afcad8f1 100644
--- a/sound/usb/usbaudio.h
+++ b/sound/usb/usbaudio.h
@@ -236,6 +236,12 @@ extern bool snd_usb_skip_validation;
* QUIRK_FLAG_MIXER_CAPTURE_LINEAR_VOL
* Similar to QUIRK_FLAG_MIXER_PLAYBACK_LINEAR_VOL, but for capture streams.
* Overrides QUIRK_FLAG_MIXER_CAPTURE_MIN_MUTE
+ * QUIRK_FLAG_IFB_SILENCE_ON_EMPTY
+ * In implicit feedback mode, when an entire capture URB returns with
+ * all iso_frame_desc[i].status != 0 (bytes==0), do not silently return
+ * 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).
*/
enum {
@@ -268,6 +274,7 @@ enum {
QUIRK_TYPE_SKIP_IFACE_SETUP = 26,
QUIRK_TYPE_MIXER_PLAYBACK_LINEAR_VOL = 27,
QUIRK_TYPE_MIXER_CAPTURE_LINEAR_VOL = 28,
+ QUIRK_TYPE_IFB_SILENCE_ON_EMPTY = 29,
/* Please also edit snd_usb_audio_quirk_flag_names */
};
@@ -302,5 +309,6 @@ enum {
#define QUIRK_FLAG_SKIP_IFACE_SETUP QUIRK_FLAG(SKIP_IFACE_SETUP)
#define QUIRK_FLAG_MIXER_PLAYBACK_LINEAR_VOL QUIRK_FLAG(MIXER_PLAYBACK_LINEAR_VOL)
#define QUIRK_FLAG_MIXER_CAPTURE_LINEAR_VOL QUIRK_FLAG(MIXER_CAPTURE_LINEAR_VOL)
+#define QUIRK_FLAG_IFB_SILENCE_ON_EMPTY QUIRK_FLAG(IFB_SILENCE_ON_EMPTY)
#endif /* __USBAUDIO_H */
--
2.54.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] ALSA: usb-audio: add IFB_SILENCE_ON_EMPTY quirk for Behringer Flow 8
2026-05-26 7:29 [PATCH] ALSA: usb-audio: add IFB_SILENCE_ON_EMPTY quirk for Behringer Flow 8 Gordon Chen
@ 2026-05-26 14:28 ` Takashi Iwai
2026-07-28 14:27 ` Mark Shi
1 sibling, 0 replies; 7+ messages in thread
From: Takashi Iwai @ 2026-05-26 14:28 UTC (permalink / raw)
To: Gordon Chen; +Cc: linux-sound, Takashi Iwai, Jaroslav Kysela, linux-kernel
On Tue, 26 May 2026 09:29:06 +0200,
Gordon Chen wrote:
>
> The Behringer Flow 8 (1397:050c) is an 8-channel USB mixer that
> declares OUT EP 0x01 with implicit feedback from capture EP 0x81 via
> its UAC2 endpoint companion descriptor. After 5-35 minutes of
> continuous playback, the device occasionally returns a capture URB in
> which every iso_frame_desc has a non-zero status (-EXDEV bursts,
> visible as rate-limited "frame N active: -18" lines in dmesg from
> pcm.c).
>
> In that case snd_usb_handle_sync_urb() at endpoint.c counts bytes==0
> and falls into the early "skip empty packets" return originally added
> for M-Audio Fast Track Ultra. As a result the playback EP loses its
> sole IFB-driven feeder and the OUT ring starves permanently: hw_ptr
> stops advancing while substream state remains RUNNING. Only USB
> re-enumeration recovers.
>
> Three independent ftrace captures (taken at the moment of stall via a
> userspace watchdog) consistently show:
>
> - 60-70 capture URB completions in the 70ms window before the marker
> - 0 retire_playback_urb / queue_pending_output_urbs /
> snd_usb_endpoint_implicit_feedback_sink calls
> - every usb_submit_urb in the window comes from
> snd_complete_urb+0x64e (capture self-resubmit), none from the
> queue_pending_output_urbs path
>
> Add a new opt-in quirk QUIRK_FLAG_IFB_SILENCE_ON_EMPTY: when set, the
> early return is skipped and we fall through to enqueue a packet_info
> whose packet_size[i] are all 0 (the existing loop already maps
> status!=0 packets to size 0). prepare_outbound_urb then emits a
> silence packet, the OUT ring keeps moving, and the device rides
> through the glitch.
>
> The default behaviour (early return) is preserved for all existing
> devices including M-Audio Fast Track Ultra. Only Flow 8 opts in here.
>
> Cc: stable@vger.kernel.org
> Signed-off-by: Gordon Chen <chengordon326@gmail.com>
Applied to for-next branch now, as it's no urgent fix like a
regression.
thanks,
Takashi
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] ALSA: usb-audio: add IFB_SILENCE_ON_EMPTY quirk for Behringer Flow 8
2026-05-26 7:29 [PATCH] ALSA: usb-audio: add IFB_SILENCE_ON_EMPTY quirk for Behringer Flow 8 Gordon Chen
2026-05-26 14:28 ` Takashi Iwai
@ 2026-07-28 14:27 ` Mark Shi
2026-07-28 15:02 ` Takashi Iwai
1 sibling, 1 reply; 7+ messages in thread
From: Mark Shi @ 2026-07-28 14:27 UTC (permalink / raw)
To: Gordon Chen, linux-sound; +Cc: Takashi Iwai, Jaroslav Kysela, linux-kernel
Hi Gordon,
在 2026/5/26 15:29, Gordon Chen 写道:
> The Behringer Flow 8 (1397:050c) is an 8-channel USB mixer that
> declares OUT EP 0x01 with implicit feedback from capture EP 0x81 via
> its UAC2 endpoint companion descriptor. After 5-35 minutes of
> continuous playback, the device occasionally returns a capture URB in
> which every iso_frame_desc has a non-zero status (-EXDEV bursts,
> visible as rate-limited "frame N active: -18" lines in dmesg from
> pcm.c).
>
> In that case snd_usb_handle_sync_urb() at endpoint.c counts bytes==0
> and falls into the early "skip empty packets" return originally added
> for M-Audio Fast Track Ultra. As a result the playback EP loses its
> sole IFB-driven feeder and the OUT ring starves permanently: hw_ptr
> stops advancing while substream state remains RUNNING. Only USB
> re-enumeration recovers.
>
> Three independent ftrace captures (taken at the moment of stall via a
> userspace watchdog) consistently show:
>
> - 60-70 capture URB completions in the 70ms window before the marker
> - 0 retire_playback_urb / queue_pending_output_urbs /
> snd_usb_endpoint_implicit_feedback_sink calls
> - every usb_submit_urb in the window comes from
> snd_complete_urb+0x64e (capture self-resubmit), none from the
> queue_pending_output_urbs path
>
> Add a new opt-in quirk QUIRK_FLAG_IFB_SILENCE_ON_EMPTY: when set, the
> early return is skipped and we fall through to enqueue a packet_info
> whose packet_size[i] are all 0 (the existing loop already maps
> status!=0 packets to size 0). prepare_outbound_urb then emits a
> silence packet, the OUT ring keeps moving, and the device rides
> through the glitch.
>
> The default behaviour (early return) is preserved for all existing
> devices including M-Audio Fast Track Ultra. Only Flow 8 opts in here.
>
> Cc: stable@vger.kernel.org
> Signed-off-by: Gordon Chen <chengordon326@gmail.com>
>
Device: Mechrevo WUJIE14Pro A-7BC4U
CPU: AMD Ryzen 7 7840HS (Codename "Phoenix")
Firmware Version: T140_PHX_V20
Firmware Release Date: 2024.1.8
Kernel version: 7.1.4
In Linux kernel 7.1.4, I found that my laptop couldn't wake up from S3
suspend; I had to hold down the power button to force a shutdown and
then restart it.
Using `git bisect`, I discovered that if I revert this patch, the laptop
resumes from S3 normally.
Best Regards,
Mark Shi
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] ALSA: usb-audio: add IFB_SILENCE_ON_EMPTY quirk for Behringer Flow 8
2026-07-28 14:27 ` Mark Shi
@ 2026-07-28 15:02 ` Takashi Iwai
2026-07-28 15:46 ` Mark Shi
0 siblings, 1 reply; 7+ messages in thread
From: Takashi Iwai @ 2026-07-28 15:02 UTC (permalink / raw)
To: Mark Shi
Cc: Gordon Chen, linux-sound, Takashi Iwai, Jaroslav Kysela,
linux-kernel
On Tue, 28 Jul 2026 16:27:35 +0200,
Mark Shi wrote:
>
> Hi Gordon,
>
> 在 2026/5/26 15:29, Gordon Chen 写道:
> > The Behringer Flow 8 (1397:050c) is an 8-channel USB mixer that
> > declares OUT EP 0x01 with implicit feedback from capture EP 0x81 via
> > its UAC2 endpoint companion descriptor. After 5-35 minutes of
> > continuous playback, the device occasionally returns a capture URB in
> > which every iso_frame_desc has a non-zero status (-EXDEV bursts,
> > visible as rate-limited "frame N active: -18" lines in dmesg from
> > pcm.c).
> >
> > In that case snd_usb_handle_sync_urb() at endpoint.c counts bytes==0
> > and falls into the early "skip empty packets" return originally added
> > for M-Audio Fast Track Ultra. As a result the playback EP loses its
> > sole IFB-driven feeder and the OUT ring starves permanently: hw_ptr
> > stops advancing while substream state remains RUNNING. Only USB
> > re-enumeration recovers.
> >
> > Three independent ftrace captures (taken at the moment of stall via a
> > userspace watchdog) consistently show:
> >
> > - 60-70 capture URB completions in the 70ms window before the marker
> > - 0 retire_playback_urb / queue_pending_output_urbs /
> > snd_usb_endpoint_implicit_feedback_sink calls
> > - every usb_submit_urb in the window comes from
> > snd_complete_urb+0x64e (capture self-resubmit), none from the
> > queue_pending_output_urbs path
> >
> > Add a new opt-in quirk QUIRK_FLAG_IFB_SILENCE_ON_EMPTY: when set, the
> > early return is skipped and we fall through to enqueue a packet_info
> > whose packet_size[i] are all 0 (the existing loop already maps
> > status!=0 packets to size 0). prepare_outbound_urb then emits a
> > silence packet, the OUT ring keeps moving, and the device rides
> > through the glitch.
> >
> > The default behaviour (early return) is preserved for all existing
> > devices including M-Audio Fast Track Ultra. Only Flow 8 opts in here.
> >
> > Cc: stable@vger.kernel.org
> > Signed-off-by: Gordon Chen <chengordon326@gmail.com>
> >
> Device: Mechrevo WUJIE14Pro A-7BC4U
> CPU: AMD Ryzen 7 7840HS (Codename "Phoenix")
> Firmware Version: T140_PHX_V20
> Firmware Release Date: 2024.1.8
> Kernel version: 7.1.4
>
> In Linux kernel 7.1.4, I found that my laptop couldn't wake up from S3
> suspend; I had to hold down the power button to force a shutdown and
> then restart it.
>
> Using `git bisect`, I discovered that if I revert this patch, the
> laptop resumes from S3 normally.
Do you have this USB-audio device (Behringer Flow 8 with USB ID
1397:050c)? The commit must be harmless unless you have this device.
That is, if you don't have this device, it's likely a false-positive
bisection result.
thanks,
Takashi
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] ALSA: usb-audio: add IFB_SILENCE_ON_EMPTY quirk for Behringer Flow 8
2026-07-28 15:02 ` Takashi Iwai
@ 2026-07-28 15:46 ` Mark Shi
2026-07-28 16:24 ` Takashi Iwai
0 siblings, 1 reply; 7+ messages in thread
From: Mark Shi @ 2026-07-28 15:46 UTC (permalink / raw)
To: Takashi Iwai; +Cc: Gordon Chen, linux-sound, Jaroslav Kysela, linux-kernel
Hi Takashi,
在 2026/7/28 23:02, Takashi Iwai 写道:
> On Tue, 28 Jul 2026 16:27:35 +0200,
> Mark Shi wrote:
>> Hi Gordon,
>>
>> 在 2026/5/26 15:29, Gordon Chen 写道:
>>> The Behringer Flow 8 (1397:050c) is an 8-channel USB mixer that
>>> declares OUT EP 0x01 with implicit feedback from capture EP 0x81 via
>>> its UAC2 endpoint companion descriptor. After 5-35 minutes of
>>> continuous playback, the device occasionally returns a capture URB in
>>> which every iso_frame_desc has a non-zero status (-EXDEV bursts,
>>> visible as rate-limited "frame N active: -18" lines in dmesg from
>>> pcm.c).
>>>
>>> In that case snd_usb_handle_sync_urb() at endpoint.c counts bytes==0
>>> and falls into the early "skip empty packets" return originally added
>>> for M-Audio Fast Track Ultra. As a result the playback EP loses its
>>> sole IFB-driven feeder and the OUT ring starves permanently: hw_ptr
>>> stops advancing while substream state remains RUNNING. Only USB
>>> re-enumeration recovers.
>>>
>>> Three independent ftrace captures (taken at the moment of stall via a
>>> userspace watchdog) consistently show:
>>>
>>> - 60-70 capture URB completions in the 70ms window before the marker
>>> - 0 retire_playback_urb / queue_pending_output_urbs /
>>> snd_usb_endpoint_implicit_feedback_sink calls
>>> - every usb_submit_urb in the window comes from
>>> snd_complete_urb+0x64e (capture self-resubmit), none from the
>>> queue_pending_output_urbs path
>>>
>>> Add a new opt-in quirk QUIRK_FLAG_IFB_SILENCE_ON_EMPTY: when set, the
>>> early return is skipped and we fall through to enqueue a packet_info
>>> whose packet_size[i] are all 0 (the existing loop already maps
>>> status!=0 packets to size 0). prepare_outbound_urb then emits a
>>> silence packet, the OUT ring keeps moving, and the device rides
>>> through the glitch.
>>>
>>> The default behaviour (early return) is preserved for all existing
>>> devices including M-Audio Fast Track Ultra. Only Flow 8 opts in here.
>>>
>>> Cc: stable@vger.kernel.org
>>> Signed-off-by: Gordon Chen <chengordon326@gmail.com>
>>>
>> Device: Mechrevo WUJIE14Pro A-7BC4U
>> CPU: AMD Ryzen 7 7840HS (Codename "Phoenix")
>> Firmware Version: T140_PHX_V20
>> Firmware Release Date: 2024.1.8
>> Kernel version: 7.1.4
>>
>> In Linux kernel 7.1.4, I found that my laptop couldn't wake up from S3
>> suspend; I had to hold down the power button to force a shutdown and
>> then restart it.
>>
>> Using `git bisect`, I discovered that if I revert this patch, the
>> laptop resumes from S3 normally.
> Do you have this USB-audio device (Behringer Flow 8 with USB ID
> 1397:050c)? The commit must be harmless unless you have this device.
> That is, if you don't have this device, it's likely a false-positive
> bisection result.
>
>
> thanks,
>
> Takashi
I don't have that device, but I partially reverted the code in that
section, and it went back to normal.
Thanks,
Mark Shi
---
sound/usb/endpoint.c | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
index 24cd7692bd01..6fbcb117555c 100644
--- a/sound/usb/endpoint.c
+++ b/sound/usb/endpoint.c
@@ -1780,16 +1780,8 @@ static void snd_usb_handle_sync_urb(struct
snd_usb_endpoint *ep,
/*
* skip empty packets. At least M-Audio's Fast Track Ultra stops
* streaming once it received a 0-byte OUT URB
- *
- * However, on devices where bytes==0 means every sync-source
- * packet errored (e.g. Behringer Flow 8 returning -EXDEV bursts
- * for entire capture URBs), an unconditional return starves the
- * IFB-fed OUT ring permanently. Such devices set
- * QUIRK_FLAG_IFB_SILENCE_ON_EMPTY to fall through and enqueue a
- * packet_info with size 0 packets, so playback emits silence
- * and the OUT ring keeps moving.
*/
- if (bytes == 0 && !(ep->chip->quirk_flags &
QUIRK_FLAG_IFB_SILENCE_ON_EMPTY))
+ if (bytes == 0)
return;
spin_lock_irqsave(&ep->lock, flags);
--
2.55.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] ALSA: usb-audio: add IFB_SILENCE_ON_EMPTY quirk for Behringer Flow 8
2026-07-28 15:46 ` Mark Shi
@ 2026-07-28 16:24 ` Takashi Iwai
[not found] ` <OS3PR01MB88275E7D7BCF41FE0689E701DECA2@OS3PR01MB8827.jpnprd01.prod.outlook.com>
0 siblings, 1 reply; 7+ messages in thread
From: Takashi Iwai @ 2026-07-28 16:24 UTC (permalink / raw)
To: Mark Shi
Cc: Takashi Iwai, Gordon Chen, linux-sound, Jaroslav Kysela,
linux-kernel
On Tue, 28 Jul 2026 17:46:05 +0200,
Mark Shi wrote:
>
> Hi Takashi,
>
> 在 2026/7/28 23:02, Takashi Iwai 写道:
> > On Tue, 28 Jul 2026 16:27:35 +0200,
> > Mark Shi wrote:
> >> Hi Gordon,
> >>
> >> 在 2026/5/26 15:29, Gordon Chen 写道:
> >>> The Behringer Flow 8 (1397:050c) is an 8-channel USB mixer that
> >>> declares OUT EP 0x01 with implicit feedback from capture EP 0x81 via
> >>> its UAC2 endpoint companion descriptor. After 5-35 minutes of
> >>> continuous playback, the device occasionally returns a capture URB in
> >>> which every iso_frame_desc has a non-zero status (-EXDEV bursts,
> >>> visible as rate-limited "frame N active: -18" lines in dmesg from
> >>> pcm.c).
> >>>
> >>> In that case snd_usb_handle_sync_urb() at endpoint.c counts bytes==0
> >>> and falls into the early "skip empty packets" return originally added
> >>> for M-Audio Fast Track Ultra. As a result the playback EP loses its
> >>> sole IFB-driven feeder and the OUT ring starves permanently: hw_ptr
> >>> stops advancing while substream state remains RUNNING. Only USB
> >>> re-enumeration recovers.
> >>>
> >>> Three independent ftrace captures (taken at the moment of stall via a
> >>> userspace watchdog) consistently show:
> >>>
> >>> - 60-70 capture URB completions in the 70ms window before the marker
> >>> - 0 retire_playback_urb / queue_pending_output_urbs /
> >>> snd_usb_endpoint_implicit_feedback_sink calls
> >>> - every usb_submit_urb in the window comes from
> >>> snd_complete_urb+0x64e (capture self-resubmit), none from the
> >>> queue_pending_output_urbs path
> >>>
> >>> Add a new opt-in quirk QUIRK_FLAG_IFB_SILENCE_ON_EMPTY: when set, the
> >>> early return is skipped and we fall through to enqueue a packet_info
> >>> whose packet_size[i] are all 0 (the existing loop already maps
> >>> status!=0 packets to size 0). prepare_outbound_urb then emits a
> >>> silence packet, the OUT ring keeps moving, and the device rides
> >>> through the glitch.
> >>>
> >>> The default behaviour (early return) is preserved for all existing
> >>> devices including M-Audio Fast Track Ultra. Only Flow 8 opts in here.
> >>>
> >>> Cc: stable@vger.kernel.org
> >>> Signed-off-by: Gordon Chen <chengordon326@gmail.com>
> >>>
> >> Device: Mechrevo WUJIE14Pro A-7BC4U
> >> CPU: AMD Ryzen 7 7840HS (Codename "Phoenix")
> >> Firmware Version: T140_PHX_V20
> >> Firmware Release Date: 2024.1.8
> >> Kernel version: 7.1.4
> >>
> >> In Linux kernel 7.1.4, I found that my laptop couldn't wake up from S3
> >> suspend; I had to hold down the power button to force a shutdown and
> >> then restart it.
> >>
> >> Using `git bisect`, I discovered that if I revert this patch, the
> >> laptop resumes from S3 normally.
> > Do you have this USB-audio device (Behringer Flow 8 with USB ID
> > 1397:050c)? The commit must be harmless unless you have this device.
> > That is, if you don't have this device, it's likely a false-positive
> > bisection result.
> >
> >
> > thanks,
> >
> > Takashi
>
> I don't have that device, but I partially reverted the code in that
> section, and it went back to normal.
Hmm, that's odd.
>
>
> Thanks,
>
> Mark Shi
>
> ---
> sound/usb/endpoint.c | 10 +---------
> 1 file changed, 1 insertion(+), 9 deletions(-)
>
> diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
> index 24cd7692bd01..6fbcb117555c 100644
> --- a/sound/usb/endpoint.c
> +++ b/sound/usb/endpoint.c
> @@ -1780,16 +1780,8 @@ static void snd_usb_handle_sync_urb(struct
> snd_usb_endpoint *ep,
> /*
> * skip empty packets. At least M-Audio's Fast Track Ultra stops
> * streaming once it received a 0-byte OUT URB
> - *
> - * However, on devices where bytes==0 means every sync-source
> - * packet errored (e.g. Behringer Flow 8 returning -EXDEV bursts
> - * for entire capture URBs), an unconditional return starves the
> - * IFB-fed OUT ring permanently. Such devices set
> - * QUIRK_FLAG_IFB_SILENCE_ON_EMPTY to fall through and enqueue a
> - * packet_info with size 0 packets, so playback emits silence
> - * and the OUT ring keeps moving.
> */
> - if (bytes == 0 && !(ep->chip->quirk_flags &
> QUIRK_FLAG_IFB_SILENCE_ON_EMPTY))
> + if (bytes == 0)
> return;
>
> spin_lock_irqsave(&ep->lock, flags);
Could you put a debug print what value does ep->chip->quirk_flags
have on your device?
thanks,
Takashi
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] ALSA: usb-audio: add IFB_SILENCE_ON_EMPTY quirk for Behringer Flow 8
[not found] ` <OS3PR01MB88275E7D7BCF41FE0689E701DECA2@OS3PR01MB8827.jpnprd01.prod.outlook.com>
@ 2026-07-29 14:44 ` Takashi Iwai
0 siblings, 0 replies; 7+ messages in thread
From: Takashi Iwai @ 2026-07-29 14:44 UTC (permalink / raw)
To: Mark Shi
Cc: Takashi Iwai, Gordon Chen, linux-sound, Jaroslav Kysela,
linux-kernel
On Wed, 29 Jul 2026 16:28:23 +0200,
Mark Shi wrote:
>
>
> Hi Takashi,
>
> On Tue, 28 Jul 2026 17:46:05 +0200,
> Mark Shi wrote:
>
> Hi Takashi,
>
> 在 2026/7/28 23:02, Takashi Iwai 写道:
>
> On Tue, 28 Jul 2026 16:27:35 +0200,
> Mark Shi wrote:
>
> Hi Gordon,
>
> 在 2026/5/26 15:29, Gordon Chen 写道:
>
> The Behringer Flow 8 (1397:050c) is an 8-channel USB mixer that
> declares OUT EP 0x01 with implicit feedback from capture EP 0x81 via
> its UAC2 endpoint companion descriptor. After 5-35 minutes of
> continuous playback, the device occasionally returns a capture URB in
> which every iso_frame_desc has a non-zero status (-EXDEV bursts,
> visible as rate-limited "frame N active: -18" lines in dmesg from
> pcm.c).
>
> In that case snd_usb_handle_sync_urb() at endpoint.c counts bytes==0
> and falls into the early "skip empty packets" return originally added
> for M-Audio Fast Track Ultra. As a result the playback EP loses its
> sole IFB-driven feeder and the OUT ring starves permanently: hw_ptr
> stops advancing while substream state remains RUNNING. Only USB
> re-enumeration recovers.
>
> Three independent ftrace captures (taken at the moment of stall via a
> userspace watchdog) consistently show:
>
> - 60-70 capture URB completions in the 70ms window before the marker
> - 0 retire_playback_urb / queue_pending_output_urbs /
> snd_usb_endpoint_implicit_feedback_sink calls
> - every usb_submit_urb in the window comes from
> snd_complete_urb+0x64e (capture self-resubmit), none from the
> queue_pending_output_urbs path
>
> Add a new opt-in quirk QUIRK_FLAG_IFB_SILENCE_ON_EMPTY: when set, the
> early return is skipped and we fall through to enqueue a packet_info
> whose packet_size[i] are all 0 (the existing loop already maps
> status!=0 packets to size 0). prepare_outbound_urb then emits a
> silence packet, the OUT ring keeps moving, and the device rides
> through the glitch.
>
> The default behaviour (early return) is preserved for all existing
> devices including M-Audio Fast Track Ultra. Only Flow 8 opts in here.
>
> Cc: stable@vger.kernel.org
> Signed-off-by: Gordon Chen <chengordon326@gmail.com>
>
> Device: Mechrevo WUJIE14Pro A-7BC4U
> CPU: AMD Ryzen 7 7840HS (Codename "Phoenix")
> Firmware Version: T140_PHX_V20
> Firmware Release Date: 2024.1.8
> Kernel version: 7.1.4
>
> In Linux kernel 7.1.4, I found that my laptop couldn't wake up from S3
> suspend; I had to hold down the power button to force a shutdown and
> then restart it.
>
> Using `git bisect`, I discovered that if I revert this patch, the
> laptop resumes from S3 normally.
>
> Do you have this USB-audio device (Behringer Flow 8 with USB ID
> 1397:050c)? The commit must be harmless unless you have this device.
> That is, if you don't have this device, it's likely a false-positive
> bisection result.
>
> thanks,
>
> Takashi
>
> I don't have that device, but I partially reverted the code in that
> section, and it went back to normal.
>
> Hmm, that's odd.
>
> Could you put a debug print what value does ep->chip->quirk_flags
> have on your device?
>
> thanks,
>
> Takashi
>
> I added `usb_audio_info`, compiled and booted, but `dmesg | grep "quirk_flags"
> ` returned no output.
Then something wrong in your test :)
Put another debug print at another place like the probe function, in
order to verify whether the patched driver is really loaded, too.
And, make sure that you're running the exactly patched kernel.
Takashi
>
> ---
>
> diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
> index 24cd7692bd01..12759afacf3e 100644
> --- a/sound/usb/endpoint.c
> +++ b/sound/usb/endpoint.c
> @@ -1788,9 +1788,11 @@ static void snd_usb_handle_sync_urb(struct
> snd_usb_endpoint *ep,
> * QUIRK_FLAG_IFB_SILENCE_ON_EMPTY to fall through and enqueue a
> * packet_info with size 0 packets, so playback emits silence
> * and the OUT ring keeps moving.
> */
> - if (bytes == 0 && !(ep->chip->quirk_flags &
> QUIRK_FLAG_IFB_SILENCE_ON_EMPTY))
> + // if (bytes == 0 && !(ep->chip->quirk_flags &
> QUIRK_FLAG_IFB_SILENCE_ON_EMPTY))
> + usb_audio_info(ep->chip, "quirk_flags = %d\n", ep->chip->
> quirk_flags);
> + if (bytes == 0)
> return;
>
> spin_lock_irqsave(&ep->lock, flags);
> if (ep->next_packet_queued >= ARRAY_SIZE(ep->next_packet)) {
>
> --
>
> --
> Best Regards,
> Mark Shi
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-07-29 14:44 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-26 7:29 [PATCH] ALSA: usb-audio: add IFB_SILENCE_ON_EMPTY quirk for Behringer Flow 8 Gordon Chen
2026-05-26 14:28 ` Takashi Iwai
2026-07-28 14:27 ` Mark Shi
2026-07-28 15:02 ` Takashi Iwai
2026-07-28 15:46 ` Mark Shi
2026-07-28 16:24 ` Takashi Iwai
[not found] ` <OS3PR01MB88275E7D7BCF41FE0689E701DECA2@OS3PR01MB8827.jpnprd01.prod.outlook.com>
2026-07-29 14:44 ` Takashi Iwai
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.