From: Alan Stern On Thu, 10 Jun 2004, Nicolas Mailhot wrote: > Well, this fixes the oops all right. > Unfortunately, this does not fix the functionality - the usb devices are > still dead on bootup. Try out this patch instead. It puts the TT initialization back the way it used to be before I changed it. Signed-off-by: Andrew Morton --- 25-akpm/drivers/usb/core/hub.c | 23 +++++++++++++---------- 1 files changed, 13 insertions(+), 10 deletions(-) diff -puN drivers/usb/core/hub.c~usb-tt-oops-fix drivers/usb/core/hub.c --- 25/drivers/usb/core/hub.c~usb-tt-oops-fix 2004-06-13 21:08:36.828801808 -0700 +++ 25-akpm/drivers/usb/core/hub.c 2004-06-13 21:08:36.833801048 -0700 @@ -1405,6 +1405,19 @@ hub_port_init (struct usb_device *hdev, default: speed = "?"; break; }; speed;}), udev->devnum); + + /* Set up TT records, if needed */ + if (hdev->tt) { + udev->tt = hdev->tt; + udev->ttport = hdev->ttport; + } else if (udev->speed != USB_SPEED_HIGH + && hdev->speed == USB_SPEED_HIGH) { + struct usb_hub *hub; + + hub = usb_get_intfdata(hdev->actconfig->interface[0]); + udev->tt = &hub->tt; + udev->ttport = port + 1; + } /* Why interleave GET_DESCRIPTOR and SET_ADDRESS this way? * Because device hardware and firmware is sometimes buggy in @@ -1615,16 +1628,6 @@ static void hub_port_connect_change(stru if (status < 0) goto loop; - /* Set up TT records, if needed */ - if (hdev->tt) { - udev->tt = hdev->tt; - udev->ttport = hdev->ttport; - } else if (udev->speed != USB_SPEED_HIGH - && hdev->speed == USB_SPEED_HIGH) { - udev->tt = &hub->tt; - udev->ttport = port + 1; - } - /* consecutive bus-powered hubs aren't reliable; they can * violate the voltage drop budget. if the new child has * a "powered" LED, users should notice we didn't enable it _