This page documents my experiences installing, configuring and using SuSE Linux 9.1 on an IBM Thinkpad R40.

NOTE: Almost all of the information on this page is obsolete. I've left it online mostly as a historical record.


  • 08-10-2004: Added info on KMilo fix.
  • 02-10-2004: Added Suspend to Power Management (Thanks to Frank Schmitt!). Fixed links to Pascal's site.
  • 30-09-2004: Changed 'cat' to 'echo' in tp-scroll section (Thanks to John Mort!). Added CC license link.
  • 01-09-2004: Added info on disabling check for signed rpms.
  • 12-08-2004: Initial version.


I've been a Mandrake user since 2001. But over the years, I've been increasingly frustrated with their QA issues. There's nothing to complain about as far as the basic plumbing in the distribution goes - install works fine, applications are well selected, most devices work as expected. It's the minor things like broken menus, bugs in packaging, etc. which mar the day to day usage experience. I tried Fedora, Xandros, Lycoris, Debian, even Lindows :-D but kept coming back to Mandrake because of their desktop focus, good package management (urpmi) and wide range of readily available software through contrib and plf. When SuSE released a download iso of their 9.1 version, I decided to give SuSE a shot too. Except this time, I've decided to document the whole thing.

System specs

This is an IBM R40 Thinkpad, model 2723-NA1 built on the Centrino platform.

  • Pentium M 1.5 GHz
  • 384 MB DDR SDRAM
  • 40GB 4200rpm Fujitsu HDD
  • 14.1 XGA(1024x768) TFT LCD
  • 16MB ATI Radeon Mobility M6 LY
  • Matshita 24x/10x/24x/8x CD-RW/DVD
  • Intel Pro 802.11b WiFi MiniPCI
  • 10/100 Ethernet

There's also an onboard modem (I think Intel) which I've no use for (yet) and hence haven't bothered looking at. The same goes for the Infrared port. There's no bluetooth on this model - something I could actually use :-(

Here's the lspci output:

antrix@linux:~> lspci
0000:00:00.0 Host bridge: Intel Corp. 82855PM Processor to I/O Controller (rev 03)
0000:00:01.0 PCI bridge: Intel Corp. 82855PM Processor to AGP Controller (rev 03)
0000:00:1d.0 USB Controller: Intel Corp. 82801DB USB (Hub #1) (rev 01)
0000:00:1d.1 USB Controller: Intel Corp. 82801DB USB (Hub #2) (rev 01)
0000:00:1d.2 USB Controller: Intel Corp. 82801DB USB (Hub #3) (rev 01)
0000:00:1d.7 USB Controller: Intel Corp. 82801DB USB2 (rev 01)
0000:00:1e.0 PCI bridge: Intel Corp. 82801BAM/CAM PCI Bridge (rev 81)
0000:00:1f.0 ISA bridge: Intel Corp. 82801DBM LPC Interface Controller (rev 01)
0000:00:1f.1 IDE interface: Intel Corp. 82801DBM Ultra ATA Storage Controller (rev 01)
0000:00:1f.3 SMBus: Intel Corp. 82801DB/DBM SMBus Controller (rev 01)
0000:00:1f.5 Multimedia audio controller: Intel Corp. 82801DB AC'97 Audio Controller (rev 01)
0000:00:1f.6 Modem: Intel Corp. 82801DB AC'97 Modem Controller (rev 01)
0000:01:00.0 VGA compatible controller: ATI Technologies Inc Radeon Mobility M6 LY
0000:02:00.0 CardBus bridge: Texas Instruments PCI1510 PC card Cardbus Controller
0000:02:02.0 Network controller: Intel Corp. PRO/Wireless LAN 2100 3B Mini PCI Adapter (rev 04)
0000:02:08.0 Ethernet controller: Intel Corp. 82801BD PRO/100 VE (MOB) Ethernet Controller (rev 81)


The first step was, of course, to download the SuSE iso and burn a disc. Next step, backup important data! Yes, I actually do backups from time to time now, especially after a very frustrating data loss incident. With that step taken care of, it was time to start the install.

I have /home on a separate partition. So whenever I install Linux, I just format / and reuse the old /home. I decided to do the same for SuSE. SuSE's install is a no-brainer and it finished smoothly. However, I realized after I booted into my new install that my old /home had been mounted in /data1 while a fresh /home directory had been created. I could've instructed SuSE to use the proper partition during setup using the advanced options, but this isn't such a big deal. A quick fix in /etc/fstab took care of this issue.

A more important thing here, in case you haven't already installed SuSE, is to choose the non-ACPI install option before setup starts. ACPI on this model is broken (as I'll detail later) and choosing non-ACPI at the outset will save you some configuration trouble later.

I chose not to install any of the video players during setup since I would anyway be installing the latest versions with all codecs, dvd decryption capability, etc.


One of the things you should consider doing is to setup apt4rpm for SuSE. Doing this gives you a wider selection of rpms to choose from as there are quite a few people who contribute packages to the repositories. Also, you get the benefit of a command line package installer which can handle dependencies (command line 'yast' doesn't handle them properly).

I followed the steps given by Pascal Bleser who, by the way, maintains an excellent repository himself. This is what my /etc/apt/sources.list looks like:

rpm SuSE/9.1-i386 base update security kde gnome mozilla xfree86 packman packman-i686 suser-guru suser-rbos

The base, update and security repositories correspond to the official SuSE versions. The kde, gnome, mozilla, xfree86 repositories correspond to the updated 'unofficial' rpms in The packman repositories, of course, hold packages from Guru is the repository maintained by Pascal over here. The last one chiefly holds updates to the apt packages themselves.

After your sources are configured, you should run apt-get check followed by apt-get update && apt-get upgrade. That will get your system up to speed in a few hours (depends on your net speed!) I have been running updated versions of KDE, Firefox, etc. installed using this method and haven't had any problems yet. I suspect SaX2 got broken in an upgrade but since I don't use it anymore (see 'Graphical Subsystem') I couldn't care less. You could prevent SaX from getting an upgrade by dropping xfree86 from the repository list.

Update 01-09-2004: I wonder how I missed mentioning this earlier, because you are sure to run into missing signature errors when trying to install packages from these unofficial sources. Unlike Pascal, not everyone signs the packages (s)he builds. This means you can't import their signatures and your package installation will error out because of invalid/missing signatures. To disable signature checking, edit /etc/apt/apt.conf.d/gpg-checker.conf and change the line GPG::Check true; to GPG::Check false;. This isn't a big security issue if you are sticking to these fairly well known repositories.

The thing about this system is that it doesn't break YaST since it works with the common rpm database. So you can continue using YaST to install rpms, YOU to get security updates and Synaptic to install packages from packman, etc whose sources you can't add to YaST. A good idea would be to add the sources of supplementary kde, gnome, etc to YaST too, as described here.

Now you can install whatever packages you want! Two things I would like to mention. An easy way to install mplayer and related things, including the win32 codecs, is to use apt-get install Mplayer-suite. This is a meta package which pulls down all associated packages, assuming you have suser-rbos, packman and packman-i686 in your sources list. This will still not install the decss bit which you will need if you wish to watch encrypted DVDs on your laptop. Due to legal issues, you have to follow a different procedure, described here, to get libdvdcss. I probably violated the DMCA by linking to that site. But what the heck, I am not living in the US ;-)

Graphical Subsystem

This IBM machine has the first of the ATI Mobility Radeons chipsets (M6) based on, I think, the rv100 core. Thus, although the card gives good 2D performance, it's 3D capabilities are very lackluster. I used the XFree supplied 'radeon' driver and asked YaST to enable the 3D options for me. The LCD's sync rates were wrongly detected and I had to set them myself.

One strong word of caution: if you ever edit XF86Config by hand, don't run SaX2 ever again! It just ignores your changes and overwrites settings as it sees fit. I had to edit the file by hand to configure tp-scroll and then, when I ran SaX2 sometime later, it just recreated the default settings! This is not only unfortunate but also unacceptable. Mandrake's XFdrake worked much better - both in detection/configuration of settings and compatibility with hand made changes.


The touchpad and trackpoint worked out of the box. The touchpad was correctly detected as a synaptics device and configured accordingly with clicks, scroll, etc. working properly. The trackpoint also worked, mostly. I love the UltraNav feature on these laptops - you press the middle mouse button and then moving the trackpoint up and down sends window scroll events. This is achieved by the IBM driver in Windows. Unfortunately, in Linux, the trackpoint is configured as a generic mouse and as such, doesn't support these fancy features.

Thankfully, Daniel Sachs has written a program called tp-scroll which achieves the same affect. On his site, you'll find the original tp-scroll.c which enables vertical scrolling and a tp-scroll-patched.c which enables both horizontal and vertical scrolling. I suggest you get the patched version. Do the following to get this working

#gcc -lm -o tp-scroll tp-scroll-patched.c
#cp tp-scroll /usr/local/bin
#mkfifo /dev/imouse
#echo "nice -n -10 /usr/local/bin/tp-scroll /dev/mouse /dev/imouse &" >> /etc/init.d/boot.local

Then you need to edit your /etc/X11/XF86Config file and modify the mouse section corresponding to the trackpoint to look something like this:

Section "InputDevice"
 Driver       "mouse"
 Identifier   "Mouse[1]"
 Option       "Buttons" "7"
 Option       "Device" "/dev/imouse"
 Option       "InputFashion" "Mouse"
 Option       "Name" "PS/2-Mouse;ExplorerPS/2"
 Option       "Protocol" "ExplorerPS/2"
 Option       "ZAxisMapping" "6 7"
 Option       "Emulate3Buttons" "true"
 Option       "EmulateWheel" "false"

and the ServerLayout section should have something like

InputDevice  "Mouse[1]" "CorePointer"
InputDevice  "Mouse[3]" "SendCoreEvents"

where Mouse[3] corresponds to the touchpad.

Doing all this got horizontal and vertical scrolling working for me, but with a surprising 'special effect.' The scrolling actions got swapped - moving the trackpoint top/down caused horizontal scrolling and vice-versa! I wrote to Daniel about this problem and he asked me to modify the tp-scroll-patched.c as follows:

242: y = (-1)*getc(in); /* was x = getc(in); */
243: x = (-1)*getc(in); /* was y = getc(in); */

Thanks to Daniel's help, I now have a fully working UltraNav system! Note that tp-scroll-patched.c defines the mouse pointer acceleration factor at compile time. Hence, you should set this acceleration to 1x in KDE's Control Center (Peripherals >> Mouse >> Advanced). If you don't do this, you'll see erratic pointer behavior since you'll be getting acceleration more than you can handle!

Firefox (also Mozilla?) has some problem with using the middle mouse button for scrolling since that action maps to 'Back' and 'Forward' by default. You can fix it by setting the following keys (type about:config in URL bar or add to prefs.js by hand). The last three keys are not needed, I set them to prevent loading clipboard text as URL, something a middle mouse press tends to trigger (on Linux: middle mouse click == paste!).

user_pref("mousewheel.horizscroll.withnokey.action", 0);
user_pref("mousewheel.horizscroll.withnokey.sysnumlines", true);
user_pref("middlemouse.contentLoadURL", false);
user_pref("middlemouse.openNewWindow", false);
user_pref("middlemouse.scrollbarPosition", false);

Power Management

Update 01-09-2004 Definitions: There's some confusion regarding the use of the terms suspend, standby, etc. The functionality each of these modes provides is often inconsistent between manufacturers and OS vendors. To further muddle up the scene, ACPI brings with it a new set of terms. In order to prevent confusion, let me be clear by saying:

  • Blank means low power savings - usually just LCD off.
  • Standby means save session state to RAM and power down. This is often called Suspend to RAM (STR)
  • Suspend means save session state to disk and power off. This is often called Suspend to Disk (STD) or Hibernate

You can read more about the various definitions in the file /usr/share/doc/packages/powersave/README.suspend

On of the biggest pleasures of installing SuSE has been the fact that almost everything works right out of the box. Devices are not just detected, but properly configured as well. In Mandrake, I had to do spend a lot of time to get cpu frequency scaling going, but in SuSE, it just works.

At first, I chose the regular ACPI install. SuSE automatically loaded the battery, thermal, etc. modules and also configured the system to throttle cpu frequency when the machine is no longer on AC power supply. The battery gauge worked properly and so did cpu throttling. The trouble started when I wanted to use the standby and suspend options.

SuSE has a very good power management subsystem, miles ahead of Mandrake's and I suspect better than that of any other distro out there. They have a 'powersave' package which is the sole configuration point for power management and cpu throttling. The package has a powersaved daemon which replaces the cpufreqd, apmd and acpid daemons. Whatever be your backend - APM or ACPI, you use the same package and configure settings using the same YaST panel.

Now in Mandrake, when I used the Blank (Fn+F3) or Standby (Fn+F4) options, things worked as expected. In SuSE, when I tried the same, nothing happened. After digging around in SuSE's docs, which are very good, I found out that due to the flakiness of Linux's power management features (as of early 2.6 kernels and before) Standby and Suspend are disabled by default for normal users. You enable them in /etc/powersave.conf by setting


After this, I restarted the powersave daemon and tried Standby. It worked but more than I wanted; the system went into such a standby that no button could bring it back to life! But this wasn't unexpected. I had already seen this behavior once while fiddling with ACPI in Mandrake. The cure to bring the laptop to life was to remove all power sources - AC and battery both. Reconnect the battery and then cold-boot. System powers on with the obligatory fsck, which doesn't take long these days, thanks to reiserfs.

So now I accepted the fact that ACPI on this machine is well and truly borked. Time to revert to APM. It was while I was looking at the docs to see how to enable APM, that I realized how powersaved handles both APM and ACPI - autodiscovering the currently enabled system. That being the case, enabling APM was trivial. Just modified GRUB's config to add two options to the kernel apm=on acpi=off I think giving just one of them is enough but no harm in being explicit. After the next reboot, I tried Fn+F3 and sure enough, the screen blanked. Pressing Fn+F4 sent the system into Standby mode from where a single press of Fn brought it back to life. Peace.

Update 02-10-2004 Suspend: Frank Schmitt sent in a nice description of how to go about configuring the Suspend mode. I haven't tried it yet. When I had the need, I didn't know how and now that he tells me how, I don't have the need! These days, I use the laptop like a desktop replacement so I don't need the quick boot solution that Suspend provides. Maybe I'll try it when I have really nothing to do. In the meantime, since this information is hard to find on the net, I am reproducing here (almost verbatim) what Frank sent me. Again, I haven't tried any of it so don't write to me asking for help on this part!

The first thing you need is free (unpartitioned) space on your harddisk. You need "size of your RAM + size of your graphics adapter's RAM + some megabytes for safety" megabytes. Frank chose 300 MB. (Partition Magic is excellent for freeing the required space without deleting existing partitions completely, but there are other, free products which should be able to help you too, e.g. qtparted and Gnu parted). In this free space you've got to create a primary partition with type "Hidden Win95 FAT16 (LBA)" - the ID for this partition type is 1e. Now format this partition (e.g. with mkdosfs). You are almost done.

Now you need a program to create a special file in which your BIOS will store the content of your RAM. There's an IBM utility for this, but it requires a DOS boot disk (and the R40 doesn't have a floppy), so use Andrew Tridgell's tphdisk program. Save the file to your disk, compile it with gcc -o tphdisk tphdisk.c and make it executable via chmod +x tphdisk.

Now mount the partition you created before to e.g. /mnt/hibernate and do a ./tphdisk 299 > /mnt/hibernate/save2dsk.bin. Of course you've got to replace the 299 with the size of your partition, but you must not change the filename. After a full reboot, Fn+F12 should give you a functional suspend-to-disk.


Worked out of the box. But since I am almost never tethered to a cable, I did change the settings in YaST to not bring up the interface at boot.


Suse 9.1 detected the onboard Intel Pro/Wireless 2100 802.11b miniPCI card but didn't configure it since using this card currently involves loading a binary driver - something SuSE can't (won't?) ship with the distro. So what SuSE does is that after finishing setup, when you run YOU for the first time to apply the latest updates, it offers to download and install the latest drivers from the ipw2100 project. This would be a perfectly fine choice if you don't need support for encrypted networks. I do, so I chose not to install this and went ahead with the NdisWrapper based solution.

I pretty much followed the method given by Sebastian Dierksmeier (see Resources section below). I'll spell out the steps here with some of the things that I did differently.

  1. Install NdisWrapper using YaST
  2. Download and extract the binary windows driver from here
  3. Load the driver ndiswrapper -i ./PROW7100_XP_v1.2.0.56_logo/w70n51.inf
  4. Confirm with ndiswrapper -l that the driver loaded properly
  5. Run modprobe ndiswrapper
  6. Do a dmesg | tail and if you see something like wlan0: ndiswrapper ethernet device xx:xx:xx:xx:xx:xx using driver xxxxx then things are fine
  7. Configure the interface with something like iwconfig wlan0 essid NetName mode Managed enc on key HEXKEY You'll need to adjust that depending on your network! You may or may not have an encrypted network.
  8. Verify with iwconfig wlan0 that your card is associated with the network.
  9. You can do a dhcpd wlan0 and try to get an IP if that's your setup.

If all is fine so far, then we can go ahead and make the settings permanent.

  1. Open Yast >> Network Devices >> Network Card
  2. Depending on your earlier dealings with Yast - the Intel Pro/Wireless card might be in 'Cards to configure' or 'Already Configured.' I'll assume here it's not yet configured and outline steps for that. If it is, then you can modify the existing settings though I suggest you delete the existing configuration for the card, save changes and start afresh.
  3. Choose the card and click on Configure
  4. If the Configuration name looks something like wlan-bus-pci-0000:02:02.0 where the PCI id matches that shown by lspci | grep PRO/Wireless then leave the configuration name as-is. Otherwise, change the name to reflect your PCI id, like 'wlan-bus-pci-PCIid'
  5. Choose 'Hardware Details' from the 'Advanced' drop down widget. Make sure Device Type is Wireless. Configuration name is like the one above with the wlan part missing: bus-pci-0000:02:02.0.
  6. In the Kernel Module section, Hardware Configuration Name should again be bus-pci-0000:02:02.0. Change the default kernel module from ipw2100 to ndiswrapper. This is the most important bit :-)
  7. Configure Wireless Settings as per your requirement.
  8. Change whatever other settings you see fit and save everything

The way I understand SuSE's new device configuration method (as explained in /usr/share/doc/packages/sysconfig/README), the steps above should get a working network card. The system, when asked to initialize the device, should be able to figure out that the configuration in /etc/sysconfig/network/ifcfg-wlan-bus-pci-xxxx is for the device in /etc/sysconfig/hardware/hwcfg-bus-pci-xxxx. This didn't work for me. I had to change the configuration file name to a more specific MAC address based one.

Get the MAC address for your card. cat /sys/class/net/wlan0/address The create a new configuration file by copying your existing file to a new one: cd /etc/sysconfig/network/; cp ifcfg-wlan-bus-pci-YOURPCIID ifcfg-wlan-id-MACADDRESS The MACADDRESS part should include the colons too, like ifcfg-wlan-id-00:04:23:58:57:BA

That's all! Note that while the ndiswrapper people and Sebastian Dierksmeier suggest running ndiswrapper -m to add the module loading configuration bit 'alias wlan0 ndiswrapper' to modprobe.conf, I don't remember doing this and I don't think it is necessary or even good to do it in SuSE 9.1 since the module is loaded implicitly when the device is setup. The 'wlan' bit in your configuration files will make sure the the next available wlan interface (maybe wlan0) is associated with the module.

Here again, let me warn you that once you have a working network card, don't try fooling around with YaST again since it'll probably fudge your settings.

The Rest

The volume buttons, the brightness and thinklight buttons, and Fn+F3/F4 buttons, all work. I haven't tried setting up Thinkpad Buttons (tpb) since I don't like the ugly OSD that it gives and I don't really need visual feedback when operating these buttons. Anyway, KDE 3.3 will have a module called KMilo which will support OSD feedback for these buttons. It's a port of tpb to KDE and has a very sweet display. I tried it when I tested KDE 3.3 Beta 1 and it works perfectly.

Update 08-10-2004 KMilo: KDE 3.3 was released some time ago and SuSE provided 'unofficial' rpms in their supplementary updates ftp tree. Everything's great but the KMilo module which I was looking forward to using doesn't work! To be precise, KMilo is installed and shows up in Control Center. It's just that it's disabled in the config files. To enable it, edit /opt/kde3/share/services/kded/kmilod.desktop and change the 8th line to read:


Relogin to KDE and your volume and brightness buttons should be accompanied by pretty OSD. Okay, it's not so pretty but KMilo's author has promised to make the display more configurable in the next release. :-) Anyway, this is all very specific to SuSE shipped rpms. It should all be sorted out in SuSE 9.2 while other distro users shouldn't have any problems.

I haven't tested the modem, IR or TV-out functionality. Haven't had reason to try them, I guess they will work.


Sebastian Dierksmeier's SuSE 9.1 on Thinkpad R50 guide.
Pascal Bleser's apt4rpm on SuSE setup guide.
Adding software sources to YaST
Ashwin's Mandrake 10.0 on Thinkpad R40 guide.
Packman's updated packages