blog.stackframe.dev

리눅스에서 리얼텍 이더넷이 잡히지 않을 때

노트북을 사고 고생했던 부분 중 하나가 이더넷이 인식되지 않았던 것이다. 보통은 윈도우 환경에서는 문제없이 작동하지만 이번에는 윈도우마저 드라이버를 못잡고 문제를 띄우는 상황이었다. 윈도우 환경에서는 자세한 장치 정보를 확인하지도 못해서 리눅스로 PCI ID를 확인하여 진행했다.

윈도우에서는 노트북 제조사에서 제공하는 드라이버를 깔아도 인식을 못하고 그냥 Realtek 사이트에서 찾아서 설치하니 마침내 인식되었다. 다만 리눅스는 뭔 짓을 해도 인식하지 못했다.

리얼텍 이더넷 드라이버는 리눅스 커널에서 직접 제공하는 r8169 모듈과 리얼텍이 자체적으로 제공하는 r8168이 있다. 보통 인터넷에 리얼텍 이더넷이 잡히지 않는다고 검색하면 r8168을 깔면 된다고 나온다. 그런데 나는 이 둘을 모두 시도해봐도 인터페이스가 뜨지 않았다.

lspci 명령어로 PCI ID를 모두 출력하면 아래와 같이 나왔다:

$ lspci -nn
...
0000:03:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. Device [10ec:8162] (rev 05)
...

내 노트북에 장착된 이더넷 칩셋은 Realtek이며 8162란 장치 ID를 가지고 있다는 의미이다. 참고로 10ec는 리얼텍 벤더 ID이다. 현재 리눅스 커널에 있는 r8169와 따로 제공되는 r8168 모듈 둘 다 8162 ID를 포함하지 않기 때문에 모듈이 작동하지 않는다:

static const struct pci_device_id rtl8169_pci_tbl[] = {
	{ PCI_VDEVICE(REALTEK,	0x2502) },
	{ PCI_VDEVICE(REALTEK,	0x2600) },
	{ PCI_VDEVICE(REALTEK,	0x8129) },
	{ PCI_VDEVICE(REALTEK,	0x8136), RTL_CFG_NO_GBIT },
	{ PCI_VDEVICE(REALTEK,	0x8161) },
	{ PCI_VDEVICE(REALTEK,	0x8167) },
	{ PCI_VDEVICE(REALTEK,	0x8168) },
	{ PCI_VDEVICE(NCUBE,	0x8168) },
	{ PCI_VDEVICE(REALTEK,	0x8169) },
	{ PCI_VENDOR_ID_DLINK,	0x4300,
		PCI_VENDOR_ID_DLINK, 0x4b10, 0, 0 },
	{ PCI_VDEVICE(DLINK,	0x4300) },
	{ PCI_VDEVICE(DLINK,	0x4302) },
	{ PCI_VDEVICE(AT,	0xc107) },
	{ PCI_VDEVICE(USR,	0x0116) },
	{ PCI_VENDOR_ID_LINKSYS, 0x1032, PCI_ANY_ID, 0x0024 },
	{ 0x0001, 0x8168, PCI_ANY_ID, 0x2410 },
	{ PCI_VDEVICE(REALTEK,	0x8125) },
	{ PCI_VDEVICE(REALTEK,	0x3000) },
	{}
};
static struct pci_device_id rtl8168_pci_tbl[] = {
        { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8168), },
        { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8161), },
        { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x2502), },
        { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x2600), },
        { PCI_VENDOR_ID_DLINK, 0x4300, 0x1186, 0x4b10,},
        {0,},
};

다행히도 리눅스는 해당 드라이버가 임의의 장치를 지원한다고 인식시킬 수 있는 인터페이스를 제공한다. 각각 /sys/bus/pci/drivers/r8169/new_id/sys/bus/pci/drivers/r8168/new_id벤더ID 장치ID를 write하면 된다:

# echo 10e0 8192 > /sys/bus/pci/drivers/r8169/new_id

장치가 실제로 해당 모듈로 작동할 수 있는 것이라면 인터페이스가 생길 것이고 아니라면 아무 일도 일어나지 않을 것이다. 나는 다행히도 인터페이스가 생기고 속도도 정상적으로 나왔다.

리눅스 5.15부터 패치가 적용되었으므로 위의 방법을 사용하지 않아도 된다.

댓글