Monday, April 23, 2012

Linux: Reset High Speed USB Device Using ehci_hcd Error and Solution

I've recently installed CentOS / RHEL 6.x on the server. I'm getting the following messages in /var/log/messages file logged frequently :
Oct 13 14:00:20 server1 kernel: usb 1-7: reset high speed USB device using ehci_hcd and address 2
Oct 13 14:05:57 server1 kernel: usb 1-7: reset high speed USB device using ehci_hcd and address 2
Oct 13 14:09:18 server1 kernel: usb 1-7: reset high speed USB device using ehci_hcd and address 2
Oct 13 14:11:42 server1 kernel: usb 1-7: reset high speed USB device using ehci_hcd and address 2
Oct 13 14:11:49 server1 kernel: usb 1-7: reset high speed USB device using ehci_hcd and address 2
How do I solve this problem?

The Enhanced Host Controller Interface (EHCI) is a register-level interface that enables a host controller for USB or FireWire hardware to communicate with a host controller driver in software. In this case USB revision 2.0. ehci-hcd.ko is USB 2.0 'Enhanced' Host Controller (EHCI) driver. This error indicates that USB 2.0 may not function on your system, or may function only at USB 1.1 speeds. To fix this problem:
  1. Replace hardware: In most cases you need to replace the motherboard.
  2. Remove ehci_hcd driver
  3. Disable ehci_hcd drive USB 2.0 interface and use it as USB 1.1. In short disable the ehci_hcd.

How Do I Find Out More Info About EHCI Controller?

Type the following command:
# lspci |grep -i ehci
Sample outputs:
00:1d.7 USB Controller: Intel Corporation 631xESB/632xESB/3100 Chipset EHCI USB2 Controller (rev 09)
You can also use the lsusb command to get detailed information about USB buses in the system and the devices connected to them:
# lsusb
# lsusb -v | less

Linux: Remove ehci_hcd Driver

You need to blacklist ehci_hcd driver by editing /etc/modprobe.d/blacklist.conf file, enter:
# vi /etc/modprobe.d/blacklist.conf
You need to list / add a module here to prevent the hotplug scripts from loading it:
blacklist ehci_hcd
Save and close the file. Finally, use the mkinitrd script to constructs a directory structure that can serve as an initrd root file system without ehci_hcd:
# mkinitrd -o /boot/initrd.$(uname -r).img $(uname -r)
For testing purpose reboot the system:
# reboot

Linux: Disable ehci_hcd Driver

To unbind the ehci_hcd drive support type the following commands:
# cd /sys/bus/pci/drivers/ehci_hcd/
# ls -l

Sample outputs:
lrwxrwxrwx. 1 root root    0 Oct 13 17:29 0000:00:1d.7 -> ../../../../devices/pci0000:00/0000:00:1d.7
--w-------. 1 root root 4096 Oct 13 17:29 bind
lrwxrwxrwx. 1 root root 0 Oct 13 17:29 module -> ../../../../module/ehci_hcd
--w-------. 1 root root 4096 Oct 13 17:29 new_id
--w-------. 1 root root 4096 Oct 13 17:29 remove_id
--w-------. 1 root root 4096 Oct 13 17:29 uevent
--w-------. 1 root root 4096 Oct 13 17:29 unbind
Type the following command:
# echo -n "0000:00:1d.7" > /sys/bus/pci/drivers/ehci_hcd/unbind
This will run USB in 1.1 speed. You will not see message and/or you will able to use the USB device itself. Simply add the above command to /etc/rc.local so that it will work after rebooting the system.

No comments:

Post a Comment