From: Alan Stern <stern@rowland.harvard.edu>

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 <akpm@osdl.org>
---

 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
_