Ubuntu 16.04 (Xenial Xerus)
sudo apt install tlp
sudo lsusb
Find the USB device's input id - it should look like 1234:5678
.
Edit the file sudo vi /etc/default/tlp
and add your device's input ID to USB_BLACKLIST
by adding the following line with your device's input id like so:
USB_BLACKLIST="1234:5678"
Ubuntu 14.04 (Trusty Tahr)
As mentioned here at hecticgeek.com, the trick consists of two parts:
Using lsusb
to ascertain the device IDs of the USB devices you wish to disable autosuspend for.
And then adding them to AUTOSUSPEND_USBID_BLACKLIST
in the /etc/laptop-mode/conf.d/runtime-pm.conf
(usb-autosuspend.conf
until Ubuntu 14.04) configuration file (details are well documented in there as well).
The current stumbling block with OP links, follow up comments and proposed answers is the product ID is static 1b1a:7001
but the Bus and Device numbers keep changing.
The solution
Create a script (any name you want) in the directory /etc/pm/sleep.d/
and place the following in it:
#!/bin/bash
ZeroBUS=$(lsusb | grep 1b1a:7001 | cut -c 5-7 )
# Strip leading zeros
BUS=$(echo $ZeroBUS | sed 's/^0*//')
# Build "usbX" usb number
USB=usb$BUS
case $1 in
suspend|suspend_hybrid|hibernate)
echo "Powering off: " $USB
echo $USB | sudo tee /sys/bus/usb/drivers/usb/unbind
;;
resume|thaw)
# No need to do anything here, kernel unsuspends USB devices
# Show how to power on for interest sake but since device is
# powered off the usb number will be blank.
echo "Powering on: " $USB
echo $USB | sudo tee /sys/bus/usb/drivers/usb/bind
;;
esac
Mark the file as executable with sudo chmod +x file_name
where "file_name" is the name you chose.
The explanation
This solution powers off the entire USB hub which in my case meant phone, wireless mouse, wireless keyboard, etc. When calling the script from terminal prompt the sudo password needs to be entered. Hopefully when called from systemd sudo powers are inherited. I could not test this though because I don't have a wired mouse. Therefore additional refinement may be necessary for sudo powers.
The power isn't physically cut when the BIOS is providing constant 5V power supply, rather the devices on the bus are told to turn themselves off. In my case the wireless keyboard and mouse stopped working and had to resort to laptop keyboard and touchpad to return power back on.
You can test this manually by calling the script and passing the parameters "suspend". Passing the parameter "resume" accomplishes nothing because the device is powered off it has no device ID to turn it back on.
Easier solution power off all USB ports
I recently ran into a problem where an unknown port was preventing laptop from suspending. I found this solution (credit in code) which I modified.
Create the file /lib/systemd/system-sleep/custom-xhci_hcd
using sudo
powers and insert this code:
#!/bin/bash
# Original script was using /bin/sh but shellcheck reporting warnings.
# NAME: custom-xhci_hcd
# PATH: /lib/systemd/system-sleep
# CALL: Called from SystemD automatically
# DESC: Suspend broken for USB3.0 as of Oct 25/2018 various kernels all at once
# DATE: Oct 28 2018.
# NOTE: From comment #61 at: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/522998
TMPLIST=/tmp/xhci-dev-list
# Original script was: case "${1}" in hibernate|suspend)
case $1/$2 in
pre/*)
echo "$0: Going to $2..."
echo -n '' > $TMPLIST
for i in `ls /sys/bus/pci/drivers/xhci_hcd/ | egrep '[0-9a-z]+\:[0-9a-z]+\:.*$'`; do
# Unbind xhci_hcd for first device XXXX:XX:XX.X:
echo -n "$i" | tee /sys/bus/pci/drivers/xhci_hcd/unbind
echo "$i" >> $TMPLIST
done
;;
post/*)
echo "$0: Waking up from $2..."
for i in `cat $TMPLIST`; do
# Bind xhci_hcd for first device XXXX:XX:XX.X:
echo -n "$i" | tee /sys/bus/pci/drivers/xhci_hcd/bind
done
rm $TMPLIST
;;
esac
Best Answer
It's PowerNap that's doing this.
You can disable just this part of PowerNap's power savings scripts with: