Valid HTML 4.0!

Page last modified on: December 31, 2003 04:06 PM

Craig's HowTo for Revision 2: the Belkin F5D6020 and D-Link DWL-650

Commentary and suggestions about this howto go here

News for Belkin F5D6020v2 or other Atmel-based 16bit wireless 802.11b pcmcia card users:

Lindows 4 users:
It has recently been confirmed that my pre-compiled Belkin RedHat 9.0 module works with Lindows v4, we can thank James Wylie for that info.
Mandrake 9.1 users:
Mandrake 9.1 includes the atmelwlandriver modules in the distribution. They are based on the same project on sourceforge.net as the modules I provide here. If you're using 9.1 or later, take a look in your /lib/modules/`uname -r`/kernel/3rdparty/atmelwlan/ directory. You'll see directories for all the atmelwlandriver modules and in the directory pcmf502_revd is the module for the Belkin F5D6020 rev 2 card. So, if you're using Mandrake 9.1, don't download anything from here as it is infinitely better to use the official module that comes with your distro as they have tested it much more thoroughly than I ever could. Of course, if you have trouble with the Mandrake modules, feel free to download and try mine, and please, let me know if the Mandrake 9.1 modules work for you or not.
Sadly, and for reasons I've yet to determine, these 3rdparty modules will not show up in the config tool that you can run from the Mandrake Control Center for your network card. So, you'll still need to check the configuration section for how to set this card up on Mandrake, just make sure to substitute pcmf502_revd everywhere you see pcmf502rd.

Introduction

So, you're a Linux user and you decided to take the wireless 802.11b plunge, furthermore, you're a savvy, experienced Linux user and as usual you did your homework prior to making any purchase. So, when you popped your brand new Belkin F5D6020 or D-Link DWL-650 card into your notebook, and were met with errors, you were no doubt as disappointed and annoyed as I.
Well, I've got good news for you, they both will work with your Linux distro, just not with the orinoco_cs module that you saw them listed under over on the Sourceforge PCMCIA site's list of supported cards. Neither will they work with any other *_cs or *_cb module that is a normal part of the PCMCIA services for Linux package installed by your distribution.
You may be wondering how ol' Craig managed to discover which driver out there would work. Here's a tip for finding Linux drivers for any device that has an FCCID printed on it somewhere: Go to the FCC ID Number Search Page and see if there are some pictures of your hardware disassembled so that you can view the names on the chips. Then, try the chipset maker's website for Linux drivers, it just may work. In this case, while neither Belkin or D-Link provide Linux drivers for these version 2 cards, the chipset makers: Atmel and ADMtek do.

I've got the D-Link DWL-650v2 or another ADMtek card, take me to that section!

The Belkin F5D6020, Version 2 (also for other atmel chipset 16-bit pcmcia cards)

Identified by it's FCCID of K7SF5D6021 and a model number on the front ending in ver. 2, this card now uses an Atmel chipset. There is a project on Sourceforge which is based on source code released by Atmel. This howto is based on the May 7, 2003 snapshot, you can check their downloads page for more recent snapshots or use cvs, or download the snapshot I used right here from the HoC, your choice. If you'd prefer not to compile it yourself, or you really don't want to install the kernel source, here are pre-compiled, ready to use modules for: Mandrake 9.1, Mandrake 9.0, Slackware 9.0, and RedHat 9.0 (confirmed to work also for Lindows v4, thanks: James Wylie). in which case you can jump to the configuration.

Building and Installing the PCMCIA driver

Following the instructions in the README should suffice for most of you who have ever successfully built anything from source under Linux. If not, there's a first time for everything, start with make help and see where it leads you. There were a couple of gotcha's on both Mandrake 9.0 and Slackware 9.0 that I'll detail for you here.
  1. The setup script checks to see if your kernel has the pcmcia-cs code compiled in (internal) or if it was compiled as a module (external), if yours is external, as is the case for the bare.i kernel in Slackware 9.0, then it will eventually ask for the location of the pcmcia-cs source code. You'll then need to make sure the pcmcia-cs source code of the correct version for your distro is available, eg: downloaded and untarred somewhere. Watch the version, as the module may compile no problem with an incorrect version, but it will not insert into the running kernel. If this happens, check your logs for errors and use modinfo pcmcia_core as it will list the correct version of pcmcia-cs required.
  2. The Install script expects to find this directory: /lib/modules/`uname -r`/pcmcia, on my Mandrake system this directory did not exist and is actually: /lib/modules/`uname -r`/kernel/drivers/net/pcmcia, after I created the appropriate symlink: ln -s /lib/modules/`uname -r`/pcmcia/kernel/drivers/net/pcmcia /lib/modules/`uname -r`/pcmcia, the install went fine, on Slackware 9.0 this directory already exists.
  3. In order to compile the xforms-based xvnet configuration/monitor utility, you'll need to have the libforms library installed on your system, look in your /usr/X11R6/lib directory for libforms.so.9999 and a symlink to it named libforms.so.0. You'll also need the kernel source headers installed to compile either of these packages). (note: you don't need the actual kernel source installed, just the headers, hopefully your distro packaging separated the two as Slackware does, if not, you'll have to install the kernel source.) Additionally, you may have to either copy vnetioctl.h and forms.h to the atmelwlandriver/src/apps/XWlan directory or create symlinks there to get xvnet to compile as I had to on Mandrake 9.0, I did not have to create this symlink on Slackware 9.0. Although I messed a bit with the Makefile, I ended up having to copy those includes, so save yourself the trouble and leave the Makefile alone. This is a very nice utility, and I highly recommend you try it if you use X. here's a screenshot of xvnet. The ncurses-based lvnet utility works quite well also, and requires only that the ncurses library be installed, which is quite likely with today's distributions. It is a fine alternative whether you use X or not.
There is a short question/answer session when you type make config. Initially, I chose to build debug versions of all the pcmcia drivers. Since now I know that the driver needed for this card is the pcmf502rd.o module, I would recommend you answer these questions to build only that module without debug as the debug version quickly fills your logs with redundant entries. The binaries I'm providing (see links above) for Mandrake 9.0 and Slackware 9.0 users were compiled that way.
One more thing you should be aware of, the next time depmod -a is run on your system (typically at bootup) you will see "unresolved symbols" related to this module, this is "normal" in the sense that not only do I get them on all machines here, but others have reported this as well. Yet, the module still works.

Configuring the pcmf502rd PCMCIA driver

Mandrake 9.1 users: if you want to use the built-in Mandrake module you must substitute pcmf502_revd everywhere you see pcmf502rd

Since this card is a 16bit PCMCIA card you'll want to use the standard pcmcia files and the standard wireless tools to configure it's module and parameters. First, add this line:
device "pcmf502rd" class "network" module "pcmf502rd" (with the quotes)
near the beginning of your /etc/pcmcia/config file. I placed this line just after the airo_cs section around line #45. Next, you'll need to modify the wireless cards section furthur down in the same file (around line #1000) with these lines: (again, with the quotes).
card "Belkin F5D6020 rev.2"
		manfid 0x01bf, 0x3302
		bind "pcmf502rd"
At this point it's time to restart pcmcia services, on Mandrake and Redhat this is done with: /etc/init.d/pcmcia restart, on Slackware it's /etc/rc.d/rc.pcmcia stop/start, you'll need to find a similar script for your distribution, most likely located in or under /etc/rc.d. As an alternative you can send a SIGHUP signal to cardmgr's pid, which should cause the config file to be re-read, type kill -s SIGHUP `pidof cardmgr`.
With the card inserted you should be able to type cardctl ident and see the info you placed in the /etc/pcmcia/config file returned. If the ident goes well, type ifconfig, of most interest is that ifconfig returns the correct MAC address for your card in the field marked "HWaddr", your MAC address should be printed on the card or it's packaging somewhere. If you have the wireless tools installed, type iwconfig and verify that the card is registered correctly. Here's what cardctl ident, ifconfig and iwconfig return on my system:
# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:41:CA:43:96:E3
          inet addr:192.168.2.98  Bcast:192.168.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:225 errors:0 dropped:0 overruns:0 frame:0
          TX packets:180 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0
          RX bytes:0 (0.0 b)  TX bytes:27238 (26.5 Kb)
# cardctl ident
Socket 0:
  no product info available
Socket 1:
  product info: "Belkin", "11Mbps-Wireless-Notebook-Network-Adapter"
  manfid: 0x01bf, 0x3302
  function: 6 (network)
# iwconfig
eth0      ATMEL REVD  ESSID:""
          Mode:Managed  Channel:4  Access Point: 00:03:2F:06:F4:13
          Bit Rate:11Mb/s
          RTS thr=2347 B   Fragment thr=2346 B
          Encryption key:xxxx-xxxx-xx   Encryption mode:open
          Link Quality:40  Signal level:86  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
As you can see from ifconfig's output my card's MAC address is correctly listed (which I've mangled here), it has an ip address on the router's subnet which I choose to manually configure, and iwconfig shows that it is associated with my SMC router. Further, iwconfig shows that I'm using Infrastructure mode, an 11mpbs rate, channel 4, and 64bit encryption (which I've x'd over), your details will vary.

Automating the config

You'll no doubt want to set things up so this card will get set up properly on boot, as well as after a resume from suspend, here's how:

Mandrake/RedHat Configuration

Since these distros by-pass the standard pcmcia config files, namely: /etc/pcmcia/network.opts and /etc/pcmcia/wireless.opts, don't bother messing with them. Instead, you'll need to modify the file /etc/sysconfig/network-scripts/ifcfg-eth0, where eth0 is the device name on your system. Not only can you put things in there that are passed to ifconfig, but also things that are passed to iwconfig, sweet, ain't it?

my /etc/sysconfig/network-scripts/ifcfg-eth0 looks like this:
	DEVICE=eth0
	BOOTPROTO=static
	IPADDR=192.168.2.98
	NETMASK=255.255.255.0
	NETWORK=192.168.2.0
	BROADCAST=192.168.2.255
	ONBOOT=no
	# begin wireless specific settings passed to iwconfig
	MODE=Managed
	ESSID=wireless_hoc
	CHANNEL=4
	RATE=11M auto
	KEY=xxxx-xxxx-xx
You'll also need to verify the contents of your /etc/sysconfig/network file, here's what mine looks like:
	NETWORKING=yes
	FORWARD_IPV4=false
	HOSTNAME=Thinkpad
	DOMAINNAME=localdomain
	GATEWAY=192.168.2.1
Of most importance in this file is the GATEWAY setting which should match the IP address of your wireless access point or router. You may also have noticed that the ONBOOT setting is "no", this prevents the attempted configuring of the device before the PCMCIA sub-system has loaded, cardmgr should take care of loading the module when it detects the card. One more thing, on my notebook, an IBM Thinkpad 600, I had to modify the line in /etc/sysconfig/apmd to read "PCMCIARESTART=yes", in order to for a resume from suspend to work as expected.

Last but not least, you'll want to verify the contents of /etc/resolv.conf, here's what one of mine looks like:
	search localdomain
	nameserver 192.168.2.1
The "search" line may cause some trouble, if so, remove it or comment it out by making the first character a # sign. The IP address after "nameserver" should be that of your router or access point.

Slackware Configuration (16-bit pcmcia cards)

Slackware is a bit different and does not circumvent the normal /etc/pcmcia/*.opts files (thank you very much).
Here are the appropriate modifiations to /etc/rc.d/rc.inet1:
# Edit these values to set up your first Ethernet card (eth0):
IPADDR="192.168.2.20"  # REPLACE with YOUR IP address!
NETMASK="255.255.255.0" # REPLACE with YOUR netmask!
.
.
.
# Edit the next line to point to your gateway:
GATEWAY="192.168.2.1" # REPLACE with YOUR gateway!

Here are the appropriate modifications to /etc/pcmcia/network.opts:
case "$ADDRESS" in
*,*,*,*)
    INFO="Sample private network setup"
    # Transceiver selection, for some cards -- see 'man ifport'
    IF_PORT=""
    # Use BOOTP (via /sbin/bootpc, or /sbin/pump)? [y/n]
    BOOTP="n"
    # Use DHCP (via /sbin/dhcpcd, /sbin/dhclient, or /sbin/pump)? [y/n]
    DHCP="n" (note: if you're using dhcp then set this to "y" and leave the rest blank like this: "")
    # If you need to explicitly specify a hostname for DHCP requests
    DHCP_HOSTNAME=""
    # Host's IP address, netmask, network address, broadcast address
    IPADDR="192.168.2.20"
    NETMASK="255.255.255.0"
    NETWORK="192.168.2.0"
    BROADCAST="192.168.2.255"
    # Gateway address for static routing
    GATEWAY="192.168.2.1"
    # Things to add to /etc/resolv.conf for this interface
    DOMAIN=""
    SEARCH=""
    DNS_1="192.168.2.1"
    DNS_2=""
    DNS_3=""

Note that if you're configuring more than one network card via PCMCIA/CardBus, that you'll have to actually replace those "*,*,*,*" characters with meaninful numbers and add or modify another section like it for the second card, see the commentary throughout the file for how to do that.


Finally, here's the mods to my Slackware /etc/pcmcia/wireless.opts:

# NOTE : Remove the following four lines to activate the samples below ...
# --------- START SECTION TO REMOVE -----------
*,*,*,*)
    INFO="HoC"
    ESSID="wireless_hoc"
    MODE="Managed"
    KEY="xxxx-xxxx-xx" (again, I've x'd over the actual values)
    RATE="11M"
    CHANNEL="4"
    ;;
# ---------- END SECTION TO REMOVE ------------
Don't be put off by that "SECTION TO REMOVE" stuff, *grin*, it's not a problem for a single-card situation. However, if you're configuring more than one wireless card via PCMCIA/CardBus, you'll have to actually replace those "*,*,*,*" characters with meaninful numbers and add or modify another section like it for the second card, see the commentary throughout the file for how to do that.

Slackware configuration: 32-bit CardBus or PCI cards
I have yet to determine where good ol' Slack wants me to put wireless vars for 32-bit PCI or CardBus cards. As a workaround, I create a script that starts up the card, performing ifconfig, iwconfig and route tasks. Then, I add a "post-install" line to /etc/modules.conf for the card, for PCI cards you'll also need to add an "alias eth1 (or eth0) module_name" line to the same file. Here are the 2 lines to add to your /etc/modules.conf:
alias eth0 8211 #for PCI cards only, not CardBus
	post-install 8211 /usr/bin/start_8211
Here's what the above-referenced /usr/bin/start_8211 looks like on one of my systems:
#!/bin/bash
	#use the correct devicename for your system in place of eth0
	ifconfig eth0 192.168.2.100 # use an ip address that works with your router/access point
	sleep 1 # sleep lines are optional, I find them necessary
	iwconfig eth0 mode managed rate 11M channel 1
	sleep 1
	iwconfig eth0 key xxxx-xxxx-xx #64bit WEP key optional, should match what you're using on your setup
	sleep 1
	iwconfig eth0 essid your_essid_name # if the name contains spaces, enclose in single or double quotes
	route add default gw 192.168.2.1 eth0 # use your router's ip address
Be sure to do a chmod u+x /usr/bin/start_8211 to make the script executable after creating it. When I find a more elegant solution to this, I'll update this section.
Take note that for this method the above items are the only steps you should take to configure the 32 bit card. If /etc/rc.d/rc.netdevice exists and has a line like /sbin/modprobe 8211, in it comment that line out with a # character. If /etc/rc.d/rc.inet1 has values for this eth device, comment those out too.

Last but not least, you'll want to verify the contents of /etc/resolv.conf, here's what one of mine looks like:
	search localdomain
	nameserver 192.168.2.1
The "search" line may cause some trouble, if so comment it out by making the first character a # sign. The IP address after "nameserver" should be that of your router or access point.

Alternate Configuration - not automated
If you don't have iwconfig and friends (collectively called the 'wireless tools') installed, you can use the lvnet or xvnet utilities that were compiled/installed with the driver. here are screenshots of lvnet and xvnet in action. Be aware that neither of these tools fit into the scripted automation of the regular pcmcia package, and you will eventually need to install the wireless-tools for automatic configuration at bootup and after a suspend once everything is working via manual configuration. Any modern distribution, and most older ones will have a package for the wireless tools, search on iwconfig to find it.


My thoughts on the Belkin F5D6020ver.2
First of all, in spite of having the thinnest antenna housing of any card I own (no thicker than the card), this card has excellent range, meaning you get a very good signal at quite some distance from the router/access point, which means you get a faster bitrate at greater distances, a big plus. Secondly, this card doesn't do a lot of annoying blinking, in fact it doesn't blink at all, also a plus. Third, unlike a lot of other 802.11b cards out there, the physical dimensions of this card allow a second card to be used along with it, either under or over it, a very big plus.
I've noticed that the atmelwlandriver pulls in the appletalk and the ipx modules on occasion, this is only mildly annoying and they can be removed with no repercussions, it is a slight minus though.

The D-LInk DWL-650, Version 2

Since it has the exact same model number as the version 1 card, (DWL-650) you'll need to identify this card solely by it's FCCID of KA2DWL-650V2, this card now uses an ADMtek chipset. The source code package is available on their site for download. I've also got precompiled modules for Mandrake 9.0, Mandrake 9.1 as well as RedHat 9.0 and Slackware 9.0, if you choose to download one of my modules (vs compiling your own), you can jump right to installing the 8211 module.
I'm attempting to expand the coverage of this document to include all ADMtek based CardBus and PCI cards. If you've got a different brand-name card, don't worry, other than the FCCID stuff, nothing here is absolutely specific to the D-Link card. In fact, part of these instructions come from my experiences with a TrendNet PCI card in a desktop machine running Slackware.
One thing I can't do here is test/support any more distros, I'm out of space, upgrades to the ones I already use will occur and the modules' versions will follow.

Building the 8211 module
In this case the README file is pretty much a waste of time, the Makefile is much more helpful. One caveat: if you're a LInux purist type you're not going to like the fact that this driver links with a closed-source binary named ADM_prv.o and contains no license which taints the kernel when loaded. If you're ok with that read on, otherwise it's time to sell or give the card away. The good news is the Makefile is small and you should give it a look. A make all is all that's required to compile this source.
You'll notice there is no "install" option listed in the makefile, and no install script provided, here's how I installed this module on Mandrake 9.0, (you may need to modify locations/file names to suit your particular distribution):

Installing the 8211 module
Instructions below to "type:" something are intended to be typed at a console as the root user. If you're not logged in as root, then logout and log back in as root. You can use the su command to become root it's true, but then you would need to type full path names for all the commands that follow, logging in as root puts these commands in your normal path.
  1. CardBus users: do not have the card inserted, use cardctl eject, and remove the card
  2. PCI card users: type lsmod and make sure no modules are loaded for this card, you're looking for modules in the list like "8211", or something with admtek in it. If you see this type "rmmod modulesname" to remove it.
  3. If you downloaded one of my pre-compiled modules you'll need to unpack it like this: tar zxf 8211-`uname -r`.tar.gz, you should then have a file named 8211.o to work with.
  4. copy the file 8211.o to the appropriate directory under /lib/modules/`uname -r`/, for CardBus cards it's cp 8211.o /lib/modules/`uname -r`/kernel/drivers/net/pcmcia/, for PCI cards it should probably be: cp 8211.o /lib/modules/`uname -r`/kernel/drivers/net/.
  5. type depmod -a to rebuild the module dependencies file(s), "unresolved symbol" errors are normal for this module, I get them too, yet it works.
  6. CardBus users should now insert the card. PCI card users should now type insmod 8211, errors about "tainting the kernel" are normal.
  7. Either way, you should now type lsmod and verify that 8211 is in the list.
  8. at this point RedHat 9.0 users should try the network configuration tool on the settings menu to finish setting this card up. If it works, you are done. (thanks to Gregory M. Nutt)
  9. users of mandrake or slackware (and redhat, if the setup tool failed) should continue.

Configuring the 8211 driver
Since this card is a 32bit Cardbus model we won't be using the /etc/pcmcia/config and friends to configure it. It comes with no tools of it's own, so to use this card you must have installed the wireless-tools. Type ifconfig -a and verify that an ethernet device is registered with the MAC address of the card listed next to HWaddr. To activate the card type: ifconfig eth0 192.168.0.100 using your device name and an appropriate IP address for your particular network. This will bring the device "up", and as you may notice start the act LED incessantly blinking. This occurs on WindowsXP Pro, WindowsME and Windows98SE as well, it's not just a linux thing. if you're going to use this card for very long I recommend placing a piece of tape over that LED.
You may now type iwconfig and see what it reports. At the very least you should see the MAC address of your access point/router as the BSSID. For CardBus cards: cardctl works as an eject/insert mechanism only, cardctl ident reports nothing, cardctl status reports only that a 3.3v CardBus card is inserted. Use iwconfig to set WEP encryption, power modes and any other site-specific settings necessary. Although you may be successful using the GUI network utilities common to your distribution for setting up the ifconfig-type stuff, this document is based on manually editing the files. If you're just testing things out manually and you get a network unreachable error when attempting a ping, you'll need to add to the routing table, here's what I type: route add default gw 192.168.2.1 where the IP address used is that of my wireless router.
The exact same automation settings will work with this card as the Belkin. So, you can jump back to automating the config and check it out. One thing I have not figured out is how to unload the 8211 driver on an eject or a suspend, nor have I found where to tell the hotplug system not to attempt to install a whole host of modules that have nothing to do with this card. On my system, usb-uhci, uhci are attempted but blacklisted, neofb does get loaded, but finds the framebuffer in use. I'll update this when I get that business straightened out.
UPDATE: My investigation of the Linux Hotplug system has led me to a few conclusions:
  1. Add modules to the /etc/hotplug/blacklist that you don't want loaded, for me this included: neofb, appletalk, and ipx, this seems kludgy, but it works.
  2. A shell-script named the same thing as the module located in /etc/hotplug/pci, will be executed on module load.
  3. An options line added to /etc/modules.conf will be used by modprobe et al, even if an alias line does not exist.

My thoughts on the D-Link DWL-650v2
Although it is a 32bit card, vs. the 16bit Belkin, I have not perceived a difference in performance. While I have not used any tools to measure throughput, I don't get the feeling that things are going any faster using this card vs. the Belkin. Feature-wise, the driver supports all the same features of the Atmel driver: WEP, power modes, suspend/resume, etc. The nearly constant, incessant blinking of the act LED is a minus. Once, for a brief period today during extended usage, the act LED settled down, otherwise as soon as the card is brought up, it blinks non-stop, a big minus. UPDATE: I have determined that the blinking of the act LED is a measure of signal strength, so may not be such a minus after all.Part of the driver source code package is binary, as in the source code for it is not available, also a minus. No tools come with this package either, not that the tools that come with the atmel package are terribly useful once you get everything working, since they don't support scripting. I must say I do find the xvnet utility quite useful for testing the range of the card, it sure beats a long series of iwconfig's. Physically, this card has an antenna housing that prohibits another card from being used over or on top of it, if you place it in the top slot, another card will fit under it though, so this is only a small minus, and this card is certainly not alone in this slight defect. In summary, If you already own this card, I hope the info here will be useful to you, if you don't already own this card, there are much better choices, certainly the Belkin F5D6020 is one.