Installing a Conexant PCI ADSL modem on Debian Sarge 2.6

Conexant-based PCI ADSL modems are now very low in price - I've just (October 2006) bought several from ADSL Nation in the UK for about £15.00 each. I wanted a Linux-based router/firewall with ADSL connectivity and since the things are allegedly usable with Linux that was what I chose.

Making them work took longer than I expected but it's done now. As a note to myself and anyone else wanting to do the same, here is my step-by-step guide to installing them on Debian Sarge with a 2.6 kernel. You are going to have to build a custom kernel and a set of drivers from source - set aside 2-3 hours.

Step 1 - install the hardware device and Debian

I installed Sarge from the net install disk, selecting only basic server functionality - core kernel, web services and DNS, choosing the 2.6 kernel (by typing 'linux26' to the installer prompt) and did the usual stuff to install Debian. Following the install, apt-get dist-upgrade was done to ensure everything was up to date.

The PCI modem was in the box at this point. Logged in as root, lspci showed two lines containing the following:

0000:00:14.0 System peripheral: Conexant ADSL AccessRunner PCI Arbitration Device (rev 01)
0000:00:14.1 ATM network controller: Conexant AccessRunner PCI ADSL Interface Device (rev 01)
Initially that wasn't the case and I wasted a lot of time trying to make the device work. It looks as if that was due to it being incorrectly seated in the PCI slot (aaagh). Substiting it with another one fixed the problem, then replacing the original also gave the correct behaviour. If you don't see two lines looking very similar to the above, you will have a problem.

Step 2 - Install the stuff you are going to need

Following instructions from the invaluable sources listed below, the next step was to install various things I either knew I'd need or was told I'd need. The kernel sources are installed as a bzipped tar archive, so you will need to un-tar them. The driver-building process expects the kernel headers to live under /usr/src/linux so I created a symbolic link to the now-unpacked source tree, as shown:

apt-get install libatm1 libatm1-dev bzip2 kernel-tree-2.6.8 libncurses-dev kernel-package
cd /usr/src
tar xfj kernel-source-2.6.8.tar.bz2
ln -s kernel-source-2.6.8 linux
This is a rather long-in-the-tooth kernel now; perhaps I should have picked a later one, but I didn't.

Step 3 - build a custom kernel

If the ADSL driver wasn't so fussy about the kernel it's built for this would be unnecessary but you have no option. I copied the kernel configuration that's stored in the /boot area into the kernel tree and edited it by hand to turn off the kernel PREEMPT option. These notes here are from memory so don't just copy and paste them, check that the filenames are correct on your system!
# cd to the source  directory
cd /usr/src/kernel-source-2.6.8
# Copy the existing kernel configuration for use by menuconfig
cp /boot/config-2.6.8-2-386 .config
# At this point I used a text editor on .config to turn off CONFIG_PREEMPT
# then used 'menuconfig' to choose a 586 processor type and then saved the configuration
make menuconfig
# Build the new kernel (this takes quite a long time, about 3 hours on the low-powered VIA motherboard I used)
make-kpkg --initrd --revision=custom.1.0 kernel_image
cd ..
# Install the newly-build kernel package
dpkg -i kernel-image-2.6.8_custom.1.0_i386.deb

Step 4 - download the ADSL driver software

NOTE NOTE NOTE: this document originally contained a link to Patrick Mackinlay's site as mentioned in this highlighted section:
Download the driver software package from Patrick Mackinlay's site and unzip it, then make the driver:
but I am told that the maintenance of that driver has been taken over by Vincent Zweije. To preserve historical accuracy I have retained the outline above unchanged, however the new link for the driver is Vincent Zweije's site.
tar xjf driver-2.6-latest.tar.bz2
cd CnxADSL-
The driver expects a RedHat layout of your /etc/init.d stuff so you have to fake what it expects before doing the make install and then move the startup script by hand afterwards.
mkdir -p /etc/rc.d/init.d
make install
mv /etc/rc.d/init.d/cnxadslctl /etc/init.d
rm -rf /etc/rc.d
The startup script (cnxadslctl) contains another RedHat-ism, so find the two lines in /etc/init.d/cnxadslctl reading
# Source function library.
. /etc/init.d/functions
and remove them - the script doesn't appear to need them.

You are almost finished now. You have built the kernel and installed the driver modules. Reboot your system and start the new kernel (grub will default to the old one, so edit /boot/grub/menu.lst and change the default kernel).

Configure PPP

There are various ways you can set up your pppd configuration but I did the following

In /etc/init.d/cnxadslctl change the line that starts pppd to read pppd file /etc/ppp/adsl, then create the file /etc/ppp/adsl with the following contents:

name [Your user name]
user [Your user name]
[Your password - note on line below 'password']
plugin /usr/lib/pppd/2.4.3/
holdoff 4
maxfail 0
The 0.38 above is the VCI/VPI combination needed for your provider, 0.38 is what's used in the UK, but I've seen 0.100 used in New Zealand.

Start the ADSL link

Having done all that, with the ADSL line plugged in to the card
/etc/init.d/cnxadslctl start
brought up the link to my ISP and all appeared to be working. To automate the startup script on boot you might like to try update-rc.d cnxadslctl 14.


All I have done is to copy with some minor alterations the information from the following sites, to which I'm hugely indebted