Linux on Sony VAIO PCG-SRX51P

 Kernel | Display | Keyboard | Sound | Network | WLAN | USB | PCMCIA | FireWire | Bluetooth | ACPI | References

Arch Linux [1] is running on my laptop since 2006. Its rolling release system makes it easy to keep it up to date without having to install or upgrade to newer versions. Current kernel version is 2.6.33.

After booting the Arch CD (Version 0.7.1) from the external FireWire DVD drive, I had to enter loaddisc /dev/scd0 to mount the CD. I selected a keymap via km, skipped font selection, ran /arch/setup, created partitions, installed all base packages, edited /etc/rc.conf and installed the boot loader in the MBR. After rebooting I set a root password (in more recent versions of Arch this has become part of the installation process) and created a user account

passwd
useradd -m -s /bin/bash [username]
passwd [username]

Kernel

I modified /etc/mkinitcpio.conf as follows:

MODULES="ata_piix sd_mod ext2 ext3 intel_agp agpgart i810fb"
BINARIES=""
FILES="/etc/modprobe.d/i810fb.conf"
HOOKS="base udev uresume"

The module i810fb provides a 1024x768 framebuffer. It may as well be placed in the MODULES section of /etc/rc.conf, but including it in the initial ramdisk makes the higher resolution appear earlier. Module options reside in /etc/modprobe.d/i810fb.conf

options i810fb vram=4 xres=1024 yres=768 bpp=16 hsync1=30 \
               hsync2=50 vsync1=60 vsync2=60 accel

A drawback of enabling framebuffer is that after suspending to RAM the screen remains black, see below.

top
Display

Due to the new Xorg hotplugging my /etc/X11/xorg.conf currently only contains a Monitor and Screen section. The HorizSync value must be specified to get a fullscreen 1024x768 resolution (by default it's only 800x600 with big black bars). Direct rendering works only with a color depth of 16 (by default 24 is used, causing a slow "software rasterizer" to be applied).

Section "Monitor"
	Identifier   "Monitor0"
	HorizSync    31.5 - 50.0
	VertRefresh  50.0 - 70.0
EndSection

Section "Screen"
	Identifier "Screen0"
	Device     "Card0"
	Monitor    "Monitor0"
	DefaultDepth 16
	SubSection "Display"
		Viewport   0 0
		Depth    16 
		Modes	"1024x768" "800x600" "640x480"
	EndSubSection
EndSection

DPMS is not working; the screen only blanks after some time (or immediately via xset dpms force standby), but backlight is never turned off.

top
Keyboard/Touchpad

Steps to select keymap and enable touchpad tapping is described in the ArchWiki [3]. For Fn-keys and Jog-Dial the module sonypi (or sony-laptop with sonypi compatibility enabled) should be added to the MODULES array in /etc/rc.conf. I created PKGBUILDS for rsjog and ruby-gtk (updated 01/09). rsjog requires ruby<1.9.1 and ruby-gtk currently doesn't build.

top
Sound

I installed alsa-utils, ran alsaconf and alsamixer and added alsa to the DAEMONS string in /etc/rc.conf. Users must be in group sound:

 gpasswd -a [username] sound 
top
Network

To avoid changing device names for wired and wireless network the latter is determined by its MAC adress in /etc/udev/rules.d/10-local.rules:

SUBSYSTEM=="net", ATTR{address}=="00:02:2d:6a:5d:63", NAME="wlan0"

This way wlan0 becomes the WLAN interface name, while eth0 is used for LAN, which is configured in a network profile/etc/network.d/lan

CONNECTION="ethernet"
DESCRIPTION=""
INTERFACE=eth0
IP="dhcp"
DHCP_TIMEOUT=10

To auto-connect upon cable insertion I installed ifplugd, added it to the DAEMONS array in /etc/rc.conf and disabled the network daemon. Here is my /etc/ifplugd/ifplugd.conf

NET_IFS="eth0"
ARGS="-fwIl -u0 -d10"

and the modified part of /etc/ifplugd/ifplugd.action

  up)
    netcfg -a
    netcfg lan
  ;;
  down)
    netcfg -a
    netcfg wpa
  ;;

If an ethernet cable is plugged in (or present at boot time), ifplugd will disable all connected profiles (i.e. WLAN, see below) and start LAN - and vice versa. Due to the option -l this also works, if initially there is no cable: The action script is then run with the down agument, hence the WLAN profile will be started.

top
WLAN

As pccardctl ident reveals, it's a Hermes I card, supported by the orinoco_cs module.

Socket 0:
  no product info available
Socket 1:
  product info: "Lucent Technologies", "WaveLAN/IEEE", "Version 01.01", ""
  manfid: 0x0156, 0x0002
  function: 6 (network)

Since kernel 2.6.29 orinoco_cs has support for WPA. A firmware file is required, which can be downloaded from here. Unpack and copy orinoco.fw to /lib/firmware/agere_sta_fw.bin.

For kernel<=2.6.28 I had to install a modified version of an old driver by Agere [5], which is available in the AUR [6]. Added !orinoco_cs wlags49_h1_cs to the MODULES array in /etc/rc.conf to use it instead of the default orinoco driver.

WLAN is configured in a network profile /etc/network.d/wpa

CONNECTION='wireless'
INTERFACE=wlan0
SECURITY='wpa-configsection'
ESSID='My Network'
IP='dhcp'
CONFIGSECTION='
    scan_ssid=1
    proto=WPA
    ssid="My Network"
    key_mgmt=WPA-PSK
    group=TKIP
    pairwise=TKIP
    psk=................................................................
'
top
USB / MemoryStick

Initially the devices for partitions on MemorySticks were not created unless the stick was inserted at boot time or the module usb_storage was reloaded after insertion. To force creation of device nodes I used this udev rule

SUBSYSTEMS=="scsi", ATTRS{model}=="MSC-U03", NAME{all_partitions}="memstick%n"

where the model name was identified by udevadm info -a -p /sys/block/sda. A MemoryStick's first partition was then /dev/memstick1 instead of /dev/sda1. Meanwhile this rule is no longer necessary, a MemoryStick is detected just like a USB stick.

top
PCMCIA

I bought a PCMCIA adaptor which provides a USB 2.0 interface. Tested successfully with a USB 2.0 DVB-T Stick (that does not work on the 1.1 interface) and with a USB 2.0 hard disk drive (containing the drive that was originally inside the laptop). Connection speed of the latter is about ten times higher than at the USB 1.1 device.

top
DVD-ROM

Not used for years. From /etc/fstab:

/dev/scd0   /dvd  iso9660   ro,user,noauto,unhide   0  0
top
Bluetooth

To switch on the bluetooth LED the spicctrl utility from AUR can be used:

spicctrl -l 1

Now the the bluetooth device appears in the output of lsusb

Bus 002 Device 003: ID 044e:3001 Alps Electric Co., Ltd UGTZ4 Bluetooth

The bluetooth daemon (from package bluez) is started automatically. Since blueman is currently not working I used

bluez-simple-agent hci0 <device>

as root to force pairing with my mobile phone (the device name is displayed by hcitool scan). After that I got access to the phone using wammu. Pairing needs to be done only once.

You can edit /etc/bluetooth/rfcomm.conf for binding the device /dev/rfcomm0 to a remote device. For dial-up connections the module ppp_generic is required.

ACPI

Suspend to RAM is working now. I tested the utility s2ram from the Linux suspend project [7] with different parameters. The following combination was successful:

s2ram -f -s

While the option -a 2 seems to have no effect, -a 1 and -a 3 cause the laptop to not wake up properly (high CPU load, no reaction). If the option -s is omitted or -p is set, the screen keeps blank (blindly typing halt makes it shut down normally). Unfortunately, this also happens when the i810fb framebuffer driver is used. Option -f must be set, because the laptop is not in the database. s2ram -n reports

Machine is unknown.
This machine can be identified by:
    sys_vendor   = "Sony Corporation    "
    sys_product  = "PCG-SRX51P(DE)      "
    sys_version  = "01                  "
    bios_version = "R0221U2"

A package for suspend called uswsusp is in the community repository. As an alternative pm-suspend from pm-utils can be used. The option required here is --quirk-vbestate-restore. Since pm-suspend is usually called from HAL/dbus (e.g. via the Xfce logout menu) this option should be placed in a file /etc/pm/config.d/config:

ADD_PARAMETERS="--quirk-vbestate-restore"
SLEEP_MODULE="uswsusp"

Suspending to disk via pm-hibernate works as well. Swap partition is specified in /etc/suspend.conf

snapshot device = /dev/snapshot
resume device = /dev/sda8 
compress = y

You also have to add the uresume hook in /etc/mkinitcpio.conf and run mkinitcpio -p kernel26.

To avoid supending to RAM if a framebuffer device is present I placed a hook in /etc/pm/sleep.d/00fbdev and made that file executable.

#!/bin/bash
case "$1" in
    suspend)
        if [ -e /dev/fb0 ]; then exit 1 ; fi
        ;;
esac

Suspending may also be initiated when the laptop's lid is closed. While acpid is stopped cat /proc/acpi/event shows, that closing the lid is an ACPI event:

button/lid LID 00000080 00000001
button/lid LID 00000080 00000002

So I created a file /etc/acpi/events/lid with the following content:

event=button/lid LID 00000080
action=pm-suspend

Now, if acpid is started, closing the lid will make the laptop suspend to RAM.

To use the buttons from the Xfce logout menu I had to edit /etc/PolicyKit/PolicyKit.conf

<config version="0.1">
        <match action="org.freedesktop.hal.power-management.*">
                <return result="yes"/>
        </match>
</config>

Currently my laptop always crashes at shutdown or logout from X after previous suspend to disk.

To enable CPU speedstepping the module acpi_cpufreq must be loaded.

top
References

[1] http://www.archlinux.org/
[2] http://wiki.archlinux.org/index.php/Fbsplash
[3] http://wiki.archlinux.org/index.php/Xorg_input_hotplugging
[4] http://reactivated.net/writing_udev_rules.html
[5] http://ubuntuforums.org/showthread.php?t=304217
[6] http://aur.archlinux.org/packages.php?do_Details=1&ID=9637
[7] http://en.opensuse.org/S2ram

Author: Olaf Bauer
e-mail: obauer at freenet dot de

Last modified: May 2010