本文记录我在龙芯 Loongnix 20.7(内核 4.19.0-19-loongson-3)上,成功驱动 TP-Link TL-WN823N V2 无线网卡(Realtek RTL8192FU 芯片)的完整过程。
整个折腾持续了1天,期间踩坑无数,最终在 DeepSeek 的逐步引导下完成。
本文分为「避坑指南」和「抄作业步骤」两部分,希望能帮到同样在龙芯平台上折腾 USB 无线网卡的朋友。
一、避坑指南(这些错误别再犯)
❌ 错误 1:直接 usb_modeswitch,忽略 usb-storage 抢占
TL-WN823N 插入后默认是 CD 模式(0bda:a192),需要切换到 Wi-Fi 模式(2357:0135)。
但内核的 usb-storage 驱动会抢先绑定设备,导致 usb_modeswitch 发送切换指令失败,dmesg 里出现无限 reset high-speed USB device 循环。
教训:必须先让 usb-storage 忽略该设备(打内核补丁),否则一切用户态操作都是徒劳。
❌ 错误 2:强行给旧内核打上游 rtl8xxxu 补丁
上游 Linux 6.8+ 已原生支持 RTL8192FU,我尝试把补丁应用到 4.19.190 内核上。
结果:补丁基于的代码结构差异巨大,大量 Hunk FAILED,源码树被弄乱,不得不重新解压。
教训:内核版本差距太大时,不要硬打补丁。要么升级内核,要么改走 DKMS 驱动路线。
❌ 错误 3:DKMS 编译时 ARCH 写错
龙芯的架构目录是 arch/loongarch,但 DKMS 默认可能用 loongarch64,导致 arch/loongarch64/Makefile 找不到。
教训:DKMS 构建时显式指定 --arch loongarch,或在 dkms.conf 的 MAKE 行加 ARCH=loongarch。
❌ 错误 4:只写 new_id 就以为驱动会绑定
new_id 只是告诉驱动“这个 ID 也归你管”,但如果设备已经枚举完成,驱动不会自动重新匹配已存在的接口。
必须 modprobe -r 再 modprobe,让 USB 核心重新扫描。
教训:动态添加 ID 后,务必重新加载驱动模块。
❌ 错误 5:换 USB 口后无法连接,以为是硬件问题
换到 Bus 002 的 2-1 口后,驱动不绑定。手动 bind 报“没有那个设备”。
实际是 udev 规则时序问题:modprobe 和 new_id 并行执行,设备还没就绪。
后来在 udev 规则里加入 sleep 和“卸载-重载”逻辑,问题解决。
教训:udev 规则里要串行执行,必要时加延迟。
❌ 错误 6:测速只有 200KB/s,误判为驱动问题
iw 显示信号 -65 dBm、协商速率 300 Mbps,链路正常。
换有线测速也只有 1-5 MB/s,最终发现是外网测速源太远 + 路由器穿墙 + 宽带本身慢。
用国内源或内网 iperf3 测速,结果完全正常。
教训:先排除网络环境,再怀疑驱动。
❌ 错误 7:以为编译内核几分钟就能搞定:
8GB 内存、4 核龙芯平台,完整编译一次内核约需 65 分钟。
务必用 screen 或 nohup 挂后台,避免终端断开导致编译中断。
二、抄作业步骤(详细正确流程)
📌 环境说明
系统:Loongnix 20.7(基于 Debian 10)
原内核:4.19.0-19-loongson-3
网卡:TP-Link TL-WN823N V2,USB ID 2357:0135,芯片 RTL8192FU
目标:编译带补丁的新内核 + DKMS 驱动,实现自动连接 Wi-Fi
步骤 1:确认设备状态
插入网卡,运行:
bash
lsusb | grep -E "0bda|2357"
dmesg | tail -30
若看到 0bda:a192 且 usb-storage ... device ignored 未出现,说明需要内核补丁。
步骤 2:编译带 US_FL_IGNORE_DEVICE 补丁的内核
2.1 获取内核源码
bash
sudo apt update
sudo apt install linux-source-4.19.0-19-loongson-3 # 若不存在则用 apt source
或启用 deb-src 后:
sudo sed -i 's/^#deb-src/deb-src/' /etc/apt/sources.list
sudo apt update
apt source linux
解压得到 linux-4.19.190.8.29 目录。
2.2 修改 unusual_devs.h
编辑 drivers/usb/storage/unusual_devs.h,在 USUAL_DEV 列表前添加:
c
/* TP-Link TL-WN823N V2 (RTL8192FU) */
UNUSUAL_DEV( 0x0bda, 0x1a2b, 0x0000, 0xffff,
"Realtek",
"DISK",
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_DEVICE ),
UNUSUAL_DEV( 0x0bda, 0xa192, 0x0000, 0xffff,
"Realtek",
"DISK",
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
US_FL_IGNORE_DEVICE ),
2.3 编译并安装新内核
bash
make olddefconfig
8GB 内存、4 核龙芯,编译约 65 分钟,建议用 screen 挂后台
make -j4 LOCALVERSION=-usbfix
sudo make modules_install LOCALVERSION=-usbfix
sudo make install LOCALVERSION=-usbfix
sudo dracut --force --kver 4.19.190-usbfix /boot/initrd.img-4.19.190-usbfix
sudo update-grub2
sudo reboot
重启时在 GRUB 选择 4.19.190-usbfix。进入后 uname -r 应显示新内核。
步骤 3:编译安装 DKMS 驱动 rtl8192fu
3.1 准备内核头文件
bash
cd ~/linux-4.19.190.8.29
make olddefconfig
make prepare
make scripts
sudo ln -sf ~/linux-4.19.190.8.29 /lib/modules/4.19.190-usbfix/build
3.2 获取驱动源码
bash
git clone https://gitee.com/BrightXu/rtl8192fu.git
cd rtl8192fu
3.3 添加设备 ID
编辑 os_dep/linux/usb_intf.c,在 #ifdef CONFIG_RTL8192F 段内添加:
c
{USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0135, 0xff, 0xff, 0xff), .driver_info = RTL8192F}, /* TP-Link TL-WN823N V2 */
3.4 安装 DKMS 驱动
bash
sudo dkms remove -m rtl8192fu -v v5.8.6.2_35538.20191028 --all
sudo dkms add -m rtl8192fu -v v5.8.6.2_35538.20191028
sudo dkms build -m rtl8192fu -v v5.8.6.2_35538.20191028 --arch loongarch
sudo dkms install -m rtl8192fu -v v5.8.6.2_35538.20191028 --arch loongarch
步骤 4:安装固件
bash
sudo mkdir -p /lib/firmware/rtlwifi
sudo wget -O /lib/firmware/rtlwifi/rtl8192fufw.bin \
https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/rtlwifi/rtl8192fufw.bin
步骤 5:配置 udev 自动切换与绑定
5.1 创建 usb_modeswitch 配置
bash
sudo tee /etc/usb_modeswitch.d/0bda:a192 > /dev/null <<'EOF'
RTL8192FU
TargetVendor=0x0bda
TargetProduct=0xf192
StandardEject=1
EOF
5.2 创建模式切换 udev 规则
bash
sudo tee /etc/udev/rules.d/40-usb_modeswitch.rules > /dev/null <<'EOF'
Realtek RTL8192FU Wi-Fi dongle
ATTR{idVendor}=="0bda", ATTR{idProduct}=="a192", RUN+="/usr/sbin/usb_modeswitch -v 0bda -p a192 -c /etc/usb_modeswitch.d/0bda:a192"
EOF
5.3 创建驱动绑定 udev 规则(关键)
bash
sudo tee /etc/udev/rules.d/99-rtl8192fu-bind.rules > /dev/null <<'EOF'
TP-Link TL-WN823N V2 (2357:0135) - bind to rtl8192fu driver
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="2357", ATTR{idProduct}=="0135", RUN+="/bin/sh -c 'sleep 2; modprobe 8192fu; echo 2357 0135 > /sys/bus/usb/drivers/rtl8192fu/new_id; sleep 1; modprobe -r 8192fu; modprobe 8192fu'"
EOF
5.4 开机自动加载驱动并屏蔽冲突驱动
bash
echo "8192fu" | sudo tee /etc/modules-load.d/8192fu.conf
echo "blacklist rtl8xxxu" | sudo tee /etc/modprobe.d/blacklist-rtl8xxxu.conf
5.5 重新加载 udev 规则
bash
sudo udevadm control --reload-rules
步骤 6:重启验证
bash
sudo reboot
重启后检查:
bash
uname -r # 应为 4.19.190-usbfix
lsmod | grep -E "8192fu|rtl8xxxu" # 只有 8192fu
ip link | grep wlx # 应出现 wlxf8c90324c9aa
nmcli device status # 应显示已连接
ping -c 4 www.baidu.com # 应通
若无线接口未自动出现,拔插一次网卡,等待 10 秒。
步骤 7:连接 Wi-Fi
bash
nmcli device wifi list
nmcli device wifi connect "你的SSID" password "你的密码"
三、测速与优化提醒
不要用国外测速源:speedtest.tele2.net 等在国内极慢,用阿里云、清华源或内网 iperf3。
信号强度:sudo iw dev wlxf8c90324c9aa link 查看 signal,-65 dBm 属正常,穿墙后速度下降是物理限制。
关闭电源管理:sudo iw dev wlxf8c90324c9aa set power_save off 可减少降速。
USB 口选择:优先用之前验证成功的 USB 2.0 口,若换口后不绑定,检查 udev 规则时序。
四、配置文件速查表
文件路径 作用
/etc/usb_modeswitch.d/0bda:a192 模式切换配置
/etc/udev/rules.d/40-usb_modeswitch.rules 自动触发模式切换
/etc/udev/rules.d/99-rtl8192fu-bind.rules 自动绑定驱动
/etc/modules-load.d/8192fu.conf 开机加载驱动
/etc/modprobe.d/blacklist-rtl8xxxu.conf 屏蔽内核自带驱动
/lib/firmware/rtlwifi/rtl8192fufw.bin 固件文件
结语
这次适配过程曲折,但最终成功。特别感谢 DeepSeek 在每一步的耐心引导——从内核补丁、DKMS 编译,到 udev 规则调试,几乎全程陪伴。
希望这篇记录能让后来者少走弯路。如果你也在龙芯平台上折腾无线网卡,欢迎参考并反馈。
其实这些控制台命令于我如天书,但我成功了!
祝折腾愉快!