Un bon mémo pour configurer linux sur un portable ASUS pour se mettre en veille.
Ca fonctionne sous sabayon/gentoo et arch, probablement chez ubuntu/debian aussi. Tout d'abord ce qui bloque c'est l'extinction de certaines device, pour corriger le probleme, il font donc avant le suspend/hibernate dévalider les devices qui utilisent "ehci_hcd" et décharger le module xchi du noyau.
Le script va donc chercher les devices dans /sys/bus/pci/drivers/ehci_hcd/ (c'est en rapport avec l'USB) et utiliser les fichier bind et unbind pour les desactiver/activer.
Pratique le sysfs.
On le met dans /etc/pm/sleep.d et lien dans /etc/pm/power.d (lien, avec un nom type 20-stopdevices).
Le " egrep "^$HEX+:$HEX+:$HEX"`" récupère les ID des devices chargées dans le kernel (à la place de modules que l'on pourrait adresser avec modload ...) qui se trouvent dans /sys/bus/pci/drivers/ehci_hcd/ avec les fichiers bind/unbind pour effectuer les opérations.
En pratique on utilise ce script (recupéré ).
#!/bin/bash

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
Pour le hibernate, il faut ajouter au kernel le nom du device de swap avec le paramètre resume. On peut ajouter dans /etc/default/grub, les options en automatique (généré avec grub-mkconfig) :
GRUB_CMDLINE_LINUX_DEFAULT="quiet add_efi_memmap resume=$(swapon -s | grep '/dev/sd.[0-9]' -o)"