Bluetooth UART가 부팅 직후 간헐적으로 올라오지 않거나 hci0가 생성된 뒤에도 명령 timeout이 난다면, 5.15 계열에서는 HCI UART 초기화 순서와 H4 수신 이벤트 처리의 race를 먼저 의심해야 합니다.
먼저 결론
Linux 5.15.71 기반 제품에서 이 문제가 반복된다면 두 가지를 함께 확인해야 합니다. 첫째는 HCI UART protocol ready(PROTO_READY) 설정 시점이 늦어 초기 수신을 놓치는 문제입니다. 둘째는 H4 장치 등록이 완료되기 전에 들어온 event가 버려져 command 0x1003 tx timeout으로 이어지는 문제입니다.
따라서 PROTO_READY 시점을 앞당기는 패치 하나만 적용하면 불완전할 수 있습니다. 등록 전 event 유실까지 막는 후속 수정을 함께 검토해야 합니다.
현장에서 보이는 증상
대표 로그는 다음과 같습니다.
Bluetooth: hci0: command 0x1003 tx timeout
Bluetooth: hci0: HCI reset during shutdown failed
hciattach가 성공한 것처럼 보여도 이후 bluetoothd가 hci0를 사용하지 못할 수 있습니다. 전원 시퀀스, UART RTS/CTS, firmware download가 정상인데도 재현된다면 소프트웨어 초기화 race의 가능성이 큽니다.
HCI UART와 H4의 역할
HCI UART는 Bluetooth Host와 Controller를 UART로 연결하는 커널 계층입니다. H4는 command, event, ACL 패킷을 1바이트 type으로 구분합니다. 초기화 중 Controller는 예상보다 빠르게 event를 보낼 수 있지만, Host는 아직 protocol state나 hci_dev 등록을 끝내지 못했을 수 있습니다.
핵심은 UART 바이트가 들어오지 않은 것이 아니라, 들어온 바이트를 처리할 준비가 안 된 경로가 버릴 수 있다는 점입니다. logic analyzer에서 traffic이 보인다고 해도 이 race를 배제할 수 없습니다.
race가 생기는 순서
- UART가 열리고 H4 protocol이 설정됩니다.
- Controller가 초기화 event를 보내기 시작합니다.
- 커널은 protocol ready와 hci device 등록을 순차적으로 진행합니다.
- 이 사이에 도착한 event가 버려지면 다음 command가 응답을 기다리다 timeout이 납니다.
확인해야 할 두 종류의 수정
1. PROTO_READY 설정 시점
첫 번째 수정은 HCI UART protocol ready 상태를 더 이르게 설정해, 초기 수신이 준비 전으로 분류되어 폐기되는 창을 줄입니다. 적용 전후에는 hci_uart_set_proto() 주변의 상태 전환과 수신 처리 조건을 비교하세요. vendor BSP에는 같은 함수 주변에 별도 변경이 있을 수 있으므로 commit 전체를 기계적으로 적용하지 않는 편이 안전합니다.
2. 등록 완료 전 event 유실 방지
후속 수정은 hci device 등록이 끝나기 전에 H4 event가 들어오는 경우를 다룹니다. 이 경로가 남아 있으면 PROTO_READY를 앞당긴 뒤에도 command 0x1003 tx timeout이 남을 수 있습니다. 초기 event를 언제부터 유효한 event로 전달할지, 그리고 수신 경로가 등록 전 event를 잃지 않는지를 함께 봐야 합니다.
5.15.71 제품의 선택지
2026년 8월 28일 기준 5.15 LTS 최신 버전은 5.15.219입니다. 5.15.71은 보안·안정성 수정 누적량이 큰 지점이므로 장기적으로는 LTS 전체 업그레이드를 별도 과제로 잡는 편이 맞습니다.
출시 일정이나 vendor BSP 제약 때문에 즉시 업그레이드하기 어렵다면 필요한 commit만 백포트할 수 있습니다. 이때는 현재 tree의 hci_uart·hci_h4 vendor 변경점을 먼저 비교하고, PROTO_READY 관련 수정과 등록 전 event 유실 방지 수정을 함께 가져오세요. 이후 cold boot 반복 시험으로 재현률과 개선률을 비교해야 합니다.
부분 백포트는 빠르지만 다른 안정성 수정은 남습니다. 반대로 5.15.219 업그레이드는 검증 범위가 넓습니다. 단기 장애 대응은 백포트, 다음 유지보수 계획은 LTS 업그레이드로 분리하는 방식이 현실적입니다.
재현과 검증 방법
warm reboot만으로 판단하지 말고 전원 완전 차단 뒤 cold boot를 수십 회 반복하세요. hci0 생성, HCI Reset 완료, bluetoothd 기동, 실제 pairing까지 기록하면 좋습니다.
dmesg -w
btmgmt info
hciconfig -a
UART 레벨에서는 RX/TX와 flow control을 확인하고, 커널 레벨에서는 event 수신 시점과 hci device 등록 시점의 관계를 보세요. 패치 후 timeout만 사라졌는지와 초기화 성공률이 올라갔는지를 모두 확인해야 합니다.
정리
5.15.71 제품이라면 PROTO_READY 관련 수정 하나만 보지 말고, 등록 완료 전 event 유실을 막는 후속 수정까지 한 세트로 검토하세요.
부팅 전체 흐름은 https://donggrri.tistory.com/62 에서, CAN 수신 누락과 FIFO overflow 점검은 https://donggrri.tistory.com/55 에서 이어서 볼 수 있습니다.
참고: Linux Kernel Archives https://www.kernel.org/
'Linux' 카테고리의 다른 글
| 에이전트를 여러 개 쓸 때 tmux가 유용한 이유 (1) | 2026.08.27 |
|---|




