From 0ff35915ed31a2ae4ae2b50f22fe87e67f1f8101 Mon Sep 17 00:00:00 2001 From: wholteza Date: Sun, 16 Aug 2026 09:49:14 +0200 Subject: [PATCH] Fix NuForce uDAC USB disconnects Cheap Savitech chip firmware stalls on rapid SET_INTERFACE / sample-rate renegotiation, eventually dropping off the USB bus and requiring a physical replug. Two fixes, both scoped to this exact device only: - snd_usb_audio quirk_flags (262a:10aa): fixed_rate + ctl_msg_delay + iface_delay, applied via /etc/modprobe.d during bootstrap. - WirePlumber: disable idle-suspend for the device's ALSA node so PipeWire doesn't repeatedly reopen the stream during normal use. --- .../51-nuforce-no-suspend.conf | 23 +++++++++++++++++++ .config/yadm/bootstrap##distro.arch | 16 +++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 .config/wireplumber/wireplumber.conf.d/51-nuforce-no-suspend.conf diff --git a/.config/wireplumber/wireplumber.conf.d/51-nuforce-no-suspend.conf b/.config/wireplumber/wireplumber.conf.d/51-nuforce-no-suspend.conf new file mode 100644 index 0000000..15b7cc4 --- /dev/null +++ b/.config/wireplumber/wireplumber.conf.d/51-nuforce-no-suspend.conf @@ -0,0 +1,23 @@ +# The NuForce uDAC (Savitech chip) has flaky firmware: when PipeWire +# idles and then resumes its ALSA node, the device often fails the +# resulting SET_INTERFACE / sample-rate renegotiation with a USB stall +# (spa.alsa: set_hw_params: Broken pipe). Enough of these in a row make +# the device drop off the USB bus and require a physical replug. +# +# Keeping the node's hardware stream open (no idle-suspend) avoids the +# repeated renegotiation and stops the crashes. + +monitor.alsa.rules = [ + { + matches = [ + { + node.name = "~alsa_output.usb-Nuforce_Inc\\._NuForce_USB_Audio-.*" + } + ] + actions = { + update-props = { + session.suspend-timeout-seconds = 0 + } + } + } +] diff --git a/.config/yadm/bootstrap##distro.arch b/.config/yadm/bootstrap##distro.arch index 6d9e2e5..822aee9 100755 --- a/.config/yadm/bootstrap##distro.arch +++ b/.config/yadm/bootstrap##distro.arch @@ -68,6 +68,22 @@ EOF sudo systemctl reload sshd +# --- NuForce uDAC USB audio quirks -------------------------------------- +# This DAC's firmware (262a:10aa) stalls on rapid SET_INTERFACE / sample +# rate renegotiation, which without these quirks eventually drops the +# device off the USB bus and requires a physical replug. Scoped to this +# exact VID:PID so it's a no-op on any machine without the device +# attached. Takes effect next time snd_usb_audio (re)probes the device +# (reboot, module reload, or replug) -- not applied retroactively here. +sudo install -d -m 755 /etc/modprobe.d +sudo tee /etc/modprobe.d/nuforce-udac-quirks.conf > /dev/null <<'EOF' +# fixed_rate (bit 21): device only offers one sample rate; stop the +# driver re-sending SET_CUR for it ("cannot set freq 48000 to ep 0x3"). +# ctl_msg_delay (bit 8): 20ms pause around each USB control message. +# iface_delay (bit 11): 50ms pause around each SET_INTERFACE call. +options snd_usb_audio quirk_flags=262a:10aa:0x200900 +EOF + if [ ! -d "$HOME/repos/yay" ]; then mkdir -p "$HOME/repos" cd "$HOME/repos"