The latest version of this document was updated May 30, 2004 12:42 PM.
Commentary, questions and suggestions go here:
This is my updated guide for new Linux users who have Texas Instruments' acx100-based devices and would like them to become functional, the original doc, now rather out-of-date is here and not maintained. This guide applies to any make/model device that actually contains the acx100 chipset, including CardBus (PCMCIA) cards, PCI cards, and in a limited fashion, USB devices. If you're wondering whether your device(s) contain that chipset, then read on, since one of the very first things we're going to do is determine that very thing so you don't end up wasting your time trying to use the acx100 driver on a non-acx100 device.
If, once booted to Linux you won't have any internet access then you'll need to download the source code for the driver we are going to build ahead of time using whatever facility you're using to view this document. Use the following link to download the same, recent source version that I'm using and have tested and verified to be functional with my devices (which may not necessarily be the absolute 'latest' version). Here's the link: 0.2.0pre8_plus_fixes_6. This is a single, compressed file, called a "tarball". While there may indeed be a newer version, this guide is based entirely and only on the version and link listed above, and only that version (remember, this driver is still considered 'experimental' and incremental versions can have their problems and are intended for testing purposes). Save the file to some media that will be accessible to you after you boot into Linux. If you're dual-booting Windows/Linux then this can be somewhere on your Windows partition. It can also be saved to a USB pendrive, compact flash card in a pcmcia adapter card, memory stick, burned on a cdrom or saved on a floppy disk. The only requirements are that the media have the free space for the source code and is accessible to Linux. Do not use any other OS to unpack the source code "tarball" file, unpack it only after booting to Linux. If you are dual-booting Windows/Linux and this card is working for you in Windows, then you may want to bring up the interface in Windows that allows you to view/set the parameters of the card and print that display so you will have the correct information available for testing and configuring the card after booting to Linux. Once you have your wireless and networking settings recorded and the source code tarball in hand, if you are not already booted to Linux, go ahead and do so.
One of the reasons that you don't see a particular Linux distribution, such as Slackware, Debian, Mandrake, Redhat, Fedora, or SuSE as part of this guide's title is that by using the console (CLI or command line interface) to compile, install, and test this driver, we can be nearly distribution-neutral and allow this document to apply to as many people as possible. When the time comes to configure your card for your particular distribution, we'll be forking due to the differences in the way various distributions handle network and wireless configuration. From this point onward I'm assuming that you're booted to Linux and that you have a terminal/shell/console window open in front of you. Make sure any commands listed in bold text below are typed in verbatim, case and punctuation are important. You can cut and paste the commands from your browser into most console windows using the mouse to highlight the text and then your browser's menu to copy it, and then either right-clicking the console window and choosing 'paste' or using the middle mouse button.
The first command I have for you is to temporarily become the root user, type: su -, followed by entering the root password, no characters will echo as you type the root password, this is normal, upon success, your command prompt should be different and typing whoami should return: root. Once you have become the root user, I would caution you to not go outside the bounds of the instructions below, you can (and should) experiment with commands as your "normal" user, but don't experiment as root. Most of the instructions below are fairly "typo-safe" in that if you somewhat mis-type something the command will simply fail and no harm will be done, however, grossly mis-typed commands could conceivably do enough damage to your linux setup that you'll have to re-install, so, please, type carefully, or use cut/paste.
You must first determine that you have a card that contains an acx100 chipset and is thus fully compatible with the driver and this guide. Understand that due to continuing unfortunate and ill-advised model naming by some device manufacturers, there is a lot of confusion about this issue, please verify your chipset as instructed, and do not trust the model number on your device. Chipsets internal to these devices have and will change unannounced, you must verify before continuing in order to save yourself the headache of trying to use the wrong driver with your device. Having said that, it's time to identify your device. To do that you'll need to run lspci -n with your PCI card installed and/or your CardBus card plugged in. Successful output looks similar to this:
# lspci -n 00:00.0 Class 0600: 8086:7192 (rev 02) 00:02.0 Class 0607: 104c:ac16 (rev 02) 00:02.1 Class 0607: 104c:ac16 (rev 02) 00:03.0 Class 0300: 10c8:0004 (rev 01) 00:07.0 Class 0680: 8086:7110 (rev 01) 00:07.1 Class 0101: 8086:7111 (rev 01) 00:07.2 Class 0c03: 8086:7112 (rev 01) 00:07.3 Class 0680: 8086:7113 (rev 01) 05:00.0 Class 0280: 104c:8400
That listing is taken from running lspci -n on my ThinkPad 600 with my SMC 2435w CardBus card plugged in. Out of those 9 lines listed, we're only interested in that last one:
05:00.0 Class 0280: 104c:8400because it contains one of the 3 combinations listed below at it's end:
If you don't see one of those combinations anywhere in the listing, then sadly, I can't say with any certainty that the acx100 open-source driver or this guide will be of any assistance to you. USB device owners, for now, you'll just have to trust your model number, since at this time there is only one USB device available that uses the acx100 chipset that I'm aware of: it is the D-Link DWL-120+ (which I own and am using/testing), with heavy emphasis on the "+" part of that model number. Regular DWL-120 (notice, no "+") USB devices are not acx100 based, they are either Atmel(H/W:E1) or Prism(H/W:D1) based (I own the H/W:D1 model). For PCI/CardBus card owners, whatever the make and model of your particular card is, if you don't see one of those 2 combinations of numbers, then don't waste your time here, instead go over to http://www.linux-wlan.org/docs/wlan_adapters.html.gzto determine what chipset is in your device, and hopefully, what driver will work with your card, that page is quite comprehensive and is therefore huge. It may take some time to download completely to your browser. Understand that this identification process is extremely important as it keeps you from wasting your time with a device that is not compatible with this guide, and at the same time verifies to some degree that your cardbus/pcmcia/usb sub-system is installed and working. If lspci returns what you think is your acx100 device with a lot of f's on it's line, and you're using a CardBus(PCMCIA) card, then see the troubleshooting section for this.
If you've never compiled a kernel module from source code before on your current Linux installation, then now you must verify, and if necessary, prepare, what I call your "build environment". If you've already compiled some other kernel module, or an older version of the acx100 source code before on your current Linux installation, then your build environment is most likely fine, and outside of verifying the presence of the wireless tools, this step is not necessary, so you can skip ahead if you like. For the rest of you who've not compiled this or any other kernel module before (note: compiling a kernel module is not the same as compiling other applications, and has different requirements), it's time to check your build environment: you'll need to have the correct kernel sources, the listed development tools, and the wireless tools installed in order to compile the driver and then use it with your device. In your root-console, verify the presence of the compiler, type: gcc --version successful output looks like this:
gcc (GCC) 3.2.3 Copyright (C) 2002 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.Unsuccessful output will look similar to this:
-su: gcc: command not foundYou'll also need make and if gcc is installed, most likely make is also, but just to be sure type: make --version and successful output looks like this:
GNU Make 3.80 Copyright (C) 2002 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.with unsuccessful output similar to this:
-bash: make: command not foundNext, verify the presence of the correct version of the kernel source, type: ls /lib/modules/`uname -r`/build/Makefile those ` characters around uname -r are not single-quotes the key for them on my keyboard is the lower-case of the tilde (~) character to the left of the numeric 1 key. Successful output looks like this:
/lib/modules/2.4.24/build/MakefileYour kernel version numbers (2.4.24) will very most likely be different, that's ok. Unsuccessful output will look similar to this:
/usr/bin/ls: /lib/modules/2.6.3/build/Makefile: No such file or directoryNow, verify the presence of the wireless-tools, type: iwconfig despite what my look like negative output, successful output looks similar to below. There may be other lines in addition to "lo" describing any other active ethernet devices in the machine that do not have wireless capability, this is all normal:
lo no wireless extensions.Unsuccessful output looks like this:
-su: iwconfig: command not found
If you do not meet with success from all of the commands above, then you'll need to install the appropriate package(s) on your system. Perhaps one of the most defining and differentiating characteristic of any distribution is it's package management system. As such, my instructions on how to use your distribution's package management to install any missing 'packages' are intentionally quite generic. You'll need to do the appropriate research for your distribution in order to determine how to bring up their 'Package Manager'. Menu items for this are typically: "install/remove software", sometimes "package" is used in place of "software" and "administer" or "manage" is used in place of "install/remove", you'll have to find this application on your own. Once you have it up and running, use the search facility (if there is one) and search on "kernel-source" which seems to be nearly universal as the package name for the kernel sources, once found, install it. If you are able to search the filenames contained within the packages (as opposed to the package names themselves) then search on "gcc" to determine what package to install for the compiler. If not, look for packages related to "development", verify which contains the compiler, and install. Do not install just gcc, there are a host of other utilities needed along with gcc, install the whole package. Finally, while you have your package manager up, verify that the package: "wireless-tools" is installed, this package name is also nearly universal. While not necessary for compiling, you will absolutely need them to configure and test your device. Many times these wireless-tools are not installed unless a "recognized" wireless card is inserted at installation time. Obviously, if you're here, your card was not recognized, so they are probably not installed. If something here fails, then see the troubleshooting section for this.
Finally, once you've installed or verified the presence of your kernel-source package, you'll want to make sure that a file named .config (that's a leading dot) exists in your /lib/modules/`uname -r`/build directory (those are backtics, not single-quotes). Verify that it exists with ls -l /lib/modules/`uname -r`/build/.config Successful output looks like this and again, your kernel numbers (2.6.3) will most likely be different:
-rw-r--r-- 1 craig root 27097 Mar 6 10:58 /lib/modules/2.6.3/build/.configand unsuccessful output looks like this:
/usr/bin/ls: /lib/modules/2.6.3/build/.config: No such file or directory
To correct this problem you'll need to copy the kernel config file from your /boot directory to your build directory, try this command: cp /boot/config-`uname -r` /lib/modules/`uname -r`/build/.config (backtics, not single-quotes), if it fails then you'll need to ls /boot to view the contents of your /boot directory and determine from the listing what the actual filename of the correct kernel config file is and then substitute it for the "config-`uname -r`" part of the command above.
You'll now need to mount the medium you used previously to store the source code tarball and copy or move it to a directory on your Linux partition. Alternatively, if within Linux you have a working connection to the internet and don't yet have the source tarball, then download the acx100-0.2.0pre8_plus_fixes_6.tar.bz2 file now. Either way, the file can be copied to any directory and unpacked there, but your home directory (yours, not root's) is the best choice. Your home directory is typically /home/ followed by your username, for instance, my home directory is /home/craig. If you're having trouble mounting the media or copying the source tarball file to your home directory then see the troubleshooting section for this.
At this point there should be a file named acx100-0.2.0pre8_plus_fixes_6.tar.bz2 in your home directory. Before unpacking it, change it's owner to your normal username, type: chown your_normal_username /home/your_normal_username/acx100-0.2.0pre8_plus_fixes_6.tar.bz2. Now you'll want to briefly switch users back to your normal username, so type: exit. Next, change to your home directory in your now non-root console by typing: cd /home/your_normal_user_name, then type: tar jxf acx100-0.2.0pre8_plus_fixes_6.tar.bz2. Make sure to use the actual complete filename of the file you downloaded, to see it, you can type: ls. A new directory(folder) will be created named 0.2.0pre8_plus_fixes_6, to see if all is well type: ls 0.2.0pre8_plus_fixes_6 and you should see some files. My output looks like this:
ChangeLog Configure* LICENSE Makefile README TODO config.mk doc/ firmware/ include/ scripts/ src/At this point it's time to go back being the root user, so once again type: su -, followed by the root password. If you have trouble unpacking the file, see the troubleshooting section for this.
First, change to the 0.2.0pre8_plus_fixes_6 top-level directory, type: cd /home/your_normal_username/0.2.0pre8_plus_fixes_6. Now, build the driver, type: make and oddly enough, successful output has these as it's last 2 lines:
*** WARNING: acx100_pci.ko changed to acx_pci.ko. Don't forget to update any scripts! *** make[1]: Leaving directory `/mnt/hda12/acx100-0.2.0pre8_plus_fixes_6/src'
If something here fails see the troubleshooting section for this. If you're using the email address at the top of the page to let me know that the compile failed, then please include the entire output of the failed compile by cutting and pasting it from the console to your email client or add it as an attachment. To help you, I need to see what happened.
Driver:
This is accomplished by typing: make install after
the driver is compiled successfully. Among other things, that command copies the
driver modules to the correct place and runs the command: depmod -ae for you.
You should not see any errors from the make install.
Firmware:
Next, you'll need to take care of installing the
firmware. These are separate small files found on the Windows' driver CD or in a
downloaded Windows' driver archive. They are named: RADIO0d.BIN, RADIO11.BIN,
RADIO15.BIN, WLANGEN.BIN, TIACX111.BIN. and for the dwl-120+ usb device:
ACX100.bin. You'll need to first create the directory where they need to be
installed, type: mkdir /usr/share/acx, this is the directory that the
driver now looks in for the firmware. Then you'll need to copy the
aforementioned files to that directory, taking care that their names are
preserved, and if necessary changed to be exactly as listed above.
You may not have all of them in your Windows' driver, just copy the ones that
you do have. Use this command 'template' to copy the files: cp
/fullpath/to/firmware/filename.ext /usr/share/acx, where you'll substitute
the actual full path to where they are located for the "/fullpath/to/firmware"
part and substitute the filename's listed above for the "filename.ext" part.
When finished placing the firmware in the /usr/src/acx directory, you'll also
then need to copy all the firmware files to the
/home/your_normal_username/0.2.0pre8_plus_fixes_6/firmware directory, type:
cp /usr/share/acx/*
/home/your_normal_username/0.2.0pre8_plus_fixes_6/firmware.
Alternatively, if you have a working internet connection in this machine, you can type make fetch_firmware (with your device installed or plugged in) and when it has completed the output will look like this at the end:
Extracting driver file ./dwl-g650+_drv_v1.0.zip...Archive: ./dwl-g650+_drv_v1.0.zip extracting: Win98/GPLUS.CAT inflating: Win98/GPLUS.INF inflating: Win98/GPLUS.SYS inflating: Win98/TIACX111.BIN extracting: WinME/GPLUS.CAT inflating: WinME/GPLUS.INF inflating: WinME/GPLUS.SYS inflating: WinME/TIACX111.BIN extracting: WinXP/GPLUS.CAT inflating: WinXP/GPLUS.INF inflating: WinXP/GPLUS.SYS inflating: WinXP/TIACX111.BIN extracting: Win2000/GPLUS.CAT inflating: Win2000/GPLUS.INF inflating: Win2000/GPLUS.SYS inflating: Win2000/TIACX111.BIN Done. Finished! (Hopefully!) If something failed, then please report it!
After running the make fetch_firmware, you will now have all the firmware files (not including the usb firmware) in the 0.2.0pre8_plus_fixes_6/firmware directory. It's best to also copy those files to /usr/share/acx, type: cp firmware/*.BIN /usr/share/acx.
Dwl-120+ (USB) device users will need to locate the file: ACX100.bin on their Windows' installation disc, or perhaps in a downloaded zip file and copy it to boththe /usr/share/acx and /home/your_normal_username/0.2.0pre8_plus_fixes_6/firmware directories.
At this point your driver has been completely compiled and installed. Next, you'll want to open the file named start_net found in the /home/your_normal_username/0.2.0pre8_plus_fixes_6/scripts directory using your favorite text editor. Here's what the editable area of that script file looks like, don't modify anything else unless you run into trouble:
# Please edit here DEV=wlan0 ESSID="any" # THIS IS CASE SeNsItIvE!! any == associate to any ESSID # Default rate configured as 11Mbps to not cause connection problems with non-22Mbps hardware... RATE=11M CHAN=6 # it's useful to try to stick to channels 1, 6 or 11 only, since these don't overlap with other channels #TXPOWER=16 # 16 == 16.5dBm, 18 == 18dBm (default) MODE=Auto # Auto == auto-select Managed or Ad-Hoc depending on environment DEBUG=0xb #KEY="B401CD21B44CCD21DEADBEEF11" # WEP128 ALG=open # open == Open System, restricted == Shared Key USE_DHCP=0 # set to 1 for auto configuration instead of fixed IP setting IP=192.168.0.10 NETMASK=255.255.255.0 GATEWAY=192.168.0.254 # Usually no editing should be required below this line... # -- unless you want this script to fetch stuff with dhcp
The first 3 items: ESSID, RATE, and CHAN should be set to match your wireless router or access point's station name, wireless data rate and channel. If your wireless router or access point is 22Mbps capable, then once things are working, you can go back and set the rate to 22M, for initial testing you should leave it at 11M. I recommend you leave the TXPOWER and MODE lines alone for now.
Next, you'll want to set the WEP key correctly if your wireless router or access point is using WEP encryption, which is something you would have had to set up when you installed your wireless router or access point, so I'm assuming you know what the WEP key is ;-).
Finally, if you want your acx100 card to get it's IP address "automatically" from your router or access point, (this is how they are normally set up, you would have had to change something for DHCP to not be the default.) Then set the next line to USE_DHCP=1. If the DHCP client: dhcpcd is installed on your system then you should be good to go, and leave the IP, NETMASK and GATEWAY lines alone. If dhcpcd is not installed, then you'll need to edit something later on in the file. First, find out if dhcpcd is installed by typing: which dhcpcd back in your root console, if a path to dhcpcd is returned, then you're done. If not, try typing: which pump, and again, if a path is returned, then pump is the DHCP client on your system and you'll need to edit further down in the start_net file where it says:
if test $USE_DHCP -eq 1; then # fetch an IP address from DHCP rm -f /etc/dhcpc/dhcpcd-$DEV.pid > /dev/null dhcpcd -d $DEV -t 5 # OR # pump -i $DEVand make it look like this:
if test $USE_DHCP -eq 1; then # fetch an IP address from DHCP #rm -f /etc/dhcpc/dhcpcd-$DEV.pid > /dev/null #dhcpcd -d $DEV -t 5 # OR pump -i $DEV
If neither dhcpcd or pump are successful, then try typing: which dhclient, and if a path is returned then edit that section of the start_net script to look like this:
if test $USE_DHCP -eq 1; then # fetch an IP address from DHCP #rm -f /etc/dhcpc/dhcpcd-$DEV.pid > /dev/null #dhcpcd -d $DEV -t 5 # OR #pump -i $DEV dhclient $DEV
Of course, if neither dhcpcd, pump or dhclient are found on your system and you want to use DHCP, then you'll need to visit your package manager and install one of them, preferably: dhcpcd.
If you are not using DHCP on your wireless network, then you'll need to leave the USE_DHCP line alone, and instead edit the IP, NETMASK and GATEWAY lines to suit your network, typically you can leave the NETMASK as-is. Additionally, if not using DHCP, you'll need to edit /etc/resolv.conf and add a line like this to it: nameserver 192.168.0.1, again using the actual IP address of your wireless router or access point.
That should do it for editing the start_net script, now save the file and return to your root-console and type cd scripts and then ./start_net, successful output looks similar this, with no errors reported:
Module successfully inserted. Setting rate to 11M. Setting channel 6. Trying to join or setup ESSID linksys. Interface has been set up successfully.If you get errors with the word "bailing" in them then see the troubleshooting section for this. If all goes well, you should be able to ping your wireless router or access point with ping -c 4 -I wlan0 192.168.0.1. The "192.168.0.1" part of that command needs to be substituted with the actual IP address of your wireless router or access point, which will be similar to those numbers. Successful output looks similar to this:
64 bytes from 192.168.2.1: icmp_seq=1 ttl=126 time=7.87 ms 64 bytes from 192.168.2.1: icmp_seq=2 ttl=126 time=7.27 ms 64 bytes from 192.168.2.1: icmp_seq=3 ttl=126 time=6.32 ms 64 bytes from 192.168.2.1: icmp_seq=4 ttl=126 time=6.27 ms --- 192.168.2.1 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3003ms rtt min/avg/max/mdev = 6.271/6.934/7.876/0.676 ms
Next, you'll want to try to ping a host on the internet by name, type: ping -c 4 -I wlan0 cnet.com and successful output looks like this:
PING cnet.com (206.16.0.28) from 192.168.2.98 wlan0: 56(84) bytes of data. 64 bytes from abv-sfo1-x-redirect1.cnet.com (206.16.0.28): icmp_seq=1 ttl=234 time=102 ms 64 bytes from abv-sfo1-x-redirect1.cnet.com (206.16.0.28): icmp_seq=2 ttl=234 time=100 ms 64 bytes from abv-sfo1-x-redirect1.cnet.com (206.16.0.28): icmp_seq=3 ttl=234 time=98.9 ms 64 bytes from abv-sfo1-x-redirect1.cnet.com (206.16.0.28): icmp_seq=4 ttl=234 time=98.4 ms
Unsuccessful output looks like this:
ping: unknown host cnet.com
If you were able to successfully ping your wireless router or access point, but not a host on the internet by name, then re-check the contents of your /etc/resolv.conf file, type: cat /etc/resolv.conf to see what's there. You need to have a line in that file like this: nameserver 192.168.1.1, where you'll substitute the IP address of your wireless router or access point for 192.168.1.1 part. To add that line you can type: echo -e '\nnameserver 192.168.1.1\n' >> /etc/resolv.conf in your root-console and retry the ping.
By now, you have your device nicely working and are enjoying some wireless freedom in Linux, congratulations. You may be wondering what's going to happen should you decide to shut down the computer or reboot it. No doubt you'd like your device to come up automatically the next time you boot.
While there are a number of ways to accomplish this goal, I'm going to outline one that will allow you to upgrade your acx100 driver as improvements are made to it. First, see if the file /etc/rc.d/rc.local exists, type ls -l /etc/rc.d/rc.local and successful output looks like this:
-rwxr-xr-x 1 root root 399 Apr 26 19:24 /etc/rc.d/rc.local*
If the file does not exist, you'll get this:
/usr/bin/ls: /etc/rc.d/rc.local: No such file or directory
If that happens, then skip to the next paragraph. Otherwise, if you have an rc.local file, type this: echo -e '\n#Bring acx100 device up\ncd /home/your_normal_username/acx100*/scripts\n./start_net\n' >> /etc/rc.d/rc.local to add 3 lines to the end of it that will bring up your device on bootup. Be sure to substitute your "normal" username in the appropriate place in that command.
If no rc.local file exists, see if a directory named rc.boot does, type: ls -l /etc/rc.boot, successful and unsuccessful output mimics the listings above. If rc.boot exists, then type: echo -e '\n#!/bin/sh\n#Bring acx100 device up\ncd /home/your_normal_username/acx100*/scripts\n./start_net\n' > /etc/rc.boot/rc.acx100 to create a file that will bring your device up on bootup. Be sure to substitute your "normal" username in the appropriate place in that command. Then, make the newly-created file executable with: chmod +x /etc/rc.boot/rc.acx100.
When you decide to upgrade to a newer version of the driver, make sure there is only one top-level directory in your home directory that begins with "acx100".
That should do it. If you need assistance with any of this, feel free to email me: . Please include the information below in your first correspondence, I can't help you if I don't know what you're using and where in the process you ran into errors.
CardBus(PCMCIA) users, I recommend you begin here: http://pcmcia-cs.sourceforge.net/ for troubleshooting the pcmcia sub-system and then here: http://www.linux-laptop.net/ for more specific help on your particular notebook.
PCI card users, re-check the physical installation of the card, and try switching it to another PCI slot, if possible.
Of course, it's entirely possible that your device does not contain an acx100 chipset. acx111-based device users (802.11g compatible device that does 22M as well), support for your device is now available in the latest version of the source, at this writing: 0.2.0pre8_plus_fixes_9. This is the download location.
I'm not going to repeat here all of the fine documentation that's been included in your distribution to help you learn to mount and umount various media in Linux. Mounting and un-mounting media is one of the more fundamental tasks you'll need to become proficient in, as well as how to find help on a command, so man mount is a good place to begin.
Here are some general guidelines for mounting your Windows partition(s) in Linux:cdrom or cdrw or dvd drives (IDE) will also show up as /dev/hd<letter><digit>, I don't own any true SCSI drives so you'll need to type: cat /etc/fstab to see how your distro sets up the drive for mounting, man fstab will help you to decifer it.
Floppy drives are typically: /dev/fd0, you mount them with mount /dev/fd0 /mnt/floppy, if, which is likely in this scenario, the floppy was formatted under Windows and mount doesn't see that then mount it with this: mount -t fat /dev/fd0 /mnt/floppy the files on the floppy will be available under /mnt/floppy/. Un-mount with: umount /mnt/floppy.
General Un-mounting tipsIf you've come to this section of the Troubleshooting area it can only mean you're having trouble either finding and running your distro's 'package manager' or trouble using it to determine whether the kernel-source, development and wireless-tools packages are installed or having trouble using it to install them. First, seek help on using the package manager in the documentation that came with your distro, or perhaps a "help" menu item or button on the package manager itself. There is an outside chance that your chosen distro doesn't use packages at all and therefore there is no package manager (Linux From Scratch(LFS) comes to mind), if that's the case, and you're new to Linux, then I respectfully suggest you switch to a distro that uses packages until you are more familiar with Linux.
I'm trying hard to be distro-neutral here and although I have many different distros installed, I'm not going to go into each distro's specific packaging/package management which may change with new releases and then obsolete those kind of specific instructions anyway. What I will say is that virtually all distros that use packaging have provided packages for the kernel-source, development utilities and the wireless-tools (pcmcia-cs also). The previous names containing dashes are nearly universal across distros for their respective package names. So before you go running off to begin the process of compiling iwconfig or gcc from source, I suggest you take another look at the menus, any online help and perhaps some Linux forums as well. Besides being a waste of time, that "solution" has it's own set of pitfalls and you were really just trying to get your wireless card working, right?. If you still can't turn up anything that looks like a package manager, try running: (if it's installed on your system) apropos install, or apropos package, the lists returned from those commands will contain perhaps a clue as to what the names of packages are on your system and perhaps at least the command-line programs you can use from your console to query what packages are installed and to install what's missing.
I don't recommend that you solve the missing kernel-source issue by downloading what looks like a match from http://kernel.org/. It's true that they are the absolute authoritative repository of the official kernel sources, yet your distro is likely to have modified that source to suit them and that's why they provide their own kernel-source package. There are some notable exceptions to this, but typically, even those distros that don't modify the kernel source still provide a kernel-source package, so use your distro's kernel-source package only.
If you're having trouble unpacking the acx100 source code tarball, then you're probably getting an error message returned from the tar command. It's virtually impossible these days to find that the tar program has not been installed, you would have had to dig deep to eliminate it at install time, and you would most likely have been warned not to do that. If tar is really not installed then there are most likely a lot of other things wrong with your install and I suggest you re-install and decline to use any "expert modes" this time.
Possible reasons why the tar command would fail: (yes, I have made all these mistakes, more than once ;^)The most common cause of errors when you type make is improper kernel-source. Either the kernel-source is not installed, or it doesn't match the running kernel's version, please re-check your kernel-source installation and the contents of your /usr/src/linux-`uname -r` directory. Some distro's "Updates" can leave your system out-of-sync, see your distro's homepage/forums for help on this. Remember, this guide applies only to version 0.2.0pre8_plus_fixes_6 of the acx100 source, and no other versions, neither older or newer.
Another commonly received error looks like this:
Kernel configuration found, performing sanity checks All of the following items are required by the driver: Loadable modules support is enabled. Wireless LAN (non-hamradio) support is enabled. Wireless extensions support is DISABLED. The following is needed for PCMCIA/CardBus cards: PCMCIA support is enabled. CardBus support is enabled. The following is needed for USB cards: USB support is enabled. The following is needed for PCI card support: PCI support is enabled. Kernel configuration lacks needed options, please correct! ABORTING. make: *** [config.mk] Error 1
If you get this error and are using a recent distribution along with the default or "stock" kernel, then try issuing this command to add the missing line to your .config file: echo -e '\nCONFIG_NET_WIRELESS=y\n' >> /lib/modules/`uname -r`/build/.config, now try make again.
If you are re-compiling the source, start with make clean and then make, followed by make install
If you get errors like these:
Error for wireless request "Set Bit Rate" (8B20) : SET failed on device wlan0 ; No such device. Failed. Setting channel 8. Error for wireless request "Set Frequency" (8B04) : SET failed on device wlan0 ; No such device. Failed. Trying to join or setup ESSID logout_punk. Error for wireless request "Set ESSID" (8B1A) : SET failed on device wlan0 ; No such device. Failed. Setting key to 022261CF42, algorithm open. Error for wireless request "Set Encode" (8B2A) : SET failed on device wlan0 ; No such device. Failed. SIOCSIFADDR: No such device wlan0: unknown interface: No such device SIOCSIFNETMASK: No such device Interface has been set up successfully. SIOCADDRT: Network is unreachable SIOCSIFMTU: No such device Error in "/sbin/ifconfig wlan0 mtu 576". Bailing...
There are at least 2 possible reasons. First, if you are using a newer 2.6 kernel, then you will need to make one more edit to the start_net script. On line #57, which looks like this:
MODULE_AT="${SCRIPT_AT}/../src/acx_pci.o"
, change acx_pci.o to acx_pci.ko, so that it now looks like this:
MODULE_AT="${SCRIPT_AT}/../src/acx_pci.ko"
, and retry ./start_net.
Second, if you are using a CardBus (PCMCIA) card and see the above errors. Then type: cardctl status, and if it thinks there is nothing in the slot(s), type: cardctl insert, and retry ./start_net.
Similar to the USB driver itself, this section is highly experimental and incomplete, but I can tell you this much: I've used this device for many hours at a time before with no detectable problems. Be aware, although now functional, there is still much work to be done on the USB module and indeed much work is being done by the acx100 team, so things in this section will be changing a good bit as it matures. Having said that, here's how I'm using my dwl-120+.
Since this device is working only in ad-hoc mode, you'll only be able to connect to another wireless device in another machine with it, not to your wireless router or access point. Ad-hoc mode between 2 wireless devices is like using a crosswire cable between 2 wired ethernet devices. Set the "other" machine's wireless device's parameters to: ad-hoc mode, channel 1, 11Mbps, and no WEP (encryption off), and set it to an easy to remember station name (BSSID), for this example, we'll assume it's station name is "adhoc". You should also set it's IP address to a class C network and an MTU of 576, I use 10.0.0.1 for my "other" machine's IP address.
If your DWL-120+ is not plugged in, go ahead and plug it in now. You should still be at the same root console you used earlier to compile and install the modules (drivers). After plugging in your DWL-120+, very little will appear to happen. If you just plugged it in, you should see a message by typing tail /var/log/messages that looks like this: "no modules for USB product 2001/3b01/101", or, if it was plugged in at bootup, you should see a similar message by typing dmesg | less and scrolling through the lines using the up/down arrow keys. At this point in the development of this driver, this is normal and the module does not "auto" load or unload. Now, from your root-console, run modprobe acx_usb, you should see some messages again in tail /var/log/messages and/or tail /var/log/syslog indicating a successful driver load, and hopefully a message listing the "other" machine's wireless device being "found". Now, you'll run iwconfig wlan0 mode ad-hoc essid adhoc using the example name from above. Then set the dwl-120+'s IP address to something on the "other" machine's class C network, following my example above, if my "other" machine's wireless device's IP address is 10.0.0.1, then I'd set my DWL-120+ to 10.0.0.2 like this: ifconfig wlan0 10.0.0.2 mtu 576. Take care to issue these commands in the order listed.
If all goes well you will see a message like this in either /var/log/messages or /var/log/syslog: acx100_complete_dot11_scan: matching station FOUND (idx 0), JOINING (02 00 90 B2 70 4B). At that point you're connected to the other machine. You should be able to ping the "other" machine with this: ping -c 4 -I wlan0 10.0.0.1. You should also be able to go to the "other" machine and ping your DWL-120+ using it's IP address of 10.0.0.2.
If all has gone well, you now have your dwl-120+ nicely connected ad-hoc to another machine somewhere nearby. This is fun, but not all that useful. No doubt what you really wanted was to be able to connect to your wireless router or access point using this device in Linux, warning: this will lock-up the machine, don't attempt it, "Managed" (Infrastructure) mode is coming, but not yet ready. Instead, you can turn your "other" machine into a "wireless ad-hoc router" and use it in a similar fashion. In other words, the "other" machine will receive packets from your dwl-120+ and using another interface, forward them to your normal wireless router or access point, which would then route them to the internet. This machine can be used by other clients in addition to your regular wireless router or access point, or in place of it. Understand that this is a somewhat "advanced" task and will require some time to accomplish, and may not work out for you. If you have a spare machine with an ethernet card and a spare wireless device for it, then this just might be the ticket to use your dwl-120+ for internet. I have tested and used the following setup with my dwl-120+ on kernels 2.4.24 and 2.6.3, strangely, with 2.6.3 being a bit more reliable.
Of course, the "other" machine needs to be running at least a 2.4.x Linux kernel that is ip-forwarding ready as most newer default or "stock" kernels are. The "other" machine need not have a lot of speed or space, mine is a very old Compaq 400cx notebook (dx2/40,256mb hd,28mb ram) running Slackware 9.0 (kernel 2.4.20), using a Belkin F5D6020 wireless pcmcia card and a Linksys PCM-100 wired PCMCIA card as the 2nd device. In order to accomplish this, the "other" machine needs to have a 2nd ethernet device in addition to the wireless device. This can be another wireless device, or a wired device. Either way, the 2nd device needs to be connected normally to your wireless router or access point. My 2nd device is wired and connected via cat5 to one of my wireless router's 10/100 ports.
You'll need to set the 2nd device up as normal and verify that you can ping a site on the internet by name with it. The wireless device should be set up the same way as described above for an ad-hoc connection and again, you'll want to verify that you can ping back and forth between it and your other machine with the dwl-120+ in it.
Next, you'll want to see the IP Masqerading HowTo and learn about how to enable ip forwarding on the "other" machine, which basically is running a single script. I'm using a very slightly modified version of the example script listed in that howto, here's my rc.forward script. After that, you'll want to name the "other" machine as the nameserver for your dwl-120+, by adding a line: nameserver 10.0.0.1 to the dwl-120+'s machine's /etc/resolv.conf. You may also want to add a line: nameserver 192.168.1.1 as well where the ip address is that of your normal wireless router or access point.
Here's what my "other" machine's setup looks like after everything has been configured, atml0 is the wireless device ad-hoc'd to my dwl-120+, eth0 is the 2nd interface connected to one of my wireless router's 10/100 ports:
root@contura:~# ifconfig atml0 Link encap:Ethernet HWaddr 00:30:BD:D0:76:D4 inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0 UP BROADCAST RUNNING MULTICAST MTU:576 Metric:1 RX packets:161421 errors:18 dropped:0 overruns:0 frame:0 TX packets:158900 errors:483 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:64048193 (61.0 Mb) Interrupt:3 Base address:0x120 eth0 Link encap:Ethernet HWaddr 00:04:5A:9D:86:E2 inet addr:192.168.2.20 Bcast:192.168.2.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:336866 errors:0 dropped:0 overruns:0 frame:0 TX packets:160420 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:121687523 (116.0 Mb) TX bytes:13839700 (13.1 Mb) Interrupt:5 Base address:0x300
root@contura:~# iwconfig atml0 ATMEL REVE ESSID:"adhoc" Mode:Ad-Hoc Channel:1 Cell: 02:00:0B:C8:D1:0A Bit Rate:11Mb/s RTS thr=2347 B Fragment thr=2346 B Encryption key:4372-6169-6752-756C-6573-596F-75 Encryption mode:restricted Link Quality:0 Signal level:0 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
root@contura:~# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface localnet * 255.255.255.0 U 0 0 0 eth0 10.0.0.0 * 255.0.0.0 U 0 0 0 atml0 loopback * 255.0.0.0 U 0 0 0 lo default wrouter 0.0.0.0 UG 0 0 0 eth0
Here is what my dwl-120+'s setup looks like:
root@Slack91:/lib/modules/2.6.3/kernel/net# ifconfig wlan0 wlan0 Link encap:Ethernet HWaddr 00:40:05:57:27:43 inet addr:10.0.0.2 Bcast:10.255.255.255 Mask:255.0.0.0 UP BROADCAST RUNNING MULTICAST MTU:576 Metric:1 RX packets:13124 errors:0 dropped:0 overruns:0 frame:0 TX packets:13243 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:5374220 (5.1 Mb) TX bytes:1272888 (1.2 Mb)
root@Slack91:/lib/modules/2.6.3/kernel/net# iwconfig wlan0 wlan0 IEEE 802.11b+ ESSID:"adhoc" Nickname:"acx100 v0.2.0pre8.6" Mode:Ad-Hoc Channel:1 Cell: 02:00:0B:C8:D1:0A Bit Rate=11Mb/s Tx-Power:20 dBm Retry min limit:5 RTS thr:off Encryption key:4372-6169-6752-756C-6573-596F-75 Security mode:restricted Power Management:off Link Quality:54/0 Signal level:-217 dBm Noise level:-255 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0
Once this is all set up, try pinging a site on the internet by name using your dwl-120+: ping -c 4 -I wlan0 yahoo.com. Yes, it's some work and requires a spare machine and a couple of devices, but it's the only way so far that I know of to use the dwl-120+ for internet. I've been able to use this setup with both WEP 64bit and WEP 128bit on both 2.4 and 2.6 kernels, strangely, with 128bit being more reliable.