0xFF

USB Wi-Fi 어댑터 접촉불량에 의한 AP 접속 불안정 문제 본문

LINUX

USB Wi-Fi 어댑터 접촉불량에 의한 AP 접속 불안정 문제

캡스락 2026. 4. 26. 23:51

리눅스 보드에서 AP 구동을 위해 사용 중인 USB 동글이 커넥터 불안정으로 인해 드라이버에서 잦은 타임아웃이 발생하는 것을 확인했다.

[ 1810.128976] usb 2-1: USB disconnect, device number 38
[ 1810.261956] ath: phy9: Could not kill baseband RX
[ 1810.286093] ath: phy9: Failed to wakeup in 500us
[ 1810.297940] ath: phy9: Failed to wakeup in 500us
[ 1810.320928] usb 2-1: ath9k_htc: USB layer deinitialized

처음에는 동글을 뺐다가 다시 꽂은 뒤 hostapd 데몬을 재시작도 해보고
USB 포트를 바꿔 보기도 했으며, 만듦새가 더 나은 연장 케이블로 교체해보기도 했지만 그때뿐이었다.
그래서 atk9k_htc 드라이버를 수정하여 타임아웃 시간을 늘려볼까도 생각했지만 USB를 납땜해버리지 않는 한(어쩌면 납땜했더라도) 근본적인 해결책은 아닐 것 같았다.
따라서 AP 모드로 사용 중인 인터페이스의 상태 변동에 따라 트리거되는 udev 룰을 만들어 hostapd 데몬을 재시작하기로 했다.

# ip addr
...
10: wlxc01c3043146b: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether c0:1c:30:43:14:6b brd ff:ff:ff:ff:ff:ff

먼저 AP로 사용 중인 AR9271 어댑터의 인터페이스 이름을 확인해 본다.
확인 결과 ‘wlxc01c3043146b’ 인 것을 확인할 수 있었다.

SUBSYSTEM=="net", ACTION=="change", KERNEL=="wlxc01c3043146b", RUN+="/usr/local/bin/hostapd_restart.sh"

이제 /etc/udev/rules.d/99-hostapd-watchdog.rules 경로에 위와 같이 udev rule을 작성한다.
이렇게 작성하면 wlxc01c3043146b 장치의 상태가 변경될 때 RUN 구문에 작성한 스크립트가 실행된다.
우리가 희망하는 것은 up에서 down으로 변경되는 상태에 자동으로 대응하는 것이므로 이에 대한 처리 방법을 작성하면 되겠다.

#!/bin/bash

IFACE="wlxc01c3043146b"

for i in {1..5}
do
	if [ "$(cat /sys/class/net/$IFACE/operstate)" != "up" ]; then
		echo "Trying to restart hostapd.. ($i / 5)"
		sleep 5
		/bin/systemctl restart hostapd
		/bin/systemctl restart set-ip4hostapd
	fi
done

스크립트 내용은 AP 인터페이스의 상태를 확인하여 hostapd와 정적 ip를 할당하는 서비스(set-ip4hostapd)를 down이 아닌 상태(=up)가 될때까지 최대 5번 서비스를 재시작하는 것이다.

sudo udevadm control --reload-rules
sudo udevadm trigger

udev를 재시작한 뒤 Wi-Fi 어댑터를 건드려서 인식 불량을 유도한 다음 udev rule에 의해 hostapd가 재시작되는지 확인한다.