Re: [PATCH AUTOSEL 7.0-6.19] ALSA: usb-audio: Add quirks for Arturia AF16Rig
From: Philip Willoughby
Date: Mon Apr 20 2026 - 13:29:05 EST
AF16Rig support also needs the patch to increase the channel limit in
https://lore.kernel.org/linux-sound/87v7fjbsxm.wl-tiwai@xxxxxxx/ I
have not tested what happens without that change also being present
but I suspect it would mean that the AF16Rig still would not function.
On Mon, 20 Apr 2026 at 14:16, Sasha Levin <sashal@xxxxxxxxxx> wrote:
>
> From: Phil Willoughby <willerz@xxxxxxxxx>
>
> [ Upstream commit 0da18c2dd1cc2a026416222ed206e2f269edf055 ]
>
> The AF16Rig supports 34 channels at 44.1k/48k, 18 channels at 88.2k/96k
> and 10 channels at 176.4k/192k.
>
> This quirks is necessary because the automatic probing process we would
> otherwise use fails. The root cause of that is that the AF16Rig clock is
> not readable (its descriptor says that it is but the reads fail).
>
> Except as described below, the values in the audio format quirks were
> copied from the USB descriptors of the device. The rate information is
> from the datasheet of the device. The clock is the internal clock of the
> AF16Rig.
>
> Tested-By: Phil Willoughby <willerz@xxxxxxxxx>
> I have tested all the configurations enabled by this patch.
>
> Cc: Jaroslav Kysela <perex@xxxxxxxx>
> Cc: Takashi Iwai <tiwai@xxxxxxxx>
> Signed-off-by: Phil Willoughby <willerz@xxxxxxxxx>
> Link: https://patch.msgid.link/20260328112426.14816-1-willerz@xxxxxxxxx
> Signed-off-by: Takashi Iwai <tiwai@xxxxxxx>
> Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>
> ---
>
> LLM Generated explanations, may be completely bogus:
>
> Now I have all the information needed for a thorough analysis. Let me
> compile the findings.
>
> ---
>
> ## PHASE 1: COMMIT MESSAGE FORENSICS
>
> ### Step 1.1: Subject Line
> - **Subsystem:** ALSA: usb-audio
> - **Action verb:** "Add" (quirks)
> - **Summary:** Adds USB audio quirks for the Arturia AF16Rig device
>
> ### Step 1.2: Tags
> - **Tested-By:** Phil Willoughby <willerz@xxxxxxxxx> — the author tested
> all configurations
> - **Cc:** Jaroslav Kysela (ALSA maintainer), Takashi Iwai (ALSA/USB-
> audio maintainer)
> - **Signed-off-by:** Phil Willoughby (author), Takashi Iwai (maintainer,
> applied the patch)
> - **Link:**
> https://patch.msgid.link/20260328112426.14816-1-willerz@xxxxxxxxx
> - No Fixes: tag (expected for quirk additions)
> - No Cc: stable (expected — that's why we're reviewing)
>
> ### Step 1.3: Commit Body
> The commit explains that the AF16Rig supports multiple channel/rate
> configurations (34ch@44.1k/48k, 18ch@88.2k/96k, 10ch@176.4k/192k). The
> **root cause is that the AF16Rig clock is broken** — its USB descriptor
> claims the clock is readable but reads fail, which causes the automatic
> probing process to fail entirely. Without this quirk, the device simply
> does not work.
>
> ### Step 1.4: Hidden Bug Fix Detection
> This IS a hardware workaround for a broken device. The device's USB
> descriptors are incorrect (clock readability is falsely advertised),
> causing the standard enumeration path to fail. This is the textbook
> definition of a USB audio device quirk.
>
> ## PHASE 2: DIFF ANALYSIS
>
> ### Step 2.1: Inventory
> - **Files changed:** 1 file (`sound/usb/quirks-table.h`)
> - **Lines added:** ~165 lines (purely data — struct initializers in the
> quirk table)
> - **Lines removed:** 0
> - **Scope:** Single-file, data-only addition to an existing quirk table
>
> ### Step 2.2: Code Flow Change
> The patch adds a new entry to the USB audio quirks table for USB VID:PID
> `0x1c75:0xaf20`. It defines:
> - 1 standard mixer interface (interface 0)
> - 3 playback audio format configurations (interface 1) for different
> sample rates
> - 3 capture audio format configurations (interface 2) for the same rates
> - 1 ignored interface (interface 3, firmware update)
>
> The entry is inserted between the last `QUIRK_RME_DIGIFACE` entry and
> the `#undef` lines at the end of the file.
>
> ### Step 2.3: Bug Mechanism
> Category: **Hardware workaround (h)**. The device has a broken clock
> descriptor — it claims the clock is readable but reads fail. This
> prevents the standard UAC2 enumeration from working. The quirk bypasses
> automatic probing by providing the correct audio format information
> directly.
>
> ### Step 2.4: Fix Quality
> - All macros used (`QUIRK_DATA_AUDIOFORMAT`, `QUIRK_DATA_COMPOSITE`,
> `QUIRK_DRIVER_INFO`, `QUIRK_DATA_STANDARD_MIXER`, `QUIRK_DATA_IGNORE`,
> `QUIRK_COMPOSITE_END`) are already defined in the same file (verified
> at lines 41, 49, 58, 72, 78, 87)
> - Pure data — no logic changes, no control flow changes
> - Only affects the specific USB device `0x1c75:0xaf20`
> - Zero regression risk for any other device or code path
> - Author tested all configurations enabled by the patch
>
> ## PHASE 3: GIT HISTORY INVESTIGATION
>
> ### Step 3.1: Blame
> The insertion point is at the end of the quirks table after the RME
> Digiface entries. The macros were introduced by `0c3ad39b791c2` ("Define
> macros for quirk table entries") and `d79e13f8e8abb` ("Replace complex
> quirk lines with macros"), both of which are present in this tree.
>
> ### Step 3.2: Fixes Tag
> No Fixes: tag — this is a new device quirk, not a fix for a specific
> regression.
>
> ### Step 3.3: File History
> The file has a long history of similar quirk additions: Pioneer DJ
> DJM-V10, RME Digiface USB, Pioneer DDJ-800, Mythware XA001AU, Mbox3,
> etc. This is a well-established pattern.
>
> ### Step 3.4: Author
> Phil Willoughby also contributed `bc5b4e5ae1a67` ("Fix quirk flags for
> NeuralDSP Quad Cortex") around the same date, showing familiarity with
> the USB audio quirk system.
>
> ### Step 3.5: Dependencies
> The patch uses macros already present in the stable tree. No
> prerequisite commits are needed. The insertion point
> (`QUIRK_RME_DIGIFACE(0x3fa0)` followed by `#undef`) exists at lines
> 3901-3903, confirming clean applicability.
>
> ## PHASE 4: MAILING LIST RESEARCH
>
> ### Step 4.1-4.5
> b4 dig could not find the commit (it's not yet in the tree we're on).
> Lore was blocked by anti-bot protection. However, the commit message
> includes a Link to the patch submission, and Takashi Iwai (the USB audio
> maintainer) signed off on it, confirming maintainer review and
> acceptance.
>
> ## PHASE 5: CODE SEMANTIC ANALYSIS
>
> ### Step 5.1-5.5
> This is purely a data table addition. There are no new functions, no
> logic changes, no callers/callees to trace. The quirk table is consumed
> by the existing USB audio driver infrastructure which already handles
> all the macros and format types used.
>
> ## PHASE 6: STABLE TREE ANALYSIS
>
> ### Step 6.1: Code Existence in Stable
> The quirks table and all macros used exist in this 7.0 stable tree.
> Verified: `QUIRK_DATA_AUDIOFORMAT` at line 87, `QUIRK_DATA_COMPOSITE` at
> line 78, `QUIRK_DRIVER_INFO` at line 41, etc.
>
> ### Step 6.2: Backport Complications
> The patch should apply cleanly. The insertion point (between
> `QUIRK_RME_DIGIFACE(0x3fa0),` at line 3901 and `#undef
> USB_DEVICE_VENDOR_SPEC` at line 3903) is present and matches the diff
> context exactly.
>
> ### Step 6.3: Related Fixes
> No prior fixes for AF16Rig exist — this is the first support entry.
>
> ## PHASE 7: SUBSYSTEM CONTEXT
>
> ### Step 7.1
> - **Subsystem:** sound/usb (USB audio drivers)
> - **Criticality:** IMPORTANT — USB audio is used by musicians, content
> creators, and professionals who rely on specific hardware
>
> ### Step 7.2
> Active subsystem with regular quirk additions (verified: 10+ recent
> commits adding device quirks).
>
> ## PHASE 8: IMPACT AND RISK ASSESSMENT
>
> ### Step 8.1: Who is Affected
> Users of the Arturia AF16Rig USB audio interface. Without this quirk,
> the device is **completely non-functional** under Linux.
>
> ### Step 8.2: Trigger Conditions
> Every time the device is plugged in. The broken clock descriptor causes
> enumeration failure immediately.
>
> ### Step 8.3: Failure Mode
> Without quirk: Device probing fails, no audio functionality at all.
> **Severity: HIGH** (total device failure).
>
> ### Step 8.4: Risk-Benefit
> - **Benefit:** HIGH — enables a professional audio device that is
> otherwise non-functional
> - **Risk:** VERY LOW — pure data addition to a quirk table, device-
> specific, affects no other hardware, uses existing macros, tested by
> the author
> - **Ratio:** Strongly favorable
>
> ## PHASE 9: FINAL SYNTHESIS
>
> ### Step 9.1: Evidence Summary
> **FOR backporting:**
> - Hardware quirk/workaround for a broken device (clock descriptor lie)
> - Pure data addition, no logic changes
> - Zero regression risk for any other device
> - Uses macros already present in stable
> - Tested by the author on all configurations
> - Accepted by subsystem maintainer (Takashi Iwai)
> - Well-established pattern (dozens of similar entries in the same file)
> - Falls squarely into the "QUIRKS and WORKAROUNDS" exception category
>
> **AGAINST backporting:**
> - Large (~165 lines), though entirely data
> - New device support rather than fixing a regression in existing support
>
> ### Step 9.2: Stable Rules Checklist
> 1. Obviously correct and tested? **YES** — data copied from USB
> descriptors, tested by author
> 2. Fixes a real bug? **YES** — device completely non-functional without
> it (broken clock descriptor)
> 3. Important issue? **YES** — total hardware failure for users of this
> device
> 4. Small and contained? **YES** — single file, data-only, device-
> specific
> 5. No new features or APIs? **YES** — no new APIs, just quirk data
> 6. Can apply to stable? **YES** — insertion point and all macros exist
>
> ### Step 9.3: Exception Category
> **Hardware quirk/workaround** — this is explicitly listed as a YES-by-
> default category in the stable kernel rules analysis.
>
> ## Verification
>
> - [Phase 1] Parsed tags: Tested-by from author, Signed-off-by from
> maintainer Takashi Iwai
> - [Phase 2] Diff analysis: ~165 lines of struct initializer data added
> to quirks-table.h; zero logic changes
> - [Phase 2] Verified all macros used: QUIRK_DATA_AUDIOFORMAT (line 87),
> QUIRK_DATA_COMPOSITE (line 78), QUIRK_DRIVER_INFO (line 41),
> QUIRK_DATA_STANDARD_MIXER (line 58), QUIRK_DATA_IGNORE (line 49),
> QUIRK_COMPOSITE_END (line 72)
> - [Phase 3] git log --oneline -20 -- sound/usb/quirks-table.h: confirmed
> long history of similar quirk additions
> - [Phase 3] git show bc5b4e5ae1a67: confirmed author has other USB audio
> work (NeuralDSP fix)
> - [Phase 4] b4 dig failed to find match (commit not in tree); lore
> blocked by anti-bot; maintainer sign-off confirmed from commit
> metadata
> - [Phase 5] No functions to trace — pure data table entry
> - [Phase 6] Verified insertion point exists at lines 3901-3903
> (QUIRK_RME_DIGIFACE followed by #undef); patch should apply cleanly
> - [Phase 6] Verified Arturia VID 0x1c75 has no existing entries (grep
> returned no matches)
> - [Phase 7] Subsystem is actively maintained with regular quirk
> additions
> - [Phase 8] Failure mode: complete device non-functionality; severity
> HIGH; risk VERY LOW (data-only, device-specific)
> - UNVERIFIED: Could not access mailing list discussion due to anti-bot
> protection; relying on maintainer sign-off as evidence of review
>
> This is a textbook USB audio device quirk addition. The Arturia AF16Rig
> has a broken clock descriptor that prevents standard enumeration, making
> the device completely non-functional without this quirk. The patch is
> pure data, uses existing macros, and affects only the specific device.
> It carries essentially zero regression risk.
>
> **YES**
>
> sound/usb/quirks-table.h | 165 +++++++++++++++++++++++++++++++++++++++
> 1 file changed, 165 insertions(+)
>
> diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
> index eafc0d73cca1f..8f79a15055a6a 100644
> --- a/sound/usb/quirks-table.h
> +++ b/sound/usb/quirks-table.h
> @@ -3900,5 +3900,170 @@ YAMAHA_DEVICE(0x7010, "UB99"),
> QUIRK_RME_DIGIFACE(0x3f8c),
> QUIRK_RME_DIGIFACE(0x3fa0),
>
> +/* Arturia AudioFuse 16Rig Audio */
> +/* AF16Rig MIDI has USB PID 0xaf21 and appears to work OK without quirks */
> +{
> + USB_DEVICE(0x1c75, 0xaf20),
> + QUIRK_DRIVER_INFO {
> + .vendor_name = "Arturia",
> + .product_name = "AF16Rig",
> + QUIRK_DATA_COMPOSITE {
> + { QUIRK_DATA_STANDARD_MIXER(0) },
> + {
> + QUIRK_DATA_AUDIOFORMAT(1) { /* Playback */
> + .formats = SNDRV_PCM_FMTBIT_S32_LE,
> + .channels = 34,
> + .fmt_type = UAC_FORMAT_TYPE_I_PCM,
> + .fmt_bits = 24,
> + .fmt_sz = 4,
> + .iface = 1,
> + .altsetting = 1,
> + .altset_idx = 1,
> + .endpoint = 0x01,
> + .ep_attr = USB_ENDPOINT_XFER_ISOC|
> + USB_ENDPOINT_SYNC_ASYNC,
> + .datainterval = 1,
> + .protocol = UAC_VERSION_2,
> + .maxpacksize = 0x03b8,
> + .rates = SNDRV_PCM_RATE_44100|
> + SNDRV_PCM_RATE_48000,
> + .rate_min = 44100,
> + .rate_max = 48000,
> + .nr_rates = 2,
> + .rate_table = (unsigned int[]) { 44100, 48000 },
> + .clock = 41,
> + }
> + },
> + {
> + QUIRK_DATA_AUDIOFORMAT(1) { /* Playback */
> + .formats = SNDRV_PCM_FMTBIT_S32_LE,
> + .channels = 18,
> + .fmt_type = UAC_FORMAT_TYPE_I_PCM,
> + .fmt_bits = 24,
> + .fmt_sz = 4,
> + .iface = 1,
> + .altsetting = 1,
> + .altset_idx = 1,
> + .endpoint = 0x01,
> + .ep_attr = USB_ENDPOINT_XFER_ISOC|
> + USB_ENDPOINT_SYNC_ASYNC,
> + .datainterval = 1,
> + .protocol = UAC_VERSION_2,
> + .maxpacksize = 0x03a8,
> + .rates = SNDRV_PCM_RATE_88200|
> + SNDRV_PCM_RATE_96000,
> + .rate_min = 88200,
> + .rate_max = 96000,
> + .nr_rates = 2,
> + .rate_table = (unsigned int[]) { 88200, 96000 },
> + .clock = 41,
> + }
> + },
> + {
> + QUIRK_DATA_AUDIOFORMAT(1) { /* Playback */
> + .formats = SNDRV_PCM_FMTBIT_S32_LE,
> + .channels = 10,
> + .fmt_type = UAC_FORMAT_TYPE_I_PCM,
> + .fmt_bits = 24,
> + .fmt_sz = 4,
> + .iface = 1,
> + .altsetting = 3,
> + .altset_idx = 3,
> + .endpoint = 0x01,
> + .ep_attr = USB_ENDPOINT_XFER_ISOC|
> + USB_ENDPOINT_SYNC_ASYNC,
> + .datainterval = 1,
> + .protocol = UAC_VERSION_2,
> + .maxpacksize = 0x03e8,
> + .rates = SNDRV_PCM_RATE_176400|
> + SNDRV_PCM_RATE_192000,
> + .rate_min = 176400,
> + .rate_max = 192000,
> + .nr_rates = 2,
> + .rate_table = (unsigned int[]) { 176400, 192000 },
> + .clock = 41,
> + }
> + },
> + {
> + QUIRK_DATA_AUDIOFORMAT(2) { /* Capture */
> + .formats = SNDRV_PCM_FMTBIT_S32_LE,
> + .channels = 34,
> + .fmt_type = UAC_FORMAT_TYPE_I_PCM,
> + .fmt_bits = 24,
> + .fmt_sz = 4,
> + .iface = 2,
> + .altsetting = 1,
> + .altset_idx = 1,
> + .endpoint = 0x81,
> + .ep_attr = USB_ENDPOINT_XFER_ISOC|
> + USB_ENDPOINT_SYNC_ASYNC,
> + .datainterval = 1,
> + .protocol = UAC_VERSION_2,
> + .maxpacksize = 0x03b8,
> + .rates = SNDRV_PCM_RATE_44100|
> + SNDRV_PCM_RATE_48000,
> + .rate_min = 44100,
> + .rate_max = 48000,
> + .nr_rates = 2,
> + .rate_table = (unsigned int[]) { 44100, 48000 },
> + .clock = 41,
> + }
> + },
> + {
> + QUIRK_DATA_AUDIOFORMAT(2) { /* Capture */
> + .formats = SNDRV_PCM_FMTBIT_S32_LE,
> + .channels = 18,
> + .fmt_type = UAC_FORMAT_TYPE_I_PCM,
> + .fmt_bits = 24,
> + .fmt_sz = 4,
> + .iface = 2,
> + .altsetting = 2,
> + .altset_idx = 2,
> + .endpoint = 0x81,
> + .ep_attr = USB_ENDPOINT_XFER_ISOC|
> + USB_ENDPOINT_SYNC_ASYNC,
> + .datainterval = 1,
> + .protocol = UAC_VERSION_2,
> + .maxpacksize = 0x03a8,
> + .rates = SNDRV_PCM_RATE_88200|
> + SNDRV_PCM_RATE_96000,
> + .rate_min = 88200,
> + .rate_max = 96000,
> + .nr_rates = 2,
> + .rate_table = (unsigned int[]) { 88200, 96000 },
> + .clock = 41,
> + }
> + },
> + {
> + QUIRK_DATA_AUDIOFORMAT(2) { /* Capture */
> + .formats = SNDRV_PCM_FMTBIT_S32_LE,
> + .channels = 10,
> + .fmt_type = UAC_FORMAT_TYPE_I_PCM,
> + .fmt_bits = 24,
> + .fmt_sz = 4,
> + .iface = 2,
> + .altsetting = 3,
> + .altset_idx = 3,
> + .endpoint = 0x81,
> + .ep_attr = USB_ENDPOINT_XFER_ISOC|
> + USB_ENDPOINT_SYNC_ASYNC,
> + .datainterval = 1,
> + .protocol = UAC_VERSION_2,
> + .maxpacksize = 0x03e8,
> + .rates = SNDRV_PCM_RATE_176400|
> + SNDRV_PCM_RATE_192000,
> + .rate_min = 176400,
> + .rate_max = 192000,
> + .nr_rates = 2,
> + .rate_table = (unsigned int[]) { 176400, 192000 },
> + .clock = 41,
> + }
> + },
> + { QUIRK_DATA_IGNORE(3) }, /* Firmware update */
> + QUIRK_COMPOSITE_END
> + }
> + }
> +},
> +
> #undef USB_DEVICE_VENDOR_SPEC
> #undef USB_AUDIO_DEVICE
> --
> 2.53.0
>