经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Linux/Shell » 查看文章
联想ideapad-330C 在Ubuntu18.04 上安装Realtek 8821CE无线网卡驱动
来源:cnblogs  作者:GregTse  时间:2019/10/30 9:09:09  对本文有异议

在新买的联想ideapad-330C笔记本上,安装Ubuntu 18.04后,悲催的发现,没有无线网络,幸好有线还能用,然后网上搜一波,发现不少人遇到这种问题,也有人给出解决方案

参考的链接: Thinkpad E470C(集成网卡rlt8111/8618/8411系列) 无线网卡rtl8821CE系列 安装ubuntu 和win10双系统没有无线网问题 (侵删)

在以上链接中给出了解决方案及无线网卡rtl8821ce源码压缩包的下载地址,有需要的自行去下载

 

系统:Ubuntu 18.04.2  

内核: linux4.18

网卡:Realtek 8821CE Wireless LAN 802.11ac PCI-E NIC

按照参考链接的方法,成功安装网卡驱动,在此电脑中也不用重启就能连接wifi,但后来系统更新……到Ubuntu18.04.3,内核更新到linux5.0.0.31时,重启后发现又没有无线网卡的驱动

此时系统:Ubuntu 18.04.3

内核: linux5.0.0.31

只好按照原来的方法重新做一次,发现编译就出错了,配置没有更改,make出现以下错误

  1. rtl8821ce/os_dep/linux/os_intfs.c:1325:22: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
  2. .ndo_select_queue = rtw_select_queue,

看这错误,也不知道发生什么事啊,只好网上在找一下,找到了有人说是类型不匹配,然后在内核源码中查找ndo_select_queue的声明,找到了是这样的

  1. u16 (*ndo_select_queue)(struct net_device *dev,
  2. struct sk_buff *skb,
  3. struct net_device *sb_dev,
  4. select_queue_fallback_t fallback);

而网卡里的代码 rtl8821ce/os_dep/linux/os_intfs.c:1192 是这样的

  1. static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb
  2. #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
  3. , void *accel_priv
  4. #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
  5. , select_queue_fallback_t fallback
  6. #endif
  7. #endif

 

这样只能修改网卡驱动的源码了,改成适配linux5.0以上内核的,改为后代码如下,添加了对内核linux5.0.0以上的判断

  1. static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb
  2. #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
  3. , struct net_device *sb_dev
  4. , select_queue_fallback_t fallback
  5. #elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
  6. , void *accel_priv
  7. #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
  8. , select_queue_fallback_t fallback
  9. #endif
  10. #endif

改为保存,继续make,又报错

  1. rtl8821ce/os_dep/linux/rtw_android.c:629:62: error: macro "access_ok" passed 3 arguments, but takes just 2
  2. if (!access_ok(VERIFY_READ, priv_cmd.buf, priv_cmd.total_len)) {
  3. ^
  4. rtl8821ce/os_dep/linux/rtw_android.c:629:7: error: access_ok undeclared (first use in this function)
  5. if (!access_ok(VERIFY_READ, priv_cmd.buf, priv_cmd.total_len)) {

方法同上,继续找access_ok在内核头文件的声明发现在linux5.0以上的 access_ok的参数只有2个,而网卡驱动上使用时有3个参数

手动修改网卡驱动源码,文件: rtl8821ce/os_dep/linux/rtw_android.c :629,修改后如下:(删除原来  if (!access_ok(VERIFY_READ, priv_cmd.buf, priv_cmd.total_len)) {  这行代码,添加以下代码)

  1. #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
  2. if (!access_ok(priv_cmd.buf, priv_cmd.total_len)) {
  3. #else
  4. if (!access_ok(VERIFY_READ, priv_cmd.buf, priv_cmd.total_len)) {
  5. #endif

保存,继续make,又报错,如下:

  1. rtl8821ce/os_dep/linux/ioctl_cfg80211.c: In function rtw_get_systime_us’:
  2. rtl8821ce/os_dep/linux/ioctl_cfg80211.c:339:2: error: implicit declaration of function get_monotonic_boottime’; did you mean getboottime’? [-Werror=implicit-function-declaration]
  3. get_monotonic_boottime(&ts);
  4. ^~~~~~~~~~~~~~~~~~~~~~
  5. getboottime

这里已经给了修改的提示了,不过同样方法发现找不到 get_monotonic_boottime 这个函数,不过能找到提示的 getboottime函数,那就替换以下了,不过考虑到内核低于5.0的版本,那就加一个判断了

同上删除 rtl8821ce/os_dep/linux/ioctl_cfg80211.c:339 这行代码,添加以下代码

  1. #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
  2. getboottime(&ts);
  3. #else
  4. get_monotonic_boottime(&ts);
  5. #endif

这次make终于成功了!

  1. make
  2. sudo make install
  3. sudo modprobe -a 8821ce

这台电脑不用重启就直接连上原来的wifi了

没几天,电脑又更新了,重启后发现又没有了无线网卡驱动,看了一下,原来内核又升级了,这次是:

系统:Ubuntu 18.04.3

内核:Linux 5.0.0.32

内核一个小小改动,都让原来的网卡驱动没了,幸好上次的网卡驱动源码的改动还在,重复以下操作

  1. make
  2. sudo make install
  3. sudo modprobe -a 8821ce

哈哈,又可以了

 

原文链接:http://www.cnblogs.com/GregTse/p/11761233.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号