Public bug reported:

## Summary

Internal speakers stopped working on a Lenovo Legion 7 16ITHg6 (machine
type 82K6) after a kernel update within Ubuntu 26.04. The machine has a
Realtek ALC287 HDA codec plus two Cirrus Logic CS35L41 amplifiers on I2C
driving the internal speakers.

This is a **regression**, and the cause is a single added quirk table
entry.

- Last known good: 7.0.0-22-generic
- First known bad:  7.0.0-27-generic
- Still broken in:  7.0.0-28-generic, 7.0.0-29-generic (current)

Headphone jack, Bluetooth, HDMI audio and the internal microphone all
work fine. Speakers work correctly under Windows on the same machine
(dual boot).

## Hardware

- Model: LENOVO 82K6 — Legion 7 16ITHg6
- BIOS: H1CN58WW, 04/11/2024
- HDA controller: 00:1f.3 Intel Tiger Lake-H HD Audio [8086:43c8] rev 11
- **PCI subsystem ID: 17aa:3811**
- HDA codec: Realtek ALC287, vendor id 0x10ec0287
- **Codec subsystem ID: 0x17aa3855**
- Amplifiers: 2x Cirrus Logic CS35L41 (35a40) Revision B2, I2C, ACPI id CLSA0101

Note that the PCI subsystem ID and the codec subsystem ID differ. This is the 
crux
of the bug.

## Symptom

On the broken kernel the wrong fixup is applied and the CS35L41
amplifiers never load their DSP firmware:

```
cs35l41-hda i2c-CLSA0101:00-cs35l41-hda.0: Using extra _DSD properties, 
bypassing _DSD in ACPI
cs35l41-hda i2c-CLSA0101:00-cs35l41-hda.0: Cirrus Logic CS35L41 (35a40), 
Revision: B2
cs35l41-hda i2c-CLSA0101:00-cs35l41-hda.1: Using extra _DSD properties, 
bypassing _DSD in ACPI
cs35l41-hda i2c-CLSA0101:00-cs35l41-hda.1: Reset line busy, assuming shared 
reset
snd_hda_codec_alc269 hdaudioC0D0: ALC287: picked fixup  for PCI SSID 17aa:3811
snd_hda_codec_alc269 hdaudioC0D0: autoconfig for ALC287: line_outs=1 
(0x17/0x0/0x0/0x0/0x0) type:speaker
snd_hda_codec_alc269 hdaudioC0D0:    speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)
snd_hda_codec_alc269 hdaudioC0D0:    hp_outs=1 (0x21/0x0/0x0/0x0/0x0)
cs35l41-hda i2c-CLSA0101:00-cs35l41-hda.1: Cirrus Logic CS35L41 (35a40), 
Revision: B2
```

Both amplifiers are probed, but there is no `DSP1` firmware line at all
and the speakers stay completely silent.

On 7.0.0-22-generic the same machine logged `picked fixup for codec SSID
17aa:3855` and proceeded to load `cirrus/cs35l41-dsp1-spk-
prot-17aa3855.wmfw`, and the speakers worked.

(The fixup name in the message above is blank because the Ubuntu kernel is 
built without `CONFIG_SND_DEBUG_VERBOSE`, so `SND_PCI_QUIRK` drops the `.name` 
field.
This is expected and is not itself the problem.)

## Root cause

I compared the ALC269 quirk table between the last-good and the current module, 
by extracting `snd-hda-codec-alc269.ko` from both packages and decoding the
`struct snd_pci_quirk` entries directly (12-byte stride, no `.name` pointer, 
consistent with `CONFIG_SND_DEBUG_VERBOSE` being off).

Across the entire `0x17aa` vendor range there is exactly one difference:

| Subdevice | 7.0.0-22 (good) | 7.0.0-29 (bad) |
|---|---|---|
| `17aa:3811` | **absent** | **fixup id 254 (added)** |
| `17aa:3813` | fixup id 254 | fixup id 254 |
| `17aa:3855` | fixup id 277 | fixup id 279 |

- Exactly one entry was added (`17aa:3811`); none were removed.
- `17aa:3855` is still present and correct — the numeric id shift from 277 to 
279 is just enum renumbering from unrelated fixups added in between.
- The new `17aa:3811` entry points at the same fixup as `17aa:3813`, i.e. the 
Legion 16ACHg6 family fixup.

`snd_hda_pick_fixup()` matches the **PCI SSID before the codec SSID**. On this 
machine the PCI SSID is `17aa:3811` and the codec SSID is `17aa:3855`, so the 
newly added PCI-SSID entry now shadows the correct, still-present codec-SSID 
quirk for the 16ITHg6. The 16ACHg6 fixup that gets applied instead does not 
bind the CS35L41
amplifiers over I2C, hence the silence.

In other words: the Legion 7 16ITHg6 (Intel, 82K6) and the Legion 16ACHg6 (AMD) 
apparently share the PCI subsystem ID `17aa:3811`, and are only distinguishable 
by
their codec subsystem ID.

## Suggested fix

Any of these would work; the second seems safest:

1. Give the codec SSID precedence over the PCI SSID in `snd_hda_pick_fixup()`. 
Correct in principle but a core HDA change that could affect other machines.
2. **Drop or narrow the `17aa:3811` PCI-SSID quirk and match the 16ACHg6 by its 
codec SSID instead**, since `17aa:3811` demonstrably collides between two 
different machines that need different fixups.
3. Add a DMI match to disambiguate the two models.

## Not the cause

Ruled out during diagnosis:

- Missing firmware — `/lib/firmware/cirrus/` contains 
`cs35l41-dsp1-spk-prot-17aa3855.wmfw.zst` and all four 
`cs35l41-dsp1-spk-prot-17aa3855-spkid{0,1}-{l,r}0.bin.zst`.
- Muted mixers — all controls unmuted, `speaker-test` on `hw:0,0` runs without 
error.
- PipeWire / userspace — the failure is visible at the kernel log level.
- Local configuration — there are no `snd`/`model=` overrides in 
`/etc/modprobe.d/`.

## Workaround

None available to users via `model=`. The relevant fixups
(`ALC287_FIXUP_LEGION_16ITHG6` / `ALC287_FIXUP_CS35L41_I2C_2`) have no
entry in `alc269_fixup_models[]`, so they cannot be forced from
`/etc/modprobe.d/`. The only known workaround is booting
7.0.0-22-generic.

ProblemType: Bug
DistroRelease: Ubuntu 26.04
Package: linux-image-7.0.0-29-generic 7.0.0-29.29
ProcVersionSignature: Ubuntu 7.0.0-29.29-generic 7.0.12
Uname: Linux 7.0.0-29-generic x86_64
NonfreeKernelModules: nvidia_modeset nvidia
ApportVersion: 2.34.1-0ubuntu0.1
Architecture: amd64
AudioDevicesInUse:
 USER        PID ACCESS COMMAND
 /dev/snd/controlC0:  alesitom   6633 F.... wireplumber
 /dev/snd/controlC1:  alesitom   6633 F.... wireplumber
 /dev/snd/seq:        alesitom   6613 F.... pipewire
CasperMD5CheckResult: pass
CurrentDesktop: ubuntu:GNOME
Date: Mon Aug 10 09:51:43 2026
InstallationDate: Installed on 2026-05-05 (97 days ago)
InstallationMedia: Ubuntu 26.04 "Resolute Raccoon" - Release amd64 (20260423.1)
MachineType: LENOVO 82K6
ProcEnviron:
 LANG=en_US.UTF-8
 PATH=(custom, no user)
 SHELL=/bin/bash
 TERM=xterm-ghostty
 XDG_RUNTIME_DIR=<set>
ProcFB: 0 i915drmfb
ProcKernelCmdLine: BOOT_IMAGE=/vmlinuz-7.0.0-29-generic 
root=/dev/mapper/ubuntu--vg-ubuntu--lv ro quiet splash 
crashkernel=2G-4G:320M,4G-32G:512M,32G-64G:1024M,64G-128G:2048M,128G-:4096M
SourcePackage: linux
UpgradeStatus: No upgrade log present (probably fresh install)
dmi.bios.date: 04/11/2024
dmi.bios.release: 1.58
dmi.bios.vendor: LENOVO
dmi.bios.version: H1CN58WW
dmi.board.asset.tag: NO Asset Tag
dmi.board.name: LNVNB161216
dmi.board.vendor: LENOVO
dmi.board.version: SDK0T76461 WIN
dmi.chassis.asset.tag: NO Asset Tag
dmi.chassis.type: 10
dmi.chassis.vendor: LENOVO
dmi.chassis.version: Legion 7 16ITHg6
dmi.ec.firmware.release: 1.58
dmi.modalias: 
dmi:bvnLENOVO:bvrH1CN58WW:bd04/11/2024:br1.58:efr1.58:svnLENOVO:pn82K6:pvrLegion716ITHg6:rvnLENOVO:rnLNVNB161216:rvrSDK0T76461WIN:cvnLENOVO:ct10:cvrLegion716ITHg6:skuLENOVO_MT_82K6_BU_idea_FM_Legion716ITHg6:pfaLegion716ITHg6:
dmi.product.family: Legion 7 16ITHg6
dmi.product.name: 82K6
dmi.product.sku: LENOVO_MT_82K6_BU_idea_FM_Legion 7 16ITHg6
dmi.product.version: Legion 7 16ITHg6
dmi.sys.vendor: LENOVO

** Affects: linux (Ubuntu)
     Importance: Undecided
         Status: New


** Tags: amd64 apport-bug resolute wayland-session

** Attachment added: "Alsa info & debug"
   
https://bugs.launchpad.net/bugs/2163143/+attachment/5990940/+files/alsa-reports.zip

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2163143

Title:
  [Lenovo Legion 7 16ITHg6 82K6, Realtek ALC287 + 2x CS35L41]
  Regression: internal speakers silent since 7.0.0-27; new PCI SSID
  quirk 17aa:3811 shadows codec SSID quirk 17aa:3855

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2163143/+subscriptions


-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to