Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I've updated my HTPC from kernel 3.7.10 to 3.10.7 and it seems CONFIG_USB_SUSPEND is now gone from the kernel options and included in PM.

The main problem I'm facing is that I have an external HDD and when suspending and waking up the HTPC, it isn't available to the system. The HDD wakes up (you can hear it spin up again), but when you try to access the mount point you get the following error:

ZOTAC ~ # ls /media
ls: reading directory /media: Input/output error

And on dmesg:

[  253.278260] EXT4-fs warning (device sdb1): __ext4_read_dirblock:908: error reading   directory block (ino 2, block 0)

In previous kernels, setting CONFIG_USB_SUSPEND=N would solve the problem, as the HDD would handle its hibernation by itself and the mount point was always accesible. When the HDD was on sleep and the HTPC needed something from the HDD's mount point, the HDD itself would wake up and operate without issues.

Right now I've tried the following without success:

  1. Manually change /sys/bus/usb/devices/usb*/power/control to "on" instead of "auto".
  2. Manually change /sys/bus/usb/devices/usb*/power/autosuspend to "-1" instead of "0".

But when waking up again the HTPC, the mount point is again inaccesible. As workarround I can unmount and remount the mount point and it works again without problems, but I'm sure there should be a way to avoid having the OS handle the usb autosuspend.

Any idea how to disable usb autosuspend on kernel 3.7.10 or above?

share|improve this question
    
Does tail /sys/bus/usb/devices/<BUS>-<DEVPATH>/power/persist give you 1? Does grep CONFIG_PM_RUNTIME /boot/config-$(uname -r) give you y? power-management.txt –  Sukminder Oct 8 '13 at 4:24
    
power/persist gives 1 and I don't have any config file in /boot. CONFIG_PM_RUNTIME=y is configured in the kernel's .config file. –  Peter Oct 9 '13 at 14:05

3 Answers 3

According to the kernel tree documentation, the autosuspend idle-delay time is controlled by the autosuspend module parameter in usbcore. Setting the initial default idle-delay to -1 will prevent the autosuspend of any USB device. You should still be able to to enable autosuspend for selected devices.

The usbcore.autosuspend kernel parameter can be set when the module is loaded manually:

$ modprobe usbcore autosuspend=-1

or by adding the following line to a configuration file in /etc/modprobe.d:

options usbcore autosuspend=-1

If usbcore is compiled into the kernel, parameter can be adjusted by adding the following to the kernel command line:

usbcore.autosuspend=-1

Lastly, the option may be adjusted at runtime by doing:

echo -1 >/sys/module/usbcore/parameters/autosuspend

The change will affect all new USB devices. Already existing devices will not be affected.

share|improve this answer
1  
I have usbcore compiled into the kernel, but using the modprobe.d option doesn't seem to work. Despite modprobe -c usbcore | grep autosuspend displays it as -1, doing cat /sys/module/usbcore/parameters/autosuspend I get 2 –  Peter Oct 9 '13 at 14:08
    
@Peter: autosuspend is deprecated. The new file is autosuspend_delay_ms which takes ms instead of seconds. ref. But power/control set to on should have same effect. –  Sukminder Oct 9 '13 at 18:21
    
@Sukminder, what should I configure then to keep autosuspend disabled forever? I've tried using autosuspend=-1 in both modprobe.d and kernel parameter, but the HDD still suspends and doesn't wake up nicely. –  Peter Oct 10 '13 at 8:12
1  
@Peter: If I knew I'll tell you :). I'm only quoting what doc. says. Your pt. 1 in your post should have done it as far as I can tell, I have no idea why it does not. Have you tried to set autosuspend_delay_ms to -1? (In /sys/bus/usb/devices/<device>/power/autosuspend_delay_ms) –  Sukminder Oct 10 '13 at 8:51

I have a similar issue with a Microsoft Wheel Mouse Optical USB and PS/2 Compatible since upgrading a Linux Mint Debian Edition system to kernel 3.10-2-amd64. An inappropriate autosuspend by the kernel's USB power management was suspected. In Debian, this is compiled as the usbcore module into the kernel.

You can change this permanently by issuing at the command line:

sudo echo "options usbcore autosuspend=-1" | sudo tee /etc/modprobe.d/disable-usb-autosuspend.conf > /dev/null

Some kernels might require autosuspend=0, though.

If your system uses initrd (most probably does), then rebuild the initrd for your kernel.

For example:

uname -r
sudo dpkg-reconfigure linux-image-3.10-2-amd64

Reboot and check with:

cat /sys/module/usbcore/parameters/autosuspend

which should yield -1 now.

share|improve this answer
    
I don't use initrd and the actions described here don't work in this case, as they we're answered before. –  Peter Oct 22 '13 at 12:48

For Ubuntu, usbcore is compiled in the kernel, so create entries on /etc/modprobe.d will NOT work: we need to change the kernel boot parameters.

Edit the /etc/default/grub file and change the GRUB_CMDLINE_LINUX_DEFAULT line to add the usbcore.autosuspend=-1 option:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash usbcore.autosuspend=-1"

Note that quit splash were already present options. So keep other options you have too.

After save the file, update grub:

sudo update-grub

And reboot.

Now check autosuspend value:

cat /sys/module/usbcore/parameters/autosuspend

And it should display -1.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.