Ubuntu – Suspend/hibernate doesn’t work on an Asus laptop

asuslaptopsuspend

I'm having issues suspending Ubuntu 11.04 (Natty Narwhal) on my new Asus U30SD-XA1 laptop. It's a new laptop on the market. Is this a known issue and is there a fix for it?

Basically, whenever I close or put the laptop to sleep, the screen goes black but the video card doesn't actually turn off, and then the fan spins even faster than before and gets hot.

I did see that some people were having similar issues on other laptops and they set the kernel back. I'm newish to Ubuntu, and I'm not super comfortable messing with the kernel.

I am not using the 520M Nvidia driver, because it won't load Unity after it's installed. I've also heard quite a few bad things about the drivers on the Ubuntu forums, so I deactivated the driver.

Best Answer

This appears to be a common issue on many ASUS laptops. Try this:

Source: http://thecodecentral.com/2011/01/18/fix-ubuntu-10-10-suspendhibernate-not-working-bug

Run this in a terminal:

gksu gedit /etc/pm/sleep.d/20_custom-ehci_hcd 

Copy and Paste the contents of the following into the text editor:

#!/bin/sh
#inspired by http://art.ubuntuforums.org/showpost.php?p=9744970&postcount=19
#...and http://thecodecentral.com/2011/01/18/fix-ubuntu-10-10-suspendhibernate-not-working-bug    
# tidied by tqzzaa :)

VERSION=1.1
DEV_LIST=/tmp/usb-dev-list
DRIVERS_DIR=/sys/bus/pci/drivers
DRIVERS="ehci xhci" # ehci_hcd, xhci_hcd
HEX="[[:xdigit:]]"
MAX_BIND_ATTEMPTS=2
BIND_WAIT=0.1

unbindDev() {
  echo -n > $DEV_LIST 2>/dev/null
  for driver in $DRIVERS; do
    DDIR=$DRIVERS_DIR/${driver}_hcd
    for dev in `ls $DDIR 2>/dev/null | egrep "^$HEX+:$HEX+:$HEX"`; do
      echo -n "$dev" > $DDIR/unbind
      echo "$driver $dev" >> $DEV_LIST
    done
  done
}

bindDev() {
  if [ -s $DEV_LIST ]; then
    while read driver dev; do
      DDIR=$DRIVERS_DIR/${driver}_hcd
      while [ $((MAX_BIND_ATTEMPTS)) -gt 0 ]; do
          echo -n "$dev" > $DDIR/bind
          if [ ! -L "$DDIR/$dev" ]; then
            sleep $BIND_WAIT
          else
            break
          fi
          MAX_BIND_ATTEMPTS=$((MAX_BIND_ATTEMPTS-1))
      done  
    done < $DEV_LIST
  fi
  rm $DEV_LIST 2>/dev/null
}

case "$1" in
  hibernate|suspend) unbindDev;;
  resume|thaw)       bindDev;;
esac

Save, then

sudo chmod 755 /etc/pm/sleep.d/20_custom-ehci_hcd
Related Question