Monday 17 January 2011

Ubuntu 10.10 on Lenovo Thinkpad W500 - Problems with Suspend

Following an earlier problem with suspend/resume, I seem to have picked up another problem since  a kernel update over the weekend.

Following the update, I'm now on 2.6.35-25-generic-pae and, sadly, since then, my laptop doesn't suspend, regardless of whether I choose the Suspend option from the menu, close the lid or hit [Fn]+[F4].

I even tested using the command sudo pm-suspend but got the same issue.

The screen flashes to black, the crescent moon suspend indicator blinks on and off and, after 5-10 seconds, the display restores precisely to where it was before.

I even tried manually switching off the network and Bluetooth adapters, using the small switch at the front-left side of the keyboard, and also checked that I had no USB devices plugged in.

I noticed that I did see messages relating to: -

PM: Device 00:0a failed to suspend: error -5
PM: Some devices failed to suspend

in one of the virtual terminals, which gave me a potential helping hand, and led me to this page.

In essence, it appears that the kernel change has affected the way that a kernel module - tpm_tis - should be loaded. Apparently, TPM is part of the Trusted Rights Platform, and appears to relate to encryption, which is nice.

To cut a long story short, there are three inter-dependant modules that are loaded at boot-up: -

tpm
tpm_bios
tpm_tis

When the third module - tpm_tis - is loaded, it needs to have a parameter - itpm=1 - added as follows: -

sudo modprobe tpm
sudo modprobe tpm_bios
sudo modprobe tpm_tis itpm=1

I proved this by comparing the results of this set of commands: -

sudo rmmod tpm_tis tpm t
sudo modprobe tpm
sudo modprobe tpm_bios
sudo modprobe tpm_tis
sudo pm-suspend

with this: -

sudo rmmod tpm_tis tpm t
sudo modprobe tpm
sudo modprobe tpm_bios
sudo modprobe tpm_tis
sudo pm-suspend itpm=1

In the first case, suspend failed - in the second case, it worked as one would expect.

So, as a permanent ( I hope ) solution, I've created a new configuration file: -

/etc/modprobe.d/tpm.conf

into which I've placed: -

options tpm_tis itpm=1

Now, following a reboot, I'm pleased to report that suspend and, perhaps equally importantly, resume both work.

I'm hoping this'll be fixed in a future release, but my circumvention ( aka hack ) seems to work.

9 comments:

Unknown said...

Nice one Dave!

My suspend is a real hit and miss affair. sometimes it does and other times it does not. I get that sinking feeling when the suspend half moon icon starts flashing.

Hibernate only worked initially but since then I have encrypted my disks and swap file but I should really investigate further.

I will try your suggestion and let you know but I thought I was the only one with issues.

Thanks!

matnewman said...

Tested and confirmed on Lenovo T61p 10.10x32 and W701ds 10.10x64.

Thanks Dave.

No, seriously ... THANKS!

Dave Hay said...

@Ray - you may also want to check whether this - http://portal2portal.blogspot.com/2010/12/suspend-and-resume-using-ubuntu-1010-on.html - helps. I no longer need the hack, but it did solve the problem where the crescent moon icon flashes forever.

@Mat - no worries at all, glad to help

Unknown said...

Nice one dude. Just got W500 4061-2KU and spent last few hours trying to get the suspend to work. Your itpm=1 fix worked like a charm.

Dave Hay said...

@Ronzilla - great news, thanks for the update

bsk said...

Tested and works on my x301!

Many thanks, now if I can only get shutdown to work.

Kim Djernæs said...

THANK YOU!

alan.briolat said...

Thanks! This fixed the problem on my Thinkpad X200t. Have you filed or found an Ubuntu bug report to make sure they're following this issue? Looks like it may be fixed upstream already though, so maybe 11.04 won't have the problem...

Dave Hay said...

@Alan - thanks for the feedback. I must admit that I haven't followed this up with Ubuntu via Launchpad.

Visual Studio Code - Wow 🙀

Why did I not know that I can merely hit [cmd] [p]  to bring up a search box allowing me to search my project e.g. a repo cloned from GitHub...