On Tuesday 25 January 2005 12:00 am, [EMAIL PROTECTED] wrote:
> I use Slackware 10 with kernel 2.6.10 on a notebook Acer Aspire 1621LM
> (P4 2.8Ghz, ATI MOBILITY RADEON 9100 IGP Chipset).
>
> My problem was that all of my usb 2.0 devices (a pendrive and an external
> hdd) work in full
> speed mode (12 Mbit/s) and not in high speed mode (480 Mbit/s).
Various folk have been reporting similar problems recently. Some boards
have the problem, some don't ... it's evidently not specific to any
particular chipset.
> The only way I found to solve the problem is unload the usb modules and
> reload them in a specific order.
> I put in rc.local this 4 lines:
> rmmod ohci_hcd
> rmmod ehci_hcd
> modprobe ehci_hcd
> modprobe ohci_hcd
>
> With this workaround everything is fine.
Well, you _should_ load EHCI before OHCI, but doing it the other way around
shouldn't cause failures anything like you saw. You should probably suggest
to the Slackware folk that they modprobe EHCI first ... but that's not the
root cause of your problem.
> All details (including dmesg, usb/devices, usbtree) are listed at:
> http://www.linuxquestions.org/questions/showthread.php?s=&threadid=271226
>
> Now my question is:
> Where is the error/bug ? In the kernel ? In the usb modules ? In a script ?
We've been puzzled by this too. Does this patch change the behavior
you're seeing?
- Dave
Minor hub driver tweaks:
- Add missing delay of TRSTRCY after port reset; this may help some devices
that aren't talking to khubd immediately after resetting. (Behavior of
attempts to talk to device then is "undefined".)
- After port overcurrent change, wait for overcurrent status to clear before
turning (port) power back on.
Both of these changes seem to reflect bugs in the current hub driver, which
could explain problems we've been seeing with some EHCI configurations.
--- 1.161/drivers/usb/core/hub.c 2005-01-20 14:33:35 -08:00
+++ edited/drivers/usb/core/hub.c 2005-01-24 14:46:05 -08:00
@@ -1382,6 +1382,9 @@
/* return on disconnect or reset */
switch (status) {
case 0:
+ /* TRSTRCY -- reset recovery */
+ msleep (10);
+ /* FALL THROUGH */
case -ENOTCONN:
case -ENODEV:
clear_port_feature(hub->hdev,
@@ -2706,7 +2709,8 @@
i);
clear_port_feature(hdev, i,
USB_PORT_FEAT_C_OVER_CURRENT);
- hub_power_on(hub);
+ if (!(portstatus & USB_PORT_STAT_OVERCURRENT))
+ hub_power_on(hub);
}
if (portchange & USB_PORT_STAT_C_RESET) {
@@ -2729,11 +2733,11 @@
dev_err (hub_dev, "get_hub_status failed\n");
else {
if (hubchange & HUB_CHANGE_LOCAL_POWER) {
- dev_dbg (hub_dev, "power change\n");
+ dev_dbg (hub_dev, "hub power change\n");
clear_hub_feature(hdev, C_HUB_LOCAL_POWER);
}
if (hubchange & HUB_CHANGE_OVERCURRENT) {
- dev_dbg (hub_dev, "overcurrent change\n");
+ dev_dbg (hub_dev, "hub over-current change\n");
msleep(500); /* Cool down */
clear_hub_feature(hdev, C_HUB_OVER_CURRENT);
hub_power_on(hub);