How to hotswap Ultrabay devices
The following discusses hotswap (AKA "hotplug") of devices in the Ultrabay.
This page has a lot of old information. Some cleanup might be useful.
Contents
Which driver?
This may be confusing, so first a quick history lesson.
Older ThinkPads (up to the R51, T42p and X40) were fully IDE (PATA) for both the internal HDD and Ultrabay. For these there are two drivers, the modern libata based ata_piix and the old legacy piix/ide-disk combo. Most modern distributions will default to the ata_piix driver, which is really what you want anyway.
ThinkPads like the R52, T43, T43p, X41 and X41 Tablet are strange hybrids. They have a Serial-ATA (SATA) chipset for the internal disk controller, but the actual disk is still legacy IDE, using a separate SATA-PATA bridge chip. The Ultrabay, though, is still connected to the legacy IDE host controller. This results in a setup where the internal disk is handled by a SATA driver and the Ultrabay is handled by either ata_piix or piix/ide-disk.
ThinkPads like the R60, T60 and Z60 series are also hybrids, but they use a native SATA HDD internal. Ultrabay still uses legacy IDE (PATA) though. So just like with the previous models you end up with two separate drivers for the internal HDD and the Ultrabay.
The latest generation ThinkPads like the R400, R500, T400, T500, W500, W700, X200, and X301 are all fully SATA for both the internal HDD and the Ultrabay device, so both are handled by the same SATA driver.
TODO
|
Figure out in which category the X60 series ThinkPads truly belong. Some of these machines might have been shipped with a 1.8" HDD which is likely to be PATA, in fact the HMM even states so. But tabook and ltwbook only lists SATA models, so the 1.8" model might never have shipped. But even if it did there will be a SATA-PATA bridge chip, so from the OS it will look like SATA.
|
Thinkpad | internal HDD | Ultrabay | Modern Driver | Old Driver |
---|---|---|---|---|
A20m, A20p, A21e, A21m, A21p, A22e, A22m, A22p, A30, A30p, A31, A31p | Legacy 2.5" IDE (PATA) | Legacy IDE (PATA) | ata_piix | piix + ide-disk |
R30, R31, R32, R40, R50, R50e, R50p, R51 | Legacy 2.5" IDE (PATA) | Legacy IDE (PATA) | ata_piix | piix + ide-disk |
R52 | Legacy 2.5" PATA HDD with conversion to SATA | Legacy IDE (PATA) | ahci + ata_piix | - |
R60, R61 | 2.5" SATA | Legacy IDE (PATA) | ahci + ata_piix | - |
R400, R500 | 2.5" SATA | SATA | ahci | - |
T20, T21, T22, T23, T30, T40, T40p, T41, T41p, T42, T42p | Legacy 2.5" IDE (PATA) | Legacy IDE (PATA) | ata_piix | piix + ide-disk |
T43, T43p | Legacy 2.5" PATA HDD with conversion to SATA | Legacy IDE (PATA) | ahci + ata_piix | - |
T60, T60p, T61, T61p | 2.5" SATA | Legacy IDE (PATA) | ahci + ata_piix | - |
T400, T500 | 2.5" SATA | SATA | ahci | - |
X20, X21, X22, X23, X24, X30, X31, X32 | Legacy 2.5" IDE (PATA) | Legacy IDE (PATA) | ata_piix | piix + ide-disk |
X40 | Legacy 1.8" IDE (PATA) | Legacy IDE (PATA) | ata_piix | piix + ide-disk |
X41, X41 Tablet | Legacy 1.8" PATA HDD with conversion to SATA | Legacy IDE (PATA) | ahci + ata_piix | - |
X60, X60s, X60 Tablet, X61, X61s, X61 Tablet | 2.5" HDD is SATA, 1.8" HDD is PATA with SATA conversion | Legacy IDE (PATA) | ahci + ata_piix | - |
X300 | 2.5" SATA | Legacy IDE (PATA) | ahci + ata_piix | - |
X200, X200 Tablet, X301 | 2.5" SATA | SATA | ahci | - |
W500, W700 | 2.5" SATA | SATA | ahci | - |
Z60m, Z60t, Z61e, Z61m, Z61p, Z61t | 2.5" SATA | Legacy IDE (PATA) | ahci + ata_piix | - |
Modern systems (using the ahci or ata_piix drivers)
The following applies when using the ahci or ata_piix driver (which supercedes the old ide_disk driver).
You should at least be using a distribution with kernel 2.6.23. If you have a distribution with an older kernel, please update your distribution, as in addition to a newer kernel, you will need some of the newer userland tools.
Using libata-acpi and udev
Starting from kernel 2.6.26-rc5, it's possible to use libata-acpi in combination with udev to hotswap. Please check if CONFIG_ATA_ACPI is enabled in your kernel configuration.
For 2.6.25, you need two patches which can be easily backported ([1],[2]).
Create a file /etc/udev/rules.d/50-thinkpad-ultrabay.rules with the following contents:
ENV{BAY_EVENT}=="3", ACTION=="change", SUBSYSTEM=="scsi", RUN+="/usr/local/sbin/ultrabay_eject"
Then ensure it has the right permissions
chown root:root /etc/udev/rules.d/50-thinkpad-ultrabay.rules chmod 644 /etc/udev/rules.d/50-thinkpad-ultrabay.rules
For Red Hat/Fedora and other systems with selinux, you also need to set the security context:
chcon system_u:object_r:etc_runtime_t:s0 /etc/udev/rules.d/50-thinkpad-ultrabay.rules
Now create the below ultrabay-eject script
Script for Ultrabay eject
The following script does the following:
- Automatically unmounts the relevant filesystems and power off the Ultrabay when the Ultrabay eject lever is released. Screams if some filesystem can't be unmounted.
Create a executable file /usr/local/sbin/ultrabay_eject with the following content. Note if you want to be able to run it directly (not by the UDEV eject script), then you need to manually edit the DEVPATH variable near the top of the script.
#!/bin/bash # Change the following DEVPATH= to match your system, if you want to run this directly instead of having it called by the udev eject script # To find the right value, insert the UltraBay optical drive and run: # udevadm info --query=path --name=/dev/sr0 | perl -pe 's!/block/...$!!' if [ "$DEVPATH" = "" ] then DEVPATH="/devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0" fi shopt -s nullglob export DISPLAY=:0.0 # required for notify-send ULTRABAY_SYSDIR=/sys$DEVPATH # Find generic dock interface for UltraBay dock=$( /bin/grep -l ata_bay /sys/devices/platform/dock.?/type ) dock=${dock%%/type} if [ -n "$dock" -a -d "$dock" ]; then logger ultrabay_eject starting eject of $dock else logger ultrabay_eject cannot locate bay dock device notify-send -u critical -t 100000 "ThinkPad Ultrabay eject failed" "Cannot locate bay dock device" fi # Umount the filesystem(s) backed by the given major:minor device(s) unmount_rdev() { perl - "$@" <<'EOPERL' # let's do it in Perl for $major_minor (@ARGV) { $major_minor =~ m/^(\d+):(\d+)$/ or die; push(@tgt_rdevs, ($1<<8)|$2); } # Sort by reverse length of mount point, to unmount sub-directories first open MOUNTS,"</proc/mounts" or die "$!"; @mounts=sort { length($b->[1]) <=> length($a->[1]) } map { [ split ] } <MOUNTS>; close MOUNTS; foreach $m (@mounts) { ($dev,$dir)=@$m; next unless -b $dev; $rdev=(stat($dev))[6]; next unless grep($_==$rdev, @tgt_rdevs); system("umount","-v","$dir")==0 or $bad=1; if ($bad == 1) { system("logger","ultrabay_eject","ERROR unmounting",$dev,$dir); system("notify-send -u critical -t 100000 \"Error unmounting $dir\" \"Unmounting of $dir on $dev failed!\""); } else { system("logger","ultrabay_eject","unmounted",$dev,$dir); system("notify-send -u normal -t 5000 \"Unmounted $dir\""); }; } exit 1 if $bad; EOPERL } # Get the UltraBay's /dev/foo block device node ultrabay_dev_node() { UDEV_PATH="`readlink -e "$ULTRABAY_SYSDIR/block/"*`" || return 1 UDEV_NAME="`udevadm info --query=name --path=$UDEV_PATH`" || return 1 echo /dev/$UDEV_NAME } if [ $( cat $dock/docked ) == 0 ]; then logger ultrabay_eject dock reports empty else if [ -d $ULTRABAY_SYSDIR ]; then logger ultrabay_eject dock occupied, shutting down storage device $DEVPATH sync # Unmount filesystems backed by this device ## This seems to be very inelegant and prone to failure unmount_rdev `cat $ULTRABAY_SYSDIR/block/*/dev \ $ULTRABAY_SYSDIR/block/*/*/dev` \ || { logger ultrabay_eject umounting failed echo 2 > /proc/acpi/ibm/beep # triple error tone notify-send -u critical -t 100000 "ThinkPad Ultrabay eject failed" "Please do not pull the device, doing so could cause file corruption and possibly hang the system. Unmounting of the filesystem on the ThinkPad Ultrabay device failed. Please put the eject leaver back in place, and try to unmount the filesystem manually. If this succeeds you can try the eject again" exit 1; } sync # Nicely power off the device DEVNODE=`ultrabay_dev_node` && hdparm -Y $DEVNODE # Let HAL+KDE notice the unmount and let the disk spin down sleep 0.5 # Unregister this SCSI device: sync echo 1 > $ULTRABAY_SYSDIR/delete else logger ultrabay_eject bay occupied but incorrect device path $DEVPATH notify-send -u critical -t 100000 "ThinkPad Ultrabay eject failed" "Bay occupied but incorrect device path" echo 2 > /proc/acpi/ibm/beep # triple error tone exit 1 fi fi # We need sleep here so someone can disconnect the bay and the drive sleep 1 # Turn off power to the UltraBay logger ultrabay_eject undocking $dock echo 1 > $dock/undock # Tell the user we're OK logger ultrabay_eject done echo 12 > /proc/acpi/ibm/beep notify-send -u normal -t 10000 "Safe to remove device" "The ThinkPad Ultrabay device can now safely be removed"
an possible fix for the notify not working thing is here Talk:How_to_hotswap_Ultrabay_devices#get_notify-send_working
Then make sure ownership and permissions are set correct
chown root:root /usr/local/sbin/ultrabay_eject chmod 555 /usr/local/sbin/ultrabay_eject
If the ata_piix driver is built in the kernel, it will catch bay events and you will see the following message in your system log:
thinkpad_acpi: another device driver is already handling bay events thinkpad_acpi: disabling subdriver bay
You should load thinkpad_acpi before ata_piix if you want it to handle bay events.
Script for Ultrabay insert
Create /usr/local/sbin/ultrabay_insert with the following content:
#!/bin/bash echo 12 > /proc/acpi/ibm/beep sync echo 0 0 0 > /sys/class/scsi_host/host1/scan
and set the right permissions
chown root:root /usr/local/sbin/ultrabay_insert chmod 555 /usr/local/sbin/ultrabay_insert
Using the generic bay driver and udev
Starting from kernel 2.6.23-rc3, it's possible to use the generic bay driver in combination with udev to hotswap. Please check if CONFIG_ACPI_BAY is enabled (module or built-in) in your kernel configuration.
Create /etc/udev/rules.d/ibm-ultrabay.rules:
ENV{BAY_EVENT}=="3", KERNEL=="bay.0", ACTION=="change", SUBSYSTEM=="platform", RUN+="/usr/local/sbin/ultrabay_eject" ENV{BAY_EVENT}=="1", KERNEL=="bay.0", ACTION=="change", SUBSYSTEM=="platform", RUN+="/usr/local/sbin/ultrabay_insert"
Starting with kernel 2.6.28, the bay driver was removed from the mainline kernel. The dock driver replaced it completely. Make sure CONFIG_ACPI_DOCK is enabled in the kernel, and use the following udev rules:
ENV{EVENT}=="undock", KERNEL=="dock.2", ACTION=="change", SUBSYSTEM=="platform", RUN+="/usr/local/sbin/ultrabay_eject" ENV{EVENT}=="dock", KERNEL=="dock.2", ACTION=="change", SUBSYSTEM=="platform", RUN+="/usr/local/sbin/ultrabay_insert"
However, the ultra_eject script needs to be changed, otherwise udev goes into an infinite event loop. It will send undock events every few seconds forever. That means as soon as the ultrabay is plugged in again, it will be immediately ejected. For kernels 2.6.28 and higher, the bay cannot be powered off using this method, so change the end of the script to read:
# Turn off power to the UltraBay: if [ -d /sys/devices/platform/bay.0 ]; then echo 1 > /sys/devices/platform/bay.0/eject elif [ -e /proc/acpi/ibm/bay ]; then echo eject > /proc/acpi/ibm/bay fi # Tell the user we're OK echo 12 > /proc/acpi/ibm/beep
Alternatively, instead of modifying the script, use the libata-acpi method below. This was tested on a T61p running Gentoo with tuxonice 2.6.28-r8 without any issues.
HAL support
HAL support is only needed for proper notification to your desktop applications, such as Gnome and KDE. You will still require the udev script to handle the proper removal.
To tell HAL that devices connected to the UltraBay port are hotpluggable, you need to create a file /etc/hal/fdi/information/10-thinkpad-ultrabay.fdi with the following content:
<?xml version="1.0" encoding="ISO-8859-1"?> <!-- -*- SGML -*- --> <!-- HAL config file to set ThinkPad Ultrabay eject capability flag. Note that ThinkPad model matching is done on a partial match, so T40 will also match T40p, which is what we want. If your ThinkPad model is not listed, please check with lspci what PCI ID your disk controller is --> <deviceinfo version="0.2"> <device> <match key="/org/freedesktop/Hal/devices/computer:system.hardware.version" prefix="ThinkPad"> <match key="/org/freedesktop/Hal/devices/computer:system.hardware.vendor" string="IBM"> <!-- IBM ThinkPad A20m, A20p, A21e, A21m, A21p, A22e, A22m, A22p, T20, T21, T22, X20 and X21 --> <match key="/org/freedesktop/Hal/devices/computer:system.hardware.version" contains_outof="A20;A21;A22;T20;T21;T22;X20;X21"> <match key="storage.bus" string_outof="pci;scsi"> <match key="info.parent" string="/org/freedesktop/Hal/devices/pci_8086_7111_scsi_host_0_scsi_device_lun0"> <merge key="storage.hotpluggable" type="bool">true</merge> </match> </match> </match> <!-- IBM ThinkPad T23, T30, X22, X23, X24 and X30 --> <match key="/org/freedesktop/Hal/devices/computer:system.hardware.version" contains_outof="T23;T30;X22;X23;X24;X30"> <match key="storage.bus" string_outof="pci;scsi"> <match key="info.parent" string="/org/freedesktop/Hal/devices/pci_8086_248a_scsi_host_0_scsi_device_lun0"> <merge key="storage.hotpluggable" type="bool">true</merge> </match> </match> </match> <!-- IBM ThinkPad A30, A30p, A31 and A31p - 2 Ultrabay devices--> <match key="/org/freedesktop/Hal/devices/computer:system.hardware.version" contains_outof="A30;A31"> <match key="storage.bus" string_outof="pci;scsi"> <match key="info.parent" string="/org/freedesktop/Hal/devices/pci_8086_248a_scsi_host_scsi_device_lun0_0"> <merge key="storage.hotpluggable" type="bool">true</merge> </match> <match key="info.parent" string="/org/freedesktop/Hal/devices/pci_8086_248a_scsi_host_0_scsi_device_lun0"> <merge key="storage.hotpluggable" type="bool">true</merge> </match> </match> </match> <!-- IBM ThinkPad R50, R51, T40, T40p, T41, T41p, X31, X32 and X40 --> <match key="/org/freedesktop/Hal/devices/computer:system.hardware.version" contains_outof="R50;R51;T40;T41;T42;X31;X32;X40"> <match key="storage.bus" string_outof="pci;scsi"> <match key="info.parent" string="/org/freedesktop/Hal/devices/pci_8086_24ca_scsi_host_0_scsi_device_lun0"> <merge key="storage.hotpluggable" type="bool">true</merge> </match> </match> </match> <!-- IBM ThinkPad R52, T43, T43p, X41, Z60m and Z60p --> <match key="/org/freedesktop/Hal/devices/computer:system.hardware.version" contains_outof="R52;T43;X41;Z60"> <match key="storage.bus" string_outof="pci;scsi"> <match key="info.parent" string="/org/freedesktop/Hal/devices/pci_8086_2653_scsi_host_scsi_device_lun0"> <merge key="storage.hotpluggable" type="bool">true</merge> </match> </match> </match> </match> <match key="/org/freedesktop/Hal/devices/computer:system.hardware.vendor" string="LENOVO"> <!-- Lenovo ThinkPad T60, T60p, Z61m, Z61t and Z61p --> <match key="/org/freedesktop/Hal/devices/computer:system.hardware.version" contains_outof="T60;Z61"> <match key="storage.bus" string_outof="pci;scsi"> <match key="info.parent" string="/org/freedesktop/Hal/devices/pci_8086_27df_scsi_host_scsi_device_lun0"> <merge key="storage.hotpluggable" type="bool">true</merge> </match> </match> </match> <!-- Lenovo ThinkPad R60 and X60 --> <match key="/org/freedesktop/Hal/devices/computer:system.hardware.version" contains_outof="R60;X60"> <match key="storage.bus" string_outof="pci;scsi"> <match key="info.parent" string="/org/freedesktop/Hal/devices/pci_8086_27c4_scsi_host_scsi_device_lun0"> <merge key="storage.hotpluggable" type="bool">true</merge> </match> </match> </match> <!-- Lenovo ThinkPad R61, T61, T61p and X300 --> <match key="/org/freedesktop/Hal/devices/computer:system.hardware.version" contains_outof="R61;T61;X300"> <match key="storage.bus" string_outof="pci;scsi"> <match key="info.parent" string="/org/freedesktop/Hal/devices/pci_8086_2850_scsi_host_scsi_device_lun0"> <merge key="storage.hotpluggable" type="bool">true</merge> </match> </match> </match> <!-- Lenovo ThinkPad R400, R500, T400, T500, W500, W700, X200 and X301 --> <match key="/org/freedesktop/Hal/devices/computer:system.hardware.version" contains_outof="R400;R500;T400;T500;W500;W700;X200;X301"> <match key="storage.bus" string_outof="pci;scsi"> <match key="info.parent" string="/org/freedesktop/Hal/devices/pci_8086_2929_scsi_host_0_scsi_device_lun0"> <merge key="storage.hotpluggable" type="bool">true</merge> </match> </match> </match> </match> </match> </device> </deviceinfo>
Then ensure it has the right permissions
chown root:root /etc/hal/fdi/information/10-thinkpad-ultrabay.fdi chmod 644 /etc/hal/fdi/information/10-thinkpad-ultrabay.fdi
To check the effect, look at your lshal output, the section for your optical disk (/dev/sr0 typically) or your 2nd hdd (/dev/sdb typically) should have storage.hotpluggable = true after restarting your hal deamon or rebooting.
When using the ide-disk driver
The following applies if you use the ide-disk driver for the UltraBay device.
Note that essentially, you shouldn't be using this driver, and use ata_piix instead unless you're running an older kernel where ata_piix won't work for you
Hotswapping is supposed to be supported as well, using either hdparm/Debian hotswap or lt_hotswap to (un)register IDE devices. The latter is the recommended method with kernels from 2.6, since it will leave DMA working. However, for recent models (R52, T43, X41, Z60 and later) no method is known to work while maintaining DMA support; see Problems with SATA and Linux.
Only IDE devices (HDD's, optical drives, zip drives) require special treatment - batteries, floppies and other devices can just be pulled from the bay, provided they are not mounted or in use at the time. However, you should still power them down first using the thinkpad-acpi eject function.
The thinkpad-acpi kernel module has an eject function (# echo eject > /proc/acpi/ibm/bay
). This only manages the ACPI calls to power down the device and the bay. It does not actually unregister the device from the IDE driver. # cat /proc/acpi/ibm/bay
shows "unoccupied" unless an IDE device is present, but the eject function still works and should still be used.
To unregister the device, you can either use the Debian hotswap package, or lt_hotswap. Note that lt_hotswap doesn't seem to even build on recent (at 2.6.22 or newer, although it probably broke before 2.6.22) and on newer kernels, you should not build/load the old IDE PIIX (CONFIG_BLK_DEV_PIIX) and use the natively hotswapping ata_piix (CONFIG_ATA_PIIX) as explained on the top of this page.
Debian hotswap also allows the drive to be swapped as a normal user by default, which is useful. You should use hotswap to unregister the device and then # echo eject > /proc/acpi/ibm/bay
. However, if you use this method on a 2.6 kernel, you will lose DMA support for the reinserted drive. This is due to kernel issues. This method was reported to work on a ThinkPad T23 (kernels 2.6.8.1, 2.6.14.2 and 2.6.15-arch) and T42 (kernel 2.6.13), but fails on a ThinkPad T43 (kernel 2.6.14.3).
lt_hotswap is now the recommended method to un- and reregister the IDE device. It installs as a kernel module and has support for automatically unregistering (if loaded with the auto_eject=1 option) the device when the eject event is generated by thinkpad-acpi. It will leave DMA support intact. It has supported to work on a ThinkPad T22 and T40 and should work with many other models (but not recent models which require the ata_piix driver for disk DMA support). With the lt_hotswap kernel module loaded, run: # modprobe -r ide_cd && modprobe -r cdrom && echo "MSTR eject" > /proc/acpi/lths
HAL support
HAL support also can also be configured To do so, create the file /etc/hal/fdi/information/10-ultrabay.fdi as follows:
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- SGML -*- --> <deviceinfo version="0.2"> <device> <!-- UltraBay Devices --> <match key="storage.bus" string="ide"> <match key="storage.physical_device" string="/org/freedesktop/Hal/devices/pci_8086_24ca_ide_1_0"> <merge key="storage.hotpluggable" type="bool">true</merge> </match> </match> </device> </deviceinfo>
For more details see HAL section for ata driver.
Password protected HDD
There are multiple issues with hotplugging a password protected HDD. In short, it does not work. You will need to reboot and let the BIOS do the unlock.
hdparm
With hdparm in theory you should be able to set, remove or unlock a password protected HDD. Here is the syntax for a Master password:
hdparm --security-unlock PASSWD /dev/sdb
Or if it is a user password
hdparm --security-unlock PASSWD --user-master u /dev/sdb
However all the hdparm --security-* commands return a "Input/output error"
libata EH going crazy
hotplugging a password protected HDD causes the libata error handler to go crazy
ACPI: \_SB_.PCI0.IDE0.SCND.MSTR - docking ata2: exception Emask 0x10 SAct 0x0 SErr 0x0 action 0xe frozen ata2: ACPI event ata2: soft resetting link ata2.00: ATA-6: HTS726060M9AT00, MH4OA6DA, max UDMA/100 ata2.00: 117210240 sectors, multi 0: LBA ata2.00: limited to UDMA/33 due to 40-wire cable ata2.00: configured for UDMA/33 ata2: EH complete scsi 1:0:0:0: Direct-Access ATA HTS726060M9AT00 MH4O PQ: 0 ANSI: 5 sd 1:0:0:0: Attached scsi generic sg1 type 0 sd 1:0:0:0: [sdb] 117210240 512-byte logical blocks: (60.0 GB/55.8 GiB) sd 1:0:0:0: [sdb] Write Protect is off sd 1:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA sdb:
After which there is a continuous stream of errors such as these...
ata2.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0 ata2.00: BMDMA stat 0x5 ata2.00: failed command: READ DMA ata2.00: cmd c8/00:08:00:00:00/00:00:00:00:00/e0 tag 0 dma 4096 in res 51/04:08:00:00:00/00:00:00:00:00/e0 Emask 0x1 (device error) ata2.00: status: { DRDY ERR } ata2.00: error: { ABRT } ata2.00: configured for UDMA/33 ata2: EH complete
udisks
lastly, there should be some userland support to detect the password protected HDD and prompt you for a password or retrieve the password from gnome-keyring.
- NeedsEditing
- A20m
- A20p
- A21e
- A21m
- A21p
- A22e
- A22m
- A22p
- A30
- A30p
- A31
- A31p
- R30
- R31
- R32
- R40
- R50
- R50e
- R50p
- R51
- R52
- R60
- R61
- R400
- R500
- T20
- T21
- T22
- T23
- T30
- T40
- T40p
- T41
- T41p
- T42
- T42p
- T43
- T43p
- T60
- T60p
- T61
- T61p
- T400
- T500
- X20
- X21
- X22
- X23
- X24
- X30
- X31
- X32
- X40
- X41
- X41 Tablet
- X60
- X60s
- X60 Tablet
- X61
- X61s
- X61 Tablet
- X300
- X200
- X200 Tablet
- X301
- W500
- W700
- Z60m
- Z60t
- Z61e
- Z61m
- Z61p
- Z61t
- Scripts
- HOWTOs