## snd_hda_intel 회귀 오류 수정: PCI 재스캔으로 오래된 노트북 오디오 복구
Emachines E732 노트북에서 Intel 5 Series/3400 Series HDA (칩 ID 8086:3b56) 칩셋으로 커널 업데이트 후 오디오가 사라졌습니다. aplay -l 명령어는 no soundcards found를 보고하고, lspci는 00:1b.0에서 장치를 감지하지만, inxi -Axxz는 snd_hda_intel 드라이버를 확인합니다. 그러나 journalctl은 모든 노드에서 hdaudio hdaudioC0D0: no AFG or MFG node found 오류로 가득 차 있습니다.
dmesg가 진짜 원인을 밝혀줍니다: 초기화 중 snd_hda_intel 0000:00:1b.0: CORB reset timeout#2, CORBRP = 65535 오류가 발생한 후 no codecs initialized가 나타납니다. CORB(Command Output Ring Buffer)는 코덱 명령을 위한 링 버퍼입니다. 0xFFFF 값은 버스가 멈추거나 하드웨어에 접근할 수 없음을 나타내는데, 초기화되지 않은 레지스터를 읽으려 할 때 발생합니다.
콜드 부팅 시 BAR: mem 0xd4400000-0xd4403fff 64bit. 모듈 재로드(modprobe -r/-a snd_hda_intel)해도 새로운 타임스탬프와 함께 동일 오류가 반복됩니다.
효과 없는 빠른 수정 방법
일반적인 조치들은 실패했습니다:
- 사용자 공간 도구: PipeWire/WirePlumber 재설치, alsamixer 조정—ALSA 장치가 없으면 무용지물.
- 모듈 옵션:
/etc/modprobe.d/alsa-fix.conf에options snd-hda-intel enable=1 power_save=0 power_save_controller=N model=auto추가. - GRUB 매개변수:
pci=nocrs pci=nomsi pcie_aspm=off snd_hda_intel.power_save=0 snd_hda_intel.dma_mask=0. - 핫 리로드:
modprobe snd_hda_intel msi=0 dsp_driver=1 probe_mask=1.
문제는 초기화 시점에 있습니다: LTS 커널이나 LiveCD는 모듈 로드 순서나 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
해결책: sysfs를 통한 PCI 핫 재스캔
핵심: 콜드 부팅 시 잘못된 BAR 할당되지만, 시스템이 완전히 부팅된 후 핫 재스캔은 성공합니다. 순서:
echo 1 | sudo tee /sys/bus/pci/devices/0000:00:1b.0/removesleep 2echo 1 | sudo tee /sys/bus/pci/rescan
새로운 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
오디오 복구: /dev/snd에 사운드 카드 나타남, PipeWire가 장치 감지. 원인? BIOS가 초기 PCI 초기화 전에 잘못된 매개변수 전달; 전체 PCI 초기화 후 재스캔으로 올바른 BAR 할당.
일상 사용을 위한 자동화
프로덕션 systemd 스크립트(부팅 후):
#!/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
# 확인
if aplay -l | grep -q "card 0"; then
systemctl --user restart pipewire pipewire-pulse wireplumber
fi
/etc/systemd/system/pci-audio-rescan.service에 배치하고 After=multi-user.target 설정.
유사 회귀 오류 진단
레거시 Intel HDA의 snd_hda_intel에 대해:
- 로그 수집:
dmesg | grep '00:1b.0',journalctl -b -p err | grep hda. - BAR 확인:
lspci -vv -s 00:1b.0 | grep BAR. - 재스캔 테스트: 위 sysfs 방법 사용.
- 커널 비교: LTS vs 메인라인—PCI 할당이나 전원 관리 회귀.
- BIOS/UEFI: 가능 시 업데이트, 하지만 2010년 칩셋에서는 드물게 효과.
커널 6.8+ 이후 오래된 하드웨어에 PCI 열거 및 ASPM 변경으로 큰 타격.
주요 요점
- CORBRP=0xFFFF는 HDA 컨트롤러 정지 신호, BIOS/코덱 문제 아님.
- sysfs PCI 재스캔으로 콜드 부팅 타임아웃 우회, BAR 재할당.
- LTS 커널은 BIOS 핸드오버 후 모듈 로드로 성공.
- 자동화: systemd 서비스로 데일리 드라이버 안정성 확보.
- 진단: 사용자 공간보다 dmesg 집중; PCI BAR와 CORB/RIRB 타겟.
— Editorial Team
아직 댓글이 없습니다.