Powrót do strony głównej

Regresja dźwięku snd_hda_intel: poprawka PCI rescan

Analiza regresji snd_hda_intel: timeout resetu CORB na Intel HDA po aktualizacji jądra. Diagnostyka przez dmesg, rozwiązanie — PCI rescan via sysfs z ponownym przydzieleniem BAR. Automatyzacja i wskazówki do debugowania dla starego sprzętu.

Jak naprawić dźwięk: PCI rescan przeciw regresji jądra
Advertisement 728x90

Regresja snd_hda_intel: jak PCI rescan uratował dźwięk na starym laptopie

Po aktualizacji jądra na Emachines E732 z Intel 5 Series/3400 Series HDA (chip-ID 8086:3b56) dźwięk zniknął. aplay -l wyświetla no soundcards found. lspci widzi urządzenie na 00:1b.0, inxi -Axxz potwierdza sterownik snd_hda_intel, ale journalctl jest pełen błędów: hdaudio hdaudioC0D0: no AFG or MFG node found dla wszystkich węzłów.

dmesg ujawnia sedno: podczas inicjalizacji snd_hda_intel 0000:00:1b.0: CORB reset timeout#2, CORBRP = 65535, po czym no codecs initialized. CORB (Command Output Ring Buffer) — bufor pierścieniowy dla poleceń do kodeka. Wartość 0xFFFF wskazuje na zawieszoną szynę lub niedostępny sprzęt: odczyt z niezainicjalizowanego rejestru.

BAR przy zimnym rozruchu: mem 0xd4400000-0xd4403fff 64bit. Ponowne załadowanie modułu (modprobe -r/-a snd_hda_intel) powtarza błąd z nowymi znacznikami czasu.

Google AdInline article slot

Nieskuteczne podejścia do naprawy

Standardowe manipulacje nie pomogły:

  • Przestrzeń użytkownika: reinstalacja PipeWire/WirePlumber, alsamixer — bezużyteczne bez urządzeń ALSA.
  • Opcje modułów: options snd-hda-intel enable=1 power_save=0 power_save_controller=N model=auto w /etc/modprobe.d/alsa-fix.conf.
  • Parametry GRUB: pci=nocrs pci=nomsi pcie_aspm=off snd_hda_intel.power_save=0 snd_hda_intel.dma_mask=0.
  • Hot-reload: modprobe snd_hda_intel msi=0 dsp_driver=1 probe_mask=1.

Problem wczesnej inicjalizacji: jądro/LiveCD z LTS działały z powodu innej kolejności modułów lub stanu BIOS.

[   17.492159] snd_hda_intel 0000:00:1b.0: CORB reset timeout#2, CORBRP = 65535
[   17.492380] snd_hda_intel 0000:00:1b.0: no codecs initialized

Rozwiązanie przez sysfs: PCI hot-swap

Kluczowa intuicja: zimny rozruch przydziela nieprawidłowy BAR, hot-rescan w ogrzanym systemie — działa. Sekwencja:

Google AdInline article slot
  • echo 1 | sudo tee /sys/bus/pci/devices/0000:00:1b.0/remove
  • sleep 2
  • echo 1 | sudo tee /sys/bus/pci/rescan

Nowy dmesg:

[  473.969035] pci 0000:00:1b.0: [8086:3b56] ... 
[  473.969102] pci 0000:00:1b.0: BAR 0 [mem 0x00000000-0x00003fff 64bit]
[  473.969982] pci 0000:00:1b.0: BAR 0 [mem 0x23c000000-0x23c003fff 64bit]: assigned
[  474.095498] input: HDA Intel MID Mic as /devices/pci0000:00/0000:00:1b.0/sound/card0/input24
[  474.095675] input: HDA Intel MID Headphone as /devices/pci0000:00/0000:00:1b.0/sound/card0/input25

Dźwięk pojawia się: karta w /dev/snd, PipeWire widzi urządzenia. Przyczyna — BIOS wydaje nieprawidłowe parametry we wczesnej fazie; rescan po pełnej inicjalizacji PCI przypisuje prawidłowy BAR.

Automatyzacja dla produkcji

Dla skryptu w systemd (post-boot):

Google AdInline article slot
#!/bin/bash
PCI_ID="0000:00:1b.0"
echo 1 > /sys/bus/pci/devices/$PCI_ID/remove
sleep 2
echo 1 > /sys/bus/pci/rescan
# Sprawdzenie
if aplay -l | grep -q "card 0"; then
    systemctl --user restart pipewire pipewire-pulse wireplumber
fi

Dodaj do /etc/systemd/system/pci-audio-rescan.service z After=multi-user.target.

Diagnostyka podobnych regresji

Dla snd_hda_intel na legacy Intel HDA:

  • Zbierz logi: dmesg | grep '00:1b.0', journalctl -b -p err | grep hda.
  • Sprawdź BAR: lspci -vv -s 00:1b.0 | grep BAR.
  • Przetestuj rescan: metoda sysfs powyżej.
  • Porównaj jądra: LTS vs mainline — regresja w PCI alloc lub zarządzaniu energią.
  • BIOS/UEFI: Aktualizuj jeśli dostępne, ale rzadko pomaga na chipsetach z 2010-ych.

Problem typowy dla starego sprzętu po kernel 6.8+: zmiany w PCI enumeration i ASPM.

Co jest ważne

  • CORBRP=0xFFFF — marker zawieszonego kontrolera HDA, nie BIOS/kodek.
  • PCI rescan via sysfs omija timeout'y zimnego rozruchu, przydzielając BAR na nowo.
  • Jądra LTS działają dzięki timingowi: moduły ładują się później niż handoff BIOS.
  • Automatyzacja: usługa systemd dla niezawodności na produkcyjnych laptopach.
  • Diagnostyka: dmesg > przestrzeń użytkownika, skup się na PCI BAR i CORB/RIRB.

— Editorial Team

Advertisement 728x90

Czytaj dalej