A simpletons guide to the BCM43XX drivers in FC5/FC6. 07.08.06(rev1.1) Maintained by Tom Sandquist tom@420bakers.net #################### FC5 introduced new support for devices utilizing the Broadcom 43xx chipset. At current these drivers are very primative and are limited in how they perform. I have spent hours and hours messing with these drivers with only mild success. In an attempt to help others avoid some of the pain I experienced in my quest I have put this How To together explaining how to use the new bcm43xx kernel drivers with your Linksys WMP54G v2 card (other bcm43xx based wireless cards should work too) as well as how to use ndiswrapper with your wireless card. #################### This guide is a collaboration of information I found online. Other resources you may find helpful (as I did) are below: Fedora Mobile Project: http://fedoramobile.org/fc-wireless/bcm43xx-yum-livna Ndiswrapper In Fedora Core 5 HowTo: http://www.linuxquestions.org/linux/answers/Networking/Ndiswrapper_in_Fedora_Core_5 #################### Below are two different processes for making the Linksys WMP54G PCI Wireless Card work under Fedora Core 5/6. Please note this process normally works for any bcm43xx based wireless device. One method uses the new bcm43xx driver built in to the linux kernel, the other method uses the ndiswrapper package to load driver support for the card. Both of these methods utilize the new Network Manager service to manage your network and wireless settings. #################### Steps to make the Linksys Wireless G PCI Card (WMP54G) function in FC5 with the new BCM43xx kernel drivers and Network Manager. 1) First things first, update your OS! I would suggest the newest Kernel possible to make sure you have the newest Broadcom driver code possible. To be safe and make sure everything is updated run: yum -y update 2) Next you want to install the bcm43xx-fwcutter tool. This tool is needed to extract the firmware from your existing drivers (Windows, MacOS, etc). To do this type: yum -y install bcm43xx-fwcutter Make sure you are root or using sudo when running the above command. 3) Now you need to download a driver to strip the firmware from. The file /usr/share/doc/bcm43xx-fwcutter-004/README (/usr/share/doc/bcm43xx-fwcutter-005/README for FC6) contains a list of drivers and the URLs to download them from. Download the appropriate driver for your card and architecture (32/64bit). 4) Change in to the directory you downloaded the driver to and unzip it if necessary. The file you are looking for is bcmwl5.sys. Once you have found this file run the following command: bcm43xx-fwcutter -w /lib/firmware bcmwl5.sys You should see output similar to the following: bcm43xx-fwcutter can cut the firmware out of bcmwl5.sys filename : bcmwl5.sys version : 3.40.25.3 MD5 : 5e58a3148b98c9f356cde6049435cb21 extracting bcm43xx_microcode2.fw ... extracting bcm43xx_microcode4.fw ... extracting bcm43xx_microcode5.fw ... *****: Sorry, it's not posible to extract "bcm43xx_microcode11.fw". *****: Extracting firmware from an old driver is bad. Choose a more recent one. *****: Luckily bcm43xx driver doesn't include microcode11 uploads at the moment. *****: But this can be added in the future... extracting bcm43xx_pcm4.fw ... extracting bcm43xx_pcm5.fw ... extracting bcm43xx_initval01.fw ... extracting bcm43xx_initval02.fw ... extracting bcm43xx_initval03.fw ... extracting bcm43xx_initval04.fw ... extracting bcm43xx_initval05.fw ... extracting bcm43xx_initval06.fw ... extracting bcm43xx_initval07.fw ... extracting bcm43xx_initval08.fw ... extracting bcm43xx_initval09.fw ... extracting bcm43xx_initval10.fw ... 5) Now we need to load the kernel module. To do so run: modprobe bcm43xx This will load the necessary kernel modules. 6) On my system (kernel-2.6.17-1.2145_FC5 x86_64) the bcm43xx module began loading by default at boot (I believe this behavior started in kernel revision 2139, but don't quote me on that). If yours does not you will want to do the following: Using your favorite editor (gedit, vi, ect...) open the file /etc/rc.d/rc.local and add the following to the end: /sbin/modprobe bcm43xx 7) You will now want to start the Network Manager services to control your wireless NIC. /sbin/chkconfig NetworkManager on /sbin/chkconfig NetworkManagerDispatcher on /sbin/service NetworkManager start /sbin/service NetworkManagerDispatcher start You should now see the Network Manager applet appear in the system tray in Gnome. You should now be able to browse and select wireless networks from the applet as well as activate you wire-based NIC. #################### Known Issues with the bcm43xx module. The driver by default wants to connect at 11Mb/sec. I have seen some posts on RedHat's bugzilla site where some users have been able to manually increase the the connection rate. Officially this will be "normal behavior" from the driver until better code is produced to properly manage the data rates. The driver is still very primative and doesn't like a lot of special options programmed in to the wireless Access Point/Router. Make sure your AP/Router is set to Mixed (b/g) mode! On my system (kernel-2.6.17-1.2145_FC5 x86_64) I noticed an average throughput of 411KB when moving a 200MB file between computers. Using iwconfig to adjust the wireless interface data rate to 54MB from 11MB resulted in an increase of the average throughput to 706KB. In comparison the same download using ndiswrapper resulted in an average throughput of 2730KB. #################### Steps to make the Linksys Wireless G PCI Card (WMP54G) function in FC5 using the ndiswrapper package and Network Manager. Before you begin make sure you have blacklisted the bcm43xx module. To do so open the file /etc/modprobe.d/blacklist and add the following line to the bottom of the file: #Broadcom BCM43xx drivers blacklist bcm43xx You also need to make sure the bcm43xx module isn't currently loaded. To do so run: /sbin/lsmod If you see bcm43xx loaded anywhere in that list run: /sbin/rmmod bcm43xx This should make sure that the kernel Broadcom drivers do not interfere with ndiswrapper. 1) It's always a good idea to make sure your distribution is up to date. To do this run: yum -y update 2) You will need the ndiswrapper package in order for the driver to work. Livna has a pre-packaged version you can use. Run the following: yum -y install ndiswrapper 3) You now need to download the normal 32-bit version of your network card driver or, if your using a 64-bit OS, the 64-bit Broadcom Windows drivers (should work for most bcm43xx chipsets). You can get them at 'http://ubuntuforums.org/attachment.php?attachmentid=186', you will need to register with the site to actually download the file. Unzip the 32 bit driver file (or the 64-bit_Broadcom_54g_Drivers.zip file). 4) Now we need to tell ndiswrapper to install the driver for us. To do this do the following: (32-bit Linksys WMP54G Driver) - ndiswrapper -i bcmwl5.inf (64-bit Broadcom Driver) - ndiswrapper -i netbc564.inf (Other) ndiswrapper -i To confirm that the driver has installed correctly run: ndiswrapper -l You should see something along the lines of: [user@clawhammer ~]# ndiswrapper -l Installed drivers: netbc564 driver installed, hardware present Note that this command must return a status of 'driver installed, hardware present'. If both are not present you either don't have the hardware installed properly or the driver is incorrect. 5) Now we must load the ndiswrapper kernel module. To do so type: /sbin/depmod -a /sbin/modprobe ndiswrapper After running these commands type 'dmesg' and check the output for lines similar to this: (Note: Your interface may be called eth1 at this point instead of wlan0.) ndiswrapper version 1.18 loaded (preempt=no,smp=yes) ndiswrapper (load_pe_images:573): fixing KI_USER_SHARED_DATA address in the driver ndiswrapper: driver netbc564 (,10/01/2002,3.70.17.5) loaded ACPI: PCI Interrupt 0000:00:0d.0[A] -> GSI 18 (level, low) -> IRQ 177 ndiswrapper: using irq 177 wlan0: vendor: '' wlan0: ndiswrapper ethernet device 00:0c:41:13:43:0d using driver netbc564, 14E4:4320.5.conf wlan0: encryption modes supported: WEP; TKIP with WPA; AES/CCMP with WPA wlan0: no IPv6 routers present 6) To make sure that the driver is available after boot up we need to make sure the ndiswrapper kernel module gets loaded at boot. To do this do the following: FC5: Type: ndiswrapper -m Add the line: alias wlan0 ndiswrapper to the top of the file /etc/modprobe.conf. You should also add the following line to /etc/rc.d/rc.local: modprobe ndiswrapper In some instances I have seen Network Manager not detect ndiswrapper after boot (NetworkManager loads before your ndiswrapper driver does). It may be necessary to add the following two lines to /etc/rc.d/rc.local: (Make Sure to add them below the modprobe line you just added!) /sbin/service NetworkManager start /sbin/service NetworkManagerDispatcher start FC6: Run the following commands to get ndiswrapper configured to start at bootup. ndiswrapper -m Then modify this line in your /etc/modprobe.conf: vi /etc/modprobe.conf Change: alias eth1 bcm43xx to: alias eth1 ndiswrapper 7) You will now want to start the Network Manager services to control your wireless NIC. /sbin/chkconfig NetworkManager on /sbin/chkconfig NetworkManagerDispatcher on /sbin/service NetworkManager start /sbin/service NetworkManagerDispatcher start You should now see the Network Manager applet appear in the system tray in Gnome. You should now be able to browse and select wireless networks from the applet as well as activate you wire-based NIC. #################### Resources: 64-bit Broadcom Drivers http://www.linuxant.com/driverloader/drivers.php