zoukankan      html  css  js  c++  java
  • CentOS6.5 x86_64 配置Broadcom 43XX系列 无线网卡驱动

    from: http://wiki.centos.org/HowTos/Laptops/Wireless/Broadcom?action=show

    In order to install Broadcom BCM4311, BCM4312, BCM4313, BCM4321 or BCM4322, BCM43224, BCM43225, BCM43227, or BCM43228 based wireless network cards, the next steps should be followed:

     

    Step 1: Determining WLAN chip and installing dependencies

    First of all, make sure you are the "proud owner of Broadcom BCM43xx wireless card":

     

    [user@host ~]$ /sbin/lspci | grep Broadcom
    0b:00.0 Network controller: Broadcom Corporation BCM4312 802.11a/b/g (rev 01)
    

    After the WLAN chip model was determined, make sure you have no missing packages needed at compile-time and install them if you do:

     

    [root@host ~]# yum install kernel-headers kernel-devel gcc
    

    Of course, if you're compiling the driver for Xen kernel (i.e. kernel-xen), you should install kernel-xen-devel instead of kernel-devel.

     

    Step 2: Downloading and extracting Broadcom driver archive

    Download the Broadcom BCM43xx linux driver archive from Broadcom Official website to your machine and extract it to /usr/local/src/hybrid-wl and feel free to change the ownership of the directory and it's contents to some unprivileged user

     

    [root@host ~]# mkdir -p /usr/local/src/hybrid-wl
    [root@host hybrid-wl]# cd /usr/local/src/hybrid-wl
    [root@host hybrid-wl]# tar xvfz /path/to/the/tarball/hybrid-v35_64-nodebug-pcoem-6_30_223_248.tar.gz
    [root@host hybrid-wl]# chown -R someuser.somegroup /usr/local/src/hybrid-wl
    

    NOTE: Why not extract it to arbitrary location and leave the ownership it is?
    Well, this way the driver module sources remain on the system - where you left them - so you can build the driver module whenever you want (e.g. in case you upgrade the kernel - since driver modules are always compiled for a particular kernel), plus, you can do this as an unprivileged user!

     

    Step 3: Compiling the Broadcom driver module

    Driver module can be compiled as follows:

     

    [user@host hybrid-wl]$ make -C /lib/modules/`uname -r`/build/ M=`pwd`
    

    Mind the quotes (i.e. back quotes).

    Now, with the current driver (version 6.30.223.248) it's almost certain you'll get an error message instead of compiled driver module (in fact, different scenario other that this error message is unknown to the author). The message should look something like this:

     

    make: Entering directory `/usr/src/kernels/2.6.32-504.1.3.el6.x86_64'
    CFG80211 API is prefered for this kernel version
    Using CFG80211 API
      LD      /usr/local/src/hybrid-wl/built-in.o
      CC [M]  /usr/local/src/hybrid-wl/src/shared/linux_osl.o
      CC [M]  /usr/local/src/hybrid-wl/src/wl/sys/wl_linux.o
      CC [M]  /usr/local/src/hybrid-wl/src/wl/sys/wl_iw.o
      CC [M]  /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.o
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:83: warning: ‘enum tx_power_setting’ declared inside parameter list
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:83: warning: its scope is only this definition or declaration, <snip>
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_cfg80211_join_ibss’:
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:730: error: ‘struct cfg80211_ibss_params’ has no member named ‘channel’
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: At top level:
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1096: warning: ‘enum tx_power_setting’ declared inside parameter list
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1096: error: parameter 2 (‘type’) has incomplete type
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_cfg80211_set_tx_power’:
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1107: error: ‘TX_POWER_AUTOMATIC’ undeclared (first use in this <snip>
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1107: error: (Each undeclared identifier is reported only once
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1107: error: for each function it appears in.)
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1109: error: ‘TX_POWER_LIMITED’ undeclared (first use in this function)
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1115: error: ‘TX_POWER_FIXED’ undeclared (first use in this function)
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: At top level:
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1774: warning: initialization from incompatible pointer type
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1779: warning: initialization from incompatible pointer type
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1780: warning: initialization from incompatible pointer type
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1781: warning: initialization from incompatible pointer type
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1782: warning: initialization from incompatible pointer type
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1783: warning: initialization from incompatible pointer type
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1784: warning: initialization from incompatible pointer type
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1789: warning: initialization from incompatible pointer type
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_inform_single_bss’:
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:1984: error: too few arguments to function <snip>
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2023: warning: passing argument 1 of ‘cfg80211_put_bss’ from <snip> 
    include/net/cfg80211.h:3380: note: expected ‘struct wiphy *’ but argument is of type ‘struct cfg80211_bss *’
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2023: error: too few arguments to function ‘cfg80211_put_bss’
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_update_bss_info’:
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2276: error: ‘struct cfg80211_bss’ has no member named <snip>
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2277: error: ‘struct cfg80211_bss’ has no member named <snip>
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2283: warning: passing argument 1 of ‘cfg80211_put_bss’ from <snip>
    include/net/cfg80211.h:3380: note: expected ‘struct wiphy *’ but argument is of type ‘struct cfg80211_bss *’
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2283: error: too few arguments to function ‘cfg80211_put_bss’
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_bss_roaming_done’:
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: warning: passing argument 2 of ‘cfg80211_roamed’ from <snip>
    include/net/cfg80211.h:3726: note: expected ‘struct ieee80211_channel *’ but argument is of type ‘u8 *’
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: warning: passing argument 4 of ‘cfg80211_roamed’ makes <snip>
    include/net/cfg80211.h:3726: note: expected ‘const u8 *’ but argument is of type ‘s32’
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: warning: passing argument 5 of ‘cfg80211_roamed’ makes <snip>
    include/net/cfg80211.h:3726: note: expected ‘size_t’ but argument is of type ‘u8 *’
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: warning: passing argument 6 of ‘cfg80211_roamed’ makes <snip>
    include/net/cfg80211.h:3726: note: expected ‘const u8 *’ but argument is of type ‘s32’
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2322: error: too few arguments to function ‘cfg80211_roamed’
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c: In function ‘wl_update_wowl’:
    /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.c:2791: warning: unused variable ‘wdev’
    make[1]: *** [/usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.o] Error 1
    make: *** [_module_/usr/local/src/hybrid-wl] Error 2
    make: Leaving directory `/usr/src/kernels/2.6.32-504.1.3.el6.x86_64'
    

    Now, the driver won't compile because of the if-then-else clause for kernel version checking in file wl_cfg80211_hybrid.c. To remedy this, we'll run the following two commands:

     

    [user@host hybrid-wl]$ sed -i 's/.. KERNEL_VERSION(3, ., .)/>= KERNEL_VERSION(2, 6, 32)/' src/wl/sys/wl_cfg80211_hybrid.c
    [user@host hybrid-wl]$ sed -i 's/.. KERNEL_VERSION(2, 6, 3.)/>= KERNEL_VERSION(2, 6, 32)/' src/wl/sys/wl_cfg80211_hybrid.c
    

    But wait, just this is not enough by itself to ensure proper driver operation. So, we also need to apply the following patch wl-kmod-fix-ioctl-handling.patch prior to actually compiling the driver. Download it to /usr/local/src and run the following command to patch the driver source code:

     

    [user@host hybrid-wl]$ patch -p1 < ../wl-kmod-fix-ioctl-handling.patch 
    patching file src/wl/sys/wl_cfg80211_hybrid.c
    patching file src/wl/sys/wl_linux.c
    

    Now, try compiling the driver module again:

     

    [user@host hybrid-wl]$ make -C /lib/modules/`uname -r`/build/ M=`pwd`
    

    and the compile output should look something like this:

     

    make: Entering directory `/usr/src/kernels/2.6.32-504.1.3.el6.x86_64'
    CFG80211 API is prefered for this kernel version
    Using CFG80211 API
      LD      /usr/local/src/hybrid-wl/built-in.o
      CC [M]  /usr/local/src/hybrid-wl/src/shared/linux_osl.o
      CC [M]  /usr/local/src/hybrid-wl/src/wl/sys/wl_linux.o
      CC [M]  /usr/local/src/hybrid-wl/src/wl/sys/wl_iw.o
      CC [M]  /usr/local/src/hybrid-wl/src/wl/sys/wl_cfg80211_hybrid.o
      LD [M]  /usr/local/src/hybrid-wl/wl.o
    WARNING: modpost: missing MODULE_LICENSE() in /usr/local/src/hybrid-wl/wl.o
    see include/linux/module.h for more information
      Building modules, stage 2.
    CFG80211 API is prefered for this kernel version
    Using CFG80211 API
      MODPOST 1 modules
    WARNING: modpost: missing MODULE_LICENSE() in /usr/local/src/hybrid-wl/wl.o
    see include/linux/module.h for more information
      CC      /usr/local/src/hybrid-wl/wl.mod.o
      LD [M]  /usr/local/src/hybrid-wl/wl.ko.unsigned
      NO SIGN [M] /usr/local/src/hybrid-wl/wl.ko
    make: Leaving directory `/usr/src/kernels/2.6.32-504.1.3.el6.x86_64'
    

    The module, once built, can be stripped of unnecessary symbols:

     

    [user@host hybrid-wl]$ strip --strip-debug wl.ko
    

    What you will notice, is that driver module file size reduces (from 8.2MB to 7.2MB). And yes, your driver module works ;-)

     

    Step 4a: Loading the driver module into kernel

    Having successfully compiled the driver module, you can now load it into kernel, and eventually set up automatic driver load on system boot (to do all this, you'll have to assume root privileges). Of course, driver module loading can be done only after you remove the existing/conflicting wireless driver modules from kernel (in case these are loaded):

     

    [root@host ~]# modprobe -r bcm43xx
    [root@host ~]# modprobe -r b43
    [root@host ~]# modprobe -r b43legacy
    [root@host ~]# modprobe -r ssb
    [root@host ~]# modprobe -r bcma
    [root@host ~]# modprobe -r brcmsmac
    [root@host ~]# modprobe -r ndiswrapper
    

    copy the driver module file to a location where kernel can find it:

     

    [root@host hybrid-wl]# cp -vi /usr/local/src/hybrid-wl/wl.ko /lib/modules/`uname -r`/extra/
    

    to be consistent with all other external modules that have been / may be installed from a kmod packages (e.g. fuse, ntfs-3g, etc.)

    Next, run:

     

    [root@host ~]# depmod $(uname -r)
    

    in order to create a list of module dependencies, and now load the driver module:

     

    [root@host hybrid-wl]# modprobe wl
    

    If no error was reported, the driver module is now successfully loaded and ready to use. The 'ndiswrapper' kernel module can be removed, provided you don't use it for anything else but wireless driver - but this is not necessary.

     

    Step 4b: Loading the driver module into kernel on boot time

    Couple of more steps are needed to get your module load every time the system boots. First, edit the /etc/modprobe.d/blacklist.conf file adding the lines:

     

    blacklist bcm43xx
    blacklist b43
    blacklist b43legacy
    blacklist bcma
    blacklist brcmsmac
    blacklist ssb
    blacklist ndiswrapper
    

    By doing so, you're preventing these modules from being loaded into kernel at boot time and conflicting with the wl module. Second, in order to load the wl module into the kernel on boot time, create/edit the file /etc/sysconfig/modules/kmod-wl.modules and copy-paste the following contents into it:

     

    #!/bin/bash
    
    for M in lib80211 cfg80211 wl; do
        modprobe $M &>/dev/null
    done
    

    Your driver should now load every time you reboot (except of course, when you install the new kernel, in which case the driver has to be re-compiled for it following these same steps).

  • 相关阅读:
    如何用CSS实现中间自适应,两边定宽三栏布局
    [转]通过Spring Boot三分钟创建Spring Web项目
    [转]Java Web笔记:搭建环境和项目配置(MyEclipse 2014 + Maven + Tomcat)
    [转]单元测试、集成测试、确认测试、系统测试、验收测试
    [转]maven全局配置文件settings.xml详解
    [转]解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable and mvn script match.
    [转]PO BO VO DTO POJO DAO概念及其作用(附转换图)
    [转]如何提升你的能力?给年轻程序员的几条建议
    从oracle导出数据成csv,将csv导入mongodb问题
    Windows下Mongodb启动问题
  • 原文地址:https://www.cnblogs.com/timssd/p/4368044.html
Copyright © 2011-2022 走看看