在 Linux 内核 4.9.0 中引入的一个小问题导致部分 rtl8188/8192ce 网卡工作不正常。有时候无法连接无线网络,提示「IP configuration is unavailable」;有时候虽然可以连接,但是网络极差,表现为在 ping 路由器的时候延迟非常大,并可能伴随较高的丢包率。
问题状态¶
这个问题是因为驱动中的一个小错误导致这两种类型的网卡可能会在启动时加载错误的固件(firmware)。目前该问题已经修复,但是可能要到 Linux kernel 4.10 中才会整合此补丁。通过 GitHub 上的该部分网卡驱动的源程序可以自己编译安装,打上补丁后无线网络问题就能解决了。
如果不想打补丁,也可以通过修改该网卡的参数来暂时缓解该问题。
详细内容可以参考下面的链接:
- https://github.com/lwfinger/rtlwifi_new/issues/203
- https://forums.opensuse.org/showthread.php/521989-Wireless-cannot-connect-after-dup-to-kernel-4-9-0-1-2-yesterday
- https://bugzilla.opensuse.org/show_bug.cgi?id=1017471
- https://bugzilla.redhat.com/show_bug.cgi?format=multiple&id=1415339
修改参数¶
禁用该网卡的省电模式可能能够解决问题。下面就修改参数禁用该网卡的所有省电方式(全局 ips、硬件 fwlps、软件 swlps)。
- 检查 rtl8192ce 驱动是否加载,
$ lsmod | grep rtl81 rtl8192ce 73728 0 rtl_pci 36864 1 rtl8192ce rtl8192c_common 69632 1 rtl8192ce rtlwifi 98304 3 rtl_pci,rtl8192ce,rtl8192c_common mac80211 835584 3 rtl_pci,rtl8192ce,rtlwifi
- 查看 rtl8192ce 模块信息,
$ sudo modinfo rtl8192ce
在结尾处有该模块的参数信息。
- 查看 rtl8192ce 模块的默认参数
$ systool -v -m rtl8192ce
在 「Parameters:」 下面应该有,
debug = "0" fwlps = "Y" ips = "Y" swnc = "N" swlps = "N"
- 创建一个新的文件
/etc/modprobe.d/rtl8192ce.conf
(需要管理员权限),在其中添加下面的内容(禁用那些默认启用的参数),options rtl8192ce ips=0 fwlps=0
记得保存。
- 重新加载该模块,
$ sudo modprobe -r rtl8192ce && sudo modprobe rtl8192ce
如果不行就重启系统。
- 可以按照 3. 的方法检查现用的参数。
打补丁¶
下面是自己打驱动补丁的方法。
该方法参考 https://bugzilla.redhat.com/show_bug.cgi?format=multiple&id=1415339 上提供的方案修改而来。因为 openSUSE Tumbleweed 中 rtl8192ce 网卡驱动的位置和文件类型稍稍有些不同于该帖子中的描述。
- 下载、解压和编译该驱动,
$ cd ~ $ curl https://codeload.github.com/lwfinger/rtlwifi_new/tar.gz/master -o rtlwifi_new.tar.gz $ cd rtlwifi_new-master $ make
- 备份当前驱动(备份的文件夹不能删除!因为还要用),
$ cd /lib/modules/$(uname -r)/kernel/drivers/net/wireless/ $ sudo mv realtek _realtek_
- 创建新的驱动文件夹,并将编译的文件复制进去,
$ sudo mkdir -p realtek/rtlwifi/rtl8192c $ sudo mkdir -p realtek/rtlwifi/rtl8192ce $ sudo cp ~/rtlwifi_new-master/*.ko ./realtek/rtlwifi $ sudo cp ~/rtlwifi_new-master/rtl8192c/rtl8192c-common.ko ./realtek/rtlwifi/rtl8192c/ $ sudo cp ~/rtlwifi_new-master/rtl8192ce/rtl8192ce.ko ./realtek/rtlwifi/rtl8192ce/
- 重新加载 rtl8192ce 驱动模块,
$ sudo modprobe -r $(lsmod | grep ^rtl | awk '{print $1}' | xargs) $ sudo modprobe rtl8192ce
此时无线网络应该能够自动连接并正常工作了。
- 检查一下看看,
$ lsmod | grep ^rtl
其实 Linux kernel 4.10 都到 RC5 了,应该很快就会正式发布了。©
本文发表于水景一页。永久链接:<https://cnzhx.net/blog/ostw-kernel-4-9-rtl8192ce-driver-bug-fix/>。转载请保留此信息及相应链接。
引用通告: 在 openSUSE 上使用 create_ap 创建虚拟 WiFi 热点来方便使用 KDE Connect 连接手机 | 水景一页