This howto assumes that you have the usual tools installed to compile a package from source and also the patch package.
1: Purpose
The iwl3945 driver and unicode have been problematic for many users who were happier with the reliable but now deprecated ipw3945 driver and userspace daemon. I had been tolerably satisfied until recent updates to the iwl3945 firmware left me with frequent disconnections and timeouts, CPU spikes, browser crashes, occasional complete crashes of X and even a kernel oops.
I resolved to try the old ipw3945 driver. I've been successful in this, I now have a fully functional and reliable 3945ABG wireless adapter with working LED, stronger signal, reliable scanning and no panics. Just like old times except I'm using kernel 2.6.25-2-686
Here's how to do it
2: Obtain the necessary packages:
The old Debian driver package won't work on kernels 2.6.24 and newer so we'll build the driver from the Intel package available at http://ipw3945.sourceforge.net/downloads.php Download the newest version which is 1.2.2
Also download the unicode from http://bughost.org/ipw3945/ucode/ipw3945-ucode-1.14.2.tgz
We'll also need a patch which will enable the driver to build on the newer kernels. Go to http://james.colannino.org/downloads.html and download ipw3945-1.2.2.patch.
And finally download the old Debian ipw3945d package from http://snapshot.debian.net/archive/2007/08/06/debian/pool/non-free/i/ipw3945d/ipw3945d_1.7.22-5_i386.deb
3: Install the unicode
Unpack ipw3945-ucode-1.14.2.tgz
As root:
- Code: Select all
# cp ipw3945.ucode /lib/firmware
4: Patch and build the driver
Unpack the driver tarball ipw3945-1.2.2.tgz. Copy the patch file ipw3945-1.2.2.patch into the directory ipw3945-1.2.2. We can now patch the driver so it will build on our newer kernel:
- Code: Select all
$ cd ipw3945-1.22
$ patch ipw3945.h ipw3945-1.2.2.patch
Now we can build the driver. I used checkinstall to make a deb package for me and to automatically install the driver.
- Code: Select all
$ make
and as root:
- Code: Select all
# checkinstall
If you prefer not to use checkinstall you can simply use make & make install instead
Now we have the unicode and the driver installed, it's time to install the userspace daemon.
5: Install the ipw3945 daemon
The old Debian package is preferred to Intel's source package for the following reasons:
a) The daemon needs to run with root privileges in userspace. This is a poor idea. Fortunately the Debian package solves this problem by automatically creating a special user and group Debian-ipw3945d. This special user has no access to a shell and is only able to run the ipw3945d. This is much safer than having the daemon run with full root privileges.
b) The Debian package creates the necessary startup scripts, modprobe.d file, logrotate script, and installs the docs/man page to the correct place. Everything is automatically in the right place and has the right permissions.
c) It's easy and it works
Change to the directory containing your downloaded ipw3945d_1.7.22-5_i386.deb and as root:
- Code: Select all
# dpkg -i ipw3945d_1.7.22-5_i386.deb
We now have the driver, the unicode and the userspace daemon successfully installed. The next step is to make sure the ipw3945 driver loads at boot in preference to the iwl3945 driver.
6: Blacklist iwl3945
iwl3945 is a kernel module so simply adding it to /etc/modprobe.d/blacklist will not prevent it from loading. Instead we create the file /etc/modprobe.d/00local as root:
- Code: Select all
# touch /etc/modprobe.d/00local
and add the following lines to it
- Code: Select all
#disable iwl3945 to allow ipw3945
install iwl3945 /bin/true
and save.
7: Nearly done!
Reboot, connect, enjoy
Disclaimer: I'm no expert so following this howto is done at your own risk. However, everything is fully and easily reversible as my method uses deb packages to install the driver and the userspace daemon which can be purged using your preferred package manager. To remove the unicode is as simple as deleting the file in /lib/firmware and to re-enable iwl3945 is as easy as deleting the file /etc/modprobe.d/00local.
As far as I can tell the only issue anyone might have will be in running make to build the driver. If this fails please ensure you have the packages build-essential and checkinstall installed and also the linux-headers package for your kernel.