修复WIFI驱动

最近我阴差阳错升级了Ubuntu14.04 Linux内核到4.4.0,升级后发现Broadcom的私有WIFI驱动 wl挂掉了。切换到开源驱动信号又不是很好,万般无奈只能调试找原因了。

dmesg下发现了原因,原来是内核更新后dkms阶段重新编译bcmwl驱动失败了,找不到rdtscl,估计API改了-_-!!!。

Using CFG80211 API
  CC [M]  /var/lib/dkms/bcmwl/6.30.223.248+bdcom/build/src/shared/linux_osl.o
/var/lib/dkms/bcmwl/6.30.223.248+bdcom/build/src/shared/linux_osl.c: In function ‘osl_getcycles’:
/var/lib/dkms/bcmwl/6.30.223.248+bdcom/build/src/shared/linux_osl.c:938:5: error: implicit declaration of function ‘rdtscl’ [-Werror=implicit-function-declaration]
     rdtscl(cycles);
     ^

电脑上安装的Broadcom的私有驱动是bcmwl, 版本是6.30.223.248。马上上网搜索bcmwl, 找到了Ubuntu的代码仓库。挨个找BUG修复记录,在这里找到了一点端倪

+diff --git a/src/shared/linux_osl.c b/src/shared/linux_osl.c
+index d540636..e622c5c 100644
+--- a/src/shared/linux_osl.c
++++ b/src/shared/linux_osl.c
+@@ -932,6 +932,10 @@ osl_getcycles(void)
+   uint cycles;
+ 
+ #if defined(__i386__)
++#ifndef rdtscl
++#define rdtscl(low) \
++ ((low) = (u32)rdtsc())
++#endif
+   rdtscl(cycles);
+ #else
+   cycles = 0;
+-- 
+1.9.1
+

OK,马上修改,安装bcmwl的代码在/var/lib/dkms/bcmwl/6.30.223.248+bdcom/build下,sudo make , sudo make install后,depmod一下就满血复活。

但这有个缺点,默认仓库里的bcmwl代码还是没改过来,下次升级内核,dkms机制下编译的还是有BUG的代码,每次升级都要编译一下WIFI驱动,有点麻烦,下次再找方法吧。