FreeBSD Wifi on a BCM4328 Wireless Card
Overview
Notes about configuring a wifi wireless network on FreeBSD 12.1, using an old laptop with an unsupported wireless card. Lots of forums said that the card is not supported and that it could not be done. But I refused to believe it, and this is a testimony to the resilience of FreeBSD.
-
OS: FreeBSD 12.1-RELEASE-p10
Laptop: Dell Inspiron 1525 (circa 2007)
Memory: 4GB
Wireless Card: 802.11g Broadcom BCM4328 SIBA bus BCM4312 rev 15
The history: while running FreeBSD 12.1 everything worked on my old Dell Inspiron 1525 laptop, except my wifi network. Going through blogs I discovered that the wifi card is not supported by generic FreeBSD kernel, so it does not work by default; and requires special tweaking. There’s no official guide for this wireless card. Tried many different recommendations from forum postings. Below is what what worked for me. There may be better ways; but if so then please comment.
Query Hardware
While running the GENERIC kernel, investigate which hardware is detectable. Take note of all the device names.
# dmesg | more # pciconf -lv
My hardware is as follows:
CPU: Pentium Pentium Dual Core T3200 2.0GHz DVR+/-RW Vid: Intel Crestline GM965 Mem: Intel PM965/GM965/GL960 Aud: Sigmatel 9205 hdacc2 pcm1 STAC9228X Modem: hdaac0 Conexant HDA D330 MDC SD Card: Ricoh R5C832/22/42/92 HD Toshiba ada0 320g, 7200 RPM cyl 16383 hd 16 s/t 63 lba 625 sec 142448 CDROM: cd0 Removable SCSI device. Wifi: bwn0 Broadcom 802.11 BCM4328/4312 bhnd0 BCM4312 SIBA Bus gpio0 Broadcom Chip GPIO USB: Intel 82801H ICH8 USB-D 2.0 Ethernet: msck0 Marvell Yukon 88E8040 e1000phy0 Marvell E3016
Install Latest Ports
# portsnap fetch # portsnap extract
Compile Broadcom BCM Drivers
Install the latest port for the Ports Management:
# cd /usr/ports/ports-mgmt/pkg/ # make install clean
Install the latest port for the Broadcom BCM wifi drivers:
# cd /usr/ports/net/bwn-firmware-kmod/ # make install clean
Download Latest Source
# /usr/src # wget ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/12.1-RELEASE/src.txz # tar -xf src.txz -C /
Compile Kernel
Download source tree and compile a new kernel. Remove all the unnecessary drivers. My kernel went from 30MB to 19MB. A more lean compiled kernel reduces memory footprint, boots faster and overall performs better with less overhead.
Copy the kernel config, create a symblink, then edit:
# cd /usr/src/sys/`uname -m`/conf # mkdir /root/kernels # cp GENERIC /root/kernels/INSPIRON # ln -s /root/mykernels/INSPIRON # vi INSPIRON
Go through the settings, or download my kernel config file that I already made, which works:
# wget https://sotosystems.com/download/INSPIRON.xz # xz -dc INSPIRON.xz > /root/kernels/INSPIRON
Verify that the following entries are present in the kernel config file:
-
device bhnd
device bhndb
device bhndb_pci
device bcma
device siba
device gpio
device wlan
device wlan_amrr
device firmware
Begin the compilation. This took 20 minutes with an Intel i7, but with the Dell Inspiron 1525 it took 2 hours. The kernel should be reduced from 30MB to 19MB. I did notice performance improvements afterward:
# /usr/sbin/config INSPIRON # cd ../compile/INSPIRON # make cleandepend # make depend # make install
Wifi Configuration
For simplicity I am using wifi WEP authentication for now. Configure the following system settings (follow the logic):
# vi /boot/loader.conf siba_bwn_load="YES" if_bwn_load="YES" f_bwn_load="YES" bwn_v4_lp_ucode_load="YES" wlan_wep_load="YES" wlan_ccmp_load="YES" wlan_tkip_load="YES" legal.intel_bwn.license_ack=1
# vi /etc/rc.conf create_args_wlan0="country US regdomain FCC" wlans_bwn0="wlan0"
Create the encrypted WEP key encryption. Add it to your wpa file below:
# wpa_passphrase myssid mypassword network={ ssid="myssid" psk=14829a0059f1025b2f4c6c911320fa9fasdkfeysdkfd1acde4b2026be4d2a7ca4 }
# vi /etc/wpa_supplicant.conf ctrl_interface=/var/run/wpa_supplicant eapol_version=2 ap_scan=1 fast_reauth=1 network={ ssid="myssid" key_mgmt=NONE wep_key1=MYPASSWORD wep_tx_keyidx=1 psk=14829a0059f1025b2f4c6c911320fa9fasdkfeysdkfd1acde4b2026be4d2a7ca4 }
Wifi Script
Running the wifi settings from rc.conf does not work. The only way I was able to make it work was via a script. Every time you want to use use wifi simply run the following script as root. It disables all interfaces, then enables wifi, then restarts networking processes.
# vi /root/wifi_enable.sh #!//bin/sh ifconfig msk0 destroy ifconfig wlan0 destroy sleep 1 ifconfig wlan0 create wlandev bwn0 ifconfig wlan0 inet 192.168.1.201 netmask 255.255.255.0 authmode open ssid myssid wepmode on weptxkey 1 wepkey 1:0xAAAAAAAAAA mode 11g route add default 192.168.1.1 sleep 1 service sshd restart service ntpd restart
Diagnostic Commands
Some diagnostic commands to try:
# bsdconfig wireless # ifconfig wlan0 list scan # sysctl net.wlan.devices
Performance
Broadcom Wifi drivers do not work well with FreeBSD, and I also heard similar comments about Broadcom wifi with Linux. Apparently this model was designed for Windows XP. This wifi not so great on FreeBSD 12.1. It is slow some times and seems very unstable. Sometimes I can connect via SSH and run commands, and other times it gets stuck and I have to retry again; like there is a memory cache problem. But for the sake of learning it is cool to be able to make it run and boast about it when nobody else can.
Update
Install the i386 or x86 32 bit distros. They run much better. Do not install the 64bit AMD64 or x86_64 versions. Although they both install on this machine, the 64 bit versions don’t run well. Debian 9 i386 (32bit) is the best distro that I’ve been able to make run the best on this laptop. Install the firmware:
# cat /etc/debian_version 9.13 # uname -m i686 # vi /etc/apt/sources.list deb http://deb.debian.org/debian/ stretch main contrib non-free # apt-get update # apt-get install firmware-b43-installer b43-fwcutter firmware-misc-nonfree firmware-brcm80211 # reboot
Afterward the b43 firmware errors go away and the wlan0 interface appears connected via DHCP. Configure via gnome-control-center network.
After successfully configuring wlan0, running with a discoverable IP address, run:
# update-grub2 # reboot
Conclusion: Even in Linux this old Broadcom wifi card runs crappy. Lots of errors and slow downs occur. DHCP does not work well or at all. Disabling the wifi works. As an alternative used an external antenna wifi USB dongle stick: Eastech Ralink RT5370.
The End.