TuxMobil - Linux on Laptops, Notebooks, PDAs and Mobile Phones

Slackware 11 on Toshiba Tecra M2.

Em Tonkin

Preamble

The good news is that pretty much everything works, given a little tweaking; usb, pcmcia, graphics, sound, lan, wifi, power management, suspend to ram and disk - all that. There isn't really any bad news.

Note: This is a set of installation notes for Slackware 11. This may be useful for other distros with similar characteristics, especially since Slackware uses the vanilla kernel - but it may not. Look on Tuxmobil.org for other takes on the subject.

Installation

Step 1: work out how to boot off a CD or DVD. The answer is to press F2 repeatedly when you see the cute Toshiba logo on boot. You will notice that it gives you a set of cute graphical options; go to the cd logo with the arrow keys and press Enter. Then it will boot from a CD. Not terribly intuitive, but oh, well.

The rest is more or less the usual, except for a couple of points. Make a swap partition on your disk when you are partitioning for Linux. Make it as large as the quantity of memory on your machine, or twice as large if you're a frequent upgrader type. I suggest using the huge26 kernel rather than any of the other stock Slackware options - but remember to install the modules and the kernel source for the 2.6.whatever kernel! They are in the extra directory and are not automatically installed. If you do not installpkg modules and source, virtually nothing will work.

Mouse:

Standard PS/2 works fine.

X.org:

First run xorgsetup. Note the 800x600 screen size.

See xorg.conf.example, appended to this page. (Basically, it doesn't autodetect the horizontal refresh properly, so you have to manually tell it that it can probably be a little more daring than it wants to be.)

Next, set up the right environment:

root@kakapo:/etc/X11/xinit# ln -s -f xinitrc.kde xinitrc

(Also recall that you probably already have a .xinitrc in your own directory that you will have to alter/delete, if you have previously run x.org...)

Wifi

Slackware has successfully detected the existence of the Wifi controller. lspci shows:

02:05.0 Network controller: Intel Corporation PRO/Wireless 2200BG Network Connection (rev 05)

root@kakapo:~# dmesg | grep ipw
ipw2200: Intel(R) PRO/Wireless 2200/2915 Network Driver, git-1.1.1
ipw2200: Copyright(c) 2003-2006 Intel Corporation
ipw2200: Detected Intel PRO/Wireless 2200BG Network Connection
ipw2200: ipw2200-bss.fw request_firmware failed: Reason -2
ipw2200: Unable to load firmware: -2
ipw2200: failed to register network device
ipw2200: probe of 0000:02:05.0 failed with error -5

Now, you need ipw2200 firmware for the wifi; this error means that the driver does not have the appropriate firmware. Go to ipw2200.sourceforge.net. Download the appropriate set of firmwares for your particular version of the driver.

root@kakapo:~# tar xvfz ipw2200-fw-3.0.tgz

root@kakapo:~# cd ipw2200-fw-3.0

[Firmware should be placed in /lib/firmware]
root@kakapo:~/ipw2200-fw-3.0# cp *.fw /lib/firmware

[Now, reload the ipw2200 module]
root@kakapo:~/ipw2200-fw-3.0# rmmod ipw2200
root@kakapo:~/ipw2200-fw-3.0# modprobe ipw2200
WARNING: Error inserting firmware_class 
(/lib/modules/2.6.17.13/kernel/drivers/base/firmware_class.ko): 
Invalid module format

Ignore the warning.
Open kwifimanager and set up the wifi network.

root@kakapo:~/ipw2200-fw-3.0# dhcpcd eth1
root@kakapo:~/ipw2200-fw-3.0# ping www.google.com

Sound

Works out of the box. Run alsamixer and then alsactl store..

Power Management:Resume

There are several modules you need to load to enable power management. Note: on Slackware, the stock method of getting these commands to run on each reboot is putting them in /etc/rc.d/rc.local. My rc.local looks like:

#preload modules 

/sbin/modprobe ac
/sbin/modprobe thermal
/sbin/modprobe fan
/sbin/modprobe processor
/sbin/modprobe speedstep-centrino
/sbin/modprobe video
/sbin/modprobe battery
/sbin/modprobe toshiba_acpi

This may be a good time to thank the toshiba_acpi developers!

Whilst loading these has resulted in a functional ACPI install, meaning that we now have access to most of the ACPI functionality, there are some disappointments in store. On the first test of suspend/resume functionality, we discover that the suspend leads to a horrible video bug (shaky, stretched graphics) on resume. So we try strategy 1: we download the official nvidia drivers: http://www.nvidia.com/object/linux_display_ia32_1.0-9746.html

root@kakapo:~# sh NVIDIA-Linux-x86-1.0-9746-pkg1.run

Let it do its own thing during install

Once installed --- aww, ain't it bootiful? But what a shame - it doesn't resume from suspend at all. Or rather, the computer does... but the screen and backlight stay black.

Note: Once the acpi functionality is available, KDE allows you to attempt suspend from the klaptop applet. Gnome probably has a similar system, although I haven't used it. If you are not a 'feature-rich' desktop user, you can suspend directly from the command line. As root:

# This command sets the system to suspend
echo 3 > /proc/acpi/sleep

Also note that this will only work if you have a /proc/acpi/sleep. This has been deprecated in 2.6 and replaced by /sys/power/state. Personally, I recompiled the kernel with legacy support for /proc/acpi/sleep, because I get confused easily.

Back to fixing graphics post-suspend; we try removing the intel_agp module, because we've had problems with that before. No improvement.

Fine. Let's try strategy 2: reverting to the nv drivers. We replace 'Driver "nvidia"' with 'Driver "nv"' in xorg.conf.

These are the xorg drivers we started with - this will irritate anybody who wants 3D acceleration since you will need the NVidia ones for that. On the plus side, we know they work better than the NVidia black screen on resume - it appears to be generally true that open drivers have fewer problems with suspend, although as with all generalisations this will immediately prove to be wrong 90% of the time.

To get rid of that video bug, we then try removing the framebuffer from lilo (vga=normal). Success! Resume from memory now works flawlessly! Note: this is something I've seen before on other laptops; for some reason framebuffers and suspend do not always play nice together. I would be lying if I said I had any idea why this was the case.

Power Management:Hibernate

You are now in kernel recompile territory.

Essentially, there is all of one thing that stops you from using hibernate functionality out of the box. And that is the fact that software suspend is not compiled into the stock huge26.s Slackware kernel. Therefore, go into the kernel source directory (/usr/src/linux-2.6.17.13/ in this case) and copy the huge26.s kernel config from /boot (it's called 'config', or symlinked from that name), into this directory - rename it to '.config'. Then type 'make xconfig'. Go into the acpi options. Enable software suspend. If you're not planning on sharing this kernel with people who have different setups, you should probably set the software suspend partition here to save you having to provide it as a lilo option (append="resume=/dev/blah"). Note: at risk of belabouring an unbelievably obvious point, the swap partition you should use to suspend to disk has to be large enough. If you have a lot of memory, you will also need a lot of swap space to dump it into.

Now that you have added software suspend to the kernel, compile (make), and make the kernel image (make bzImage). Copy it to /boot, with an appropriately obvious name ('linux-2.6.17.13-suspend' or whatnot). Now edit lilo; do not remove the entry for your stock 2.6 kernel, just in case you have messed up horribly. Add an extra entry: in my case,

image=/boot/vmlinuz-suspend-2.6-em
  root=/dev/hda4
  label=Linux-suspend
  read-only

Then type lilo. Then reboot.

With luck, you will be able to boot with your shiny new kernel, startx, right-click on that little power management icon on the kde taskbar, select 'hibernate' (note - and I should have said this about 'suspend' too - you may need to enable these in the klaptop menu before the option becomes available!) In theory, your screen will look disturbingly corrupt for a few moments whilst the data is written, and then the machine will switch off. To resume, reboot as normal and select your shiny new kernel in the lilo menu again. In theory (and it does work for me) Linux will then resume from the data written to the swap partition.

Note bug: ipw2200 (the wifi driver) gets moody about resume from suspend to disk. I suggest removing the module before you suspend to disk (there is undoubtedly a 'do this before suspending' script somewhere) and reloading it afterwards. Doing this manually, or indeed just rmmod'ing and modprob'ing ipw2200 after resume, works perfectly for me - but my interest in this only goes so far :-)

Note bug the second: rebooting - the laptop does not like to restart. From here: if you experience problems rebooting the laptop, try adding rmmod ipw2200 somewhere in the rc.0 script to unload the wireless network module before a restart.


Handy resources

A good place to look for further information on suspend/resume is: Vizzzion.org.

An excellent resource for Slackware Linux on the M2 is Maarten Rütten's page. This page contains the answers for all those things it never occurred to me to try, like fixing hotkeys and getting the full Synaptics functionality from the touchpad.


Appended stuff

/etc/X11/xorg.conf

Section "ServerLayout"
        Identifier     "X.org Configured"
        Screen      0  "Screen0" 0 0
        InputDevice    "Mouse0" "CorePointer"
        InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
        RgbPath      "/usr/X11R6/lib/X11/rgb"
        ModulePath   "/usr/X11R6/lib/modules"
        FontPath     "/usr/X11R6/lib/X11/fonts/misc/"
        FontPath     "/usr/X11R6/lib/X11/fonts/TTF/"
        FontPath     "/usr/X11R6/lib/X11/fonts/Type1/"
        FontPath     "/usr/X11R6/lib/X11/fonts/CID/"
        FontPath     "/usr/X11R6/lib/X11/fonts/75dpi/"
        FontPath     "/usr/X11R6/lib/X11/fonts/100dpi/"
EndSection

Section "Module"
        Load  "glx"
        Load  "extmod"
        Load  "xtrap"
        Load  "record"
        Load  "dbe"
        Load  "dri"
        Load  "freetype"
        Load  "type1"
EndSection


Section "InputDevice"
        Identifier  "Keyboard0"
        Driver      "kbd"
        Option       "XkbModel"  "pc101"
	# Note - I am lazy and just pressed 'enter'
	# instead of picking UK kbd. You will probably
	# want to change this.
        Option       "XkbLayout"  "us"
EndSection

Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "mouse"
        Option      "Protocol" "auto"
        Option      "Device" "/dev/mouse"
        Option      "ZAxisMapping" "4 5 6 7"
EndSection

Section "Monitor"
        Identifier   "Monitor0"
        VendorName   "Monitor Vendor"
        ModelName    "Monitor Model"
        HorizSync    28.0 - 50.0
        VertRefresh  20.0 - 80.0
EndSection

Section "Device"
       Identifier  "Card0"
        Driver      "nv"
        VendorName  "nVidia Corporation"
         BoardName   "NV34M [GeForce FX Go5200 32M/64M]"
                BusID       "PCI:1:0:0"
EndSection

Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        DefaultDepth 16
        SubSection "Display"
                Viewport   0 0
                Depth     1
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     4
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     8
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     15
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     16
                Modes "1024x768"
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     24
                Modes "1024x768"
        EndSubSection
EndSection

/etc/lilo.conf

boot = /dev/hda
message = /boot/boot_message.txt
prompt
timeout = 1200
# Override dangerous defaults that rewrite the partition table:
change-rules
  reset
# Normal VGA console
 vga = normal
# Windows bootable partition config begins
other = /dev/hda1
  label = Windows
  table = /dev/hda
# Windows bootable partition config ends
# Linux bootable partition config begins
image=/boot/vmlinuz-suspend-2.6-em
  root=/dev/hda4
  label=Linux-suspend
  read-only
image = /boot/vmlinuz
  root = /dev/hda4
  label = Linux
  read-only