Volver al inicio

Regresión de sonido snd_hda_intel: corrección de reescaneo PCI

Análisis de regresión snd_hda_intel: timeout de reinicio CORB en Intel HDA después de actualización del kernel. Diagnósticos vía dmesg, solución — reescaneo PCI vía sysfs con reasignación de BAR. Automatización y consejos de depuración para hardware antiguo.

Cómo arreglar el sonido: reescaneo PCI contra regresión del kernel
Advertisement 728x90

# Solucionando la regresión de snd_hda_intel: Reescaneo PCI restaura el audio en portátil antiguo

Tras actualizar el kernel en mi Emachines E732 con Intel 5 Series/3400 Series HDA (chip-ID 8086:3b56), el audio desapareció. aplay -l informa no soundcards found. lspci detecta el dispositivo en 00:1b.0, inxi -Axxz confirma el controlador snd_hda_intel, pero journalctl está inundado de errores: hdaudio hdaudioC0D0: no AFG or MFG node found en todos los nodos.

dmesg cuenta la historia real: durante la inicialización, snd_hda_intel 0000:00:1b.0: CORB reset timeout#2, CORBRP = 65535, seguido de no codecs initialized. CORB (Command Output Ring Buffer) es el búfer circular para comandos del códec. Un valor de 0xFFFF indica un bus colgado o hardware inaccesible —lectura de un registro no inicializado.

BAR en arranque en frío: mem 0xd4400000-0xd4403fff 64bit. Recargar el módulo (modprobe -r/-a snd_hda_intel) repite el error con marcas de tiempo nuevas.

Google AdInline article slot

Soluciones rápidas ineficaces

Los ajustes estándar no sirvieron de nada:

  • Herramientas de espacio de usuario: Reinstalar PipeWire/WirePlumber, ajustar alsamixer —inútil sin dispositivos ALSA.
  • Opciones del módulo: options snd-hda-intel enable=1 power_save=0 power_save_controller=N model=auto en /etc/modprobe.d/alsa-fix.conf.
  • Parámetros GRUB: pci=nocrs pci=nomsi pcie_aspm=off snd_hda_intel.power_save=0 snd_hda_intel.dma_mask=0.
  • Recarga en caliente: modprobe snd_hda_intel msi=0 dsp_driver=1 probe_mask=1.

El problema surge de la inicialización temprana: kernels LTS o LiveCDs funcionaban gracias a un orden de carga de módulos diferente o estado del 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

La solución: Reescaneo PCI en caliente vía sysfs

La clave: el arranque en frío asigna un BAR defectuoso, pero el reescaneo en caliente en un sistema ya calentado funciona. Aquí va la secuencia:

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

Salida fresca de 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

¡El audio vuelve! Tarjeta de sonido en /dev/snd, PipeWire detecta los dispositivos. ¿El culpable? El BIOS entrega parámetros erróneos al inicio; el reescaneo tras la inicialización completa de PCI asigna el BAR correcto.

Automatización para uso diario

Para un script systemd de producción (post-arranque):

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
# Verificar
if aplay -l | grep -q "card 0"; then
    systemctl --user restart pipewire pipewire-pulse wireplumber
fi

Colócalo en /etc/systemd/system/pci-audio-rescan.service con After=multi-user.target.

Diagnosticando regresiones similares

Para snd_hda_intel en Intel HDA antiguos:

  • Captura logs: dmesg | grep '00:1b.0', journalctl -b -p err | grep hda.
  • Verifica BAR: lspci -vv -s 00:1b.0 | grep BAR.
  • Prueba reescaneo: Usa el método sysfs de arriba.
  • Compara kernels: LTS vs principal —regresión en asignación PCI o gestión de energía.
  • BIOS/UEFI: Actualiza si está disponible, aunque rara vez ayuda en chipsets de 2010.

Esto afecta duramente al hardware antiguo tras kernel 6.8+: cambios en enumeración PCI y ASPM.

Lecciones clave

  • CORBRP=0xFFFF indica un controlador HDA colgado, no problemas de BIOS/códec.
  • Reescaneo PCI vía sysfs evita timeouts de arranque en frío reasignando BAR.
  • Kernels LTS triunfan por timing: módulos cargan post-entrega del BIOS.
  • Automatización: Servicio systemd garantiza fiabilidad en equipos diarios.
  • Diagnóstico: Enfócate en dmesg sobre espacio de usuario; apunta a PCI BAR y CORB/RIRB.

— Editorial Team

Advertisement 728x90

Leer después