Configuring Slackware to Work With Orinoco PCI-PCMCIA

The Situation

I have a Lucent Orinoco Silver card that works great in my Windows notebook. It has an external antenna connector that I use with a commercial magmount omni antenna, and also with a homemade omni and a cantenna. Now I wanted to use the card and a cantenna and AirSnort to try cracking the WEP on my home wireless network. I only have one notebook and I didn't want to tie it up for a week, so I decided to use an old desktop. I got a Dell 400MHz Celeron at the county surplus store, and an Orinoco PCI-to_CardBus card so I could use the Orinoco card in the PC. I began working with my install CDs for Slackware 8.0 and various versions of pcmcia drivers. I had some success, but could not get it working fully. I was just floundering around trying different things, but not really keeping any records. I decided to start again and write down what I was doing, so that I would be able to repeat it. I would start by just trying to get linux to recognize the card. I would worry later about patched drivers and promiscuous mode and AirSnort.

Step 1 - Start from scratch

Do a clean Slackware install. I'm using the Slackware 8.0 CDs. I only access the machine via the console or telnet, so I don't use any of the X stuff. The only packages I use are A, AP, D, F, K and N. I only install the 2.4.5 kernel, modules and source, not the 2.2.19. You might be able to skip this step, but I did it so I would know for sure what I was working with. I re-did the install a couple times while figuring all this out, when I felt like I had installed too many additional drivers and utilities while trying different things. It only takes 15 minutes or so for a complete install.

Step 2 - Modifications for the PCI Adapter

I installed the PCI-to_CardBus card, plugged the Orinoco card into it, and booted the PC. Lots of errors in /var/log/messages. With the cardctl ident command I could see that the system knew a card was present, but nothing else. Inserting a PCMCIA-Compact Flash card gave the same info as the Orinoco card. At least I could use cardctl eject and cardctl insert to get the card in and out.
Apparently the Orinoco PCI adapter is not quite standard. It uses the TI 1410 chip as a PCI-to-Cardbus bridge, which is compatible with the i82365 chip, which is the most common one, so no problem there. But it has some kind of non-standard high memory mapping. I'm assuming the memory mapping is for control registers or packet queues or something like that. In the /var/log/messages file the PCMCIA code generates a line that says:
TI 1410 rev 01 PCI-to-CardBus at slot 02:0a, mem 0xfb000000
I finally realized that I should use this info to change the high memory arguments in /etc/pcmcia/config.opts. At first I just used 0xfb000000-0xfbffffff, but after seeing some more errors in the message file I ended up changing it from:
include memory 0xa0000000-0xa0ffffff, memory 0x60000000-0x60ffffff
include memory 0xfb100000-0xfbffffff

In the same way I found I had to change the low memory from
include memory 0xc0000-0xfffff
include memory 0xc8000-0xcffff, memory 0xd8000-0xdffff

I also found I had to change the ports, again using error messages from /var/log/messages. I changed them from:
include port 0x100-0x4ff, port 0x800-0x8ff, port 0xc00-0xcff
include port 0x3e0-0x4cf, port 0x4d8-0x4ff, port 0x00-0xcff

Step 4 - The Wireless Tools

Now I could see the card using cardctl ident, and the wvlan_cs driver was automatically loading. I got error messages from somewhere (I forget where) suggesting that I use iwconfig instead ofifconfig to configure the card. So I did a google and found the Wireless Tools for Linux . I downloaded them and followed the instructions to make and install them, and found that with iwconfig I could see the wireless card and do some configuration to it. But I got a bunch of errors telling me I was using an out-of-date driver. It was time to get the right driver.

Step 5 - The Right Driver

I had seen references to an orinoco_cs driver while I was researching AirSnort. That seemed to be the one I needed. I knew I was going to have to patch the driver eventually, so AirSnort could put the card into promiscuous mode, but for now I just wanted the card to work normally. I looked in /lib/modules/2.4.5, but I didn't see an orinoco_cs driver there. It was understandable, I'm still using Slackware 8.0, and 8.1 has been out for a while.

Okay, where would I find the driver? AirSnort pointed me to the PCMCIA CS package. I pulled down the latest package and put it in /usr/src. Reading over the READMEs seemed to say the drivers would only be built if PCMCIA_CONFIG was defined in the kernel source. I looked and found references to PCMCIA_CONFIG in the kernel Config file, so it looked like it was defined. I did a make config in the pcmcia cs package directory, and accepted the defaults, except for no 32-bit (CardBus) support. Then a make all and make install. During the make install I was getting errors when the install script ran depmod against the parport_cs.o module. I'm not really sure what that means. So I moved parport_cs.o and parport_cs.o.gz to /tmp while I ran depmod, and then I moved them back. Is that so wrong?

Time for a reboot. I guess some of this stuff will start running without a reboot, but if the OS is already running and using drivers, I figure a reboot will make sure the old drivers are unloaded. I had been working out in the carport, where the PC was set up on a workbench, but by now I had moved inside. I had run an ethernet cable out to the carport, so I could log into the PC that way. I checked the /var/log/messages file. No errors there, but iwconfig showed that the wireless card was no longer configured as eth1. The cardctl command could still see the card, and the orinoco and orinoco_cs drivers were loaded when I checked with lsmod, but the card was not longer configured. What had happened? The syslog file had an error saying:
kernel: eth1: failed to reset hardware (err = -19) so maybe a power cycle would help. No, that didn't do it. I see, I got the part about PCMCIA_CONFIG backward. Okay, first try configuring the pcmcia-cs package to use the kernel source for configuration. That got it to build without the parport error. Maybe that should have been a clue.

Okay, keep reading the documentation. Wait, here's a question by a guywho can't get the wireless tools to work. Someone suggests using a new kernel, which gets me thinking. So I go to the Slackware site and look at the 8.1 release. The release notes says there is greatly improved support for PCMCIA, to the point where any card plugged in should work without configuration. Sounds good to me. I start downloading the CD ISO from SourceForge and take a shower.

Long story short, I end up downloading ISOs for both Slackware 8.1 and for the previous nights version of Slackware. The second came from this site, which seems to make a nightly ISO available. Very cool. The next morning I burned a CD of Slackware 8.1 and left it installing while we went out to read the paper at by the beach. Came back, same basic problems. Fine, burn a CD of the latest and install it. Same basic problems. Hmmm. Now what?

Now we go down to the Renaissance Fair and spend the afternoon there, and then I go to a friend's house for a barbecue, then come back here. Well, the best I did before was to actually get things working to the point where the iwconfig command would see the card, and be able to change some things on it. I haven't been able to do that since I started writing this page. I think I may have gotten that working after I stated using the standalone pcmcia modules. With my current install I am think I am still using the kernel modules. Let's try installing the standalone pcmcia modules.

Step 6 - The Right Kernel

I have the very latest Slackware kernel installed. This is my baseline so far. I put on 3.2.3 pcmcia-cs source and run make config again, selecting the option of taking kernel configuration from the running kernel. I get an output message saying thatthe running kernel has PCMCIA driver support compiled in, so make all will make the utilities but not the drivers. Okay, try it taking configuration from the kernel source. Same result. Guess I'll have to configure and build my own kernel. I always hate doing that because there are so many config questions. There must be a way to change just one param without going through the whole script. Okay, I have disabled ISA support, which I better remember if I add an ISA-PCMCIA card. More importantly, for the PCMCIA/CardBus support option I answer 'm', which should enable loadable modules. Not sure if I should be saying 'm', or 'n', to disable PCMCIA altogether. We'll see. I also answer 'n' to CardBus support, because that's for 32-bit PCMCIA, and I am just using 16-bit. I answer 'n' to bridge support for i82365 as well. For everything else I just take the defaults. Run make config in the pcmcia directory again, and it still says it won't build the drivers. Go back and configure the kernel again, explicitly answering 'n' to the PCMCIA support, and at last the pcmcia code says it will build the drivers. Now build the kernel. Argh, now I'm getting include file errors when I run make dep. Reboot off the install CD and reinstall the kernel source. Try running make dep. No go. This sucks. Okay, let's reinstall the latest Slackware ISO, and see if I can build a kernel off a clean install.

I did do one thing different on this install, I included the new L package of libraries, which are needed by gnome and kde. Probably doesn't make a difference, but I will try it. If this doesn't work I guess I am going back to the Slackware 8.1 release. While this install is running I have found a new web page with a lot of info on running the Orinoco card and the TI 1440 chip with linux. Okay, fresh install finished. Let's run make dep in the linux source directory and see what happens. Works. Now a kernel build and install and boot. I'm wondering now if configuring the standalone pcmcia-cs source is what screwed things up? That took a while. First I had to keep unconfiguring things in the kernel so it would all fit in bzImage (never seen that problem before). Then I had to figure out that /etc/lilo.conf was looking for vmlinuz in the boot directory, not in /. Then I configured and make and installed the standalone pcmcia package, but it failed during the install on depmod in some of the kernel modules in /lib/modules/2.4.5/. Maybe this is because those modules are left over from the original install, and the kernel that I built has them deconfigured. So I deleted everything in the module directory and did a make modules in /usr/src/linux. When that finishes I will make and install the standalone pcmcia stuff again and see if it succeeds.

Still fighting with it. Installed the kernel modules, installed the standalone pcmcia modules, rebooted, still don't have an eth1 device. I can't recall how I got that far way back when I started this. I bought an ISA-PCMCIA card on eBay tonight, so I am thinking about taking a break from this until it gets here. Maybe it will fix all my problem. And maybe not. I copied the /etc/rc.d/rc.pcmcia.N file that the standalone pcmcia stuff installs, into /etc/rc.d/rc.pcmcia, and rebooted. Let's see what happens... Failed again. "eth1: failed to reset hardware (err = -19)". Darn.

I was reading over the PCMCIA man page for the umpteenth time, when I re-read the part about needing to pass the "irq_mode=0" argument to the i82365 module, and I realized that setting the PCIC_OPTS variable in /etc/pcmcia/config.opts wat not the way to do it. Instead I looked around for a while and found I had to add a line to the /etc/pcmcia/config.opts file:
module "i82365" opts "irq_mode=0". Reboot and let's see what happens... No, that wasn't it. On closer reading of the doc, it is the PCIC_OPTS line. But it may that I didn't have the argument in quotes. Now I'm grasping at straws. Reboot and let's see... Nope.

Step 7 - Set The Wayback Machine

Well, this worked when I first started. Or at least it worked to the point where I could see the card with iwconfig. How can I get back to that point? I'm starting to suspect that I haven't been setting the PCIC_OPTS since I had it "working". So tomorrow I will re-install Slackware 8.0, modify the config.opts and rc.pcmcia files, and see if that gets me back to where I was. If that doesn't do it, I'll install the standalone pcmcia stuff. If that doesn't work, I'm quitting until the ISA-PCMCIA card arrives.

Did some serious hacking, with no luck. The reason that things sort of worked when I first tried this may be because I was using a 2.2x kernel from Slackware 8.0. Things might have been different back then. And the iwconfig didn't really work, it just let me set some of the parameters on the card. I have done a bunch more installs and builds with no luck. So now I'm just waiting on the ISA-PCMCIA card.

Step 8 - Semi-Breakthrough

When I first tried the card/adapter combo I tested it by putting it in a Windows XP machine. Worked fine. Then I started using it in this linux box. So last night I put the card/adapter back in the Windows XP machine, and swapped an old 4Gb drive into the XP machine so I could do a quick Slackware install. When I booted into Slackware, it recognized the card! Woo hoo! My ISA-PCMCIA adapter should arive today, so first I will try it in the surplus linux box. If that works, fine. Otherwise I will have to juggle some machines. The Windows XP machine's only purpose in life is to act as a print server for my HP deskjet. So I guess I will install XP on the linux box, and swap the two machines.

Step 9 - When All Else Fails, Try Different Hardware

I got the ISA-PCMCIA card Friday, and just had time to play with it for a short time. I installed it and booted it with the standard Slackware 8.1 install, and linux recognized the card and let me access it with iwconfig. I was able to set the essid, hit my AP, and get an IP address via DHCP. When I get back I will start over at step one of this saga, by recompiling the kernel without PCMCIA support, adding in the pcmcia-cs standalone package, adding in the latest wireless tools. At that point I should be able to configure the card. Then add in the orinoco driver patches for promiscuous mode, and then, finally, start working with Airsnort. I think I'll start a new page for that. See if this link works yet.

Anybody want to buy a PCI-PCMCIA adapter cheap?

Update: I was in the BIOS of the Dell, and I noticed a configuration option for APCI, and that it was set to OFF. I have read during my googling for answers that the PCI-PCMCIA card problems may be related to APCI. It might be worth a try to turn on APCI and put the PCI-PCMCIA card back in, and see if it works. But I have the ISA-PCMCIA card now, so that is not a priority.