On Fri, May 10, 2002 at 07:00:08PM +0200, Eduard Hasenleithner wrote: > Hello again! > > As mentioned on the -users list I have a problem with > my sl11r USB/IDE adapter + harddisk. The initial > messages when connecting are: > > May 10 18:04:43 editower kernel: hub.c: USB new device connect on bus2/2, assigned >device number 2 > May 10 18:04:43 editower kernel: usb-uhci.c: interrupt, status 2, frame# 54 > May 10 18:04:43 editower kernel: usb.c: USB device not accepting new address=2 >(error=-110) > May 10 18:04:44 editower kernel: hub.c: USB new device connect on bus2/2, assigned >device number 3 > May 10 18:04:44 editower kernel: usb.c: USB device not accepting new address=3 >(error=-110) > > But when unloading and reloading the chipset driver > (usb-uhci) the device is recorgnised properly. This
The usual problem, I have found similar behavior with other devices. But the delay-patch fixes only a small part of all occurrences. A long time ago, I proposed an change to the usb_new_device()-procedure, which retries setting the ID and the getting the descriptor if something fails. So its behavior is more forgiving and ehh... Windows-like :-) I have attached the (old) patch, it maybe needs some adjustment for 2.4.19 or 2.5, but I suggest that it should be included. Some devices (e.g. a USB-audio adaptor with a Philips chip or early bluetooth interfaces) won't work without it. Since it doesn't touch the timing for working devices, it should be pretty safe... -- Georg Acher, [EMAIL PROTECTED] http://www.in.tum.de/~acher/ "Oh no, not again !" The bowl of petunias
diff -u linux/drivers/usb/usb.c linux.afs/drivers/usb/usb.c --- linux/drivers/usb/usb.c Tue Aug 7 10:48:27 2001 +++ linux.afs/drivers/usb/usb.c Wed Aug 29 16:55:26 2001 @@ -2169,6 +2169,7 @@ int usb_new_device(struct usb_device *dev) { int err; + int n,m; /* USB v1.1 5.5.3 */ /* We read the first 8 bytes from the device descriptor to get to */ @@ -2177,18 +2178,31 @@ dev->epmaxpacketin [0] = 8; dev->epmaxpacketout[0] = 8; - err = usb_set_address(dev); - if (err < 0) { - err("USB device not accepting new address=%d (error=%d)", - dev->devnum, err); - clear_bit(dev->devnum, &dev->bus->devmap.devicemap); - dev->devnum = -1; - return 1; - } + for(m=0;m<2;m++) { + + for(n=0;n<2;n++) { + err = usb_set_address(dev); + if (err>=0) + break; + wait_ms(200); + } + + if (err < 0) { + err("USB device not accepting new address=%d (error=%d)", + dev->devnum, err); + clear_bit(dev->devnum, &dev->bus->devmap.devicemap); + dev->devnum = -1; + return 1; + } - wait_ms(10); /* Let the SET_ADDRESS settle */ + wait_ms(10); /* Let the SET_ADDRESS settle */ - err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, 8); + err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, 8); + if (err >= 8) + break; + wait_ms(100); + } + if (err < 8) { if (err < 0) err("USB device not responding, giving up (error=%d)", err); @@ -2198,6 +2212,7 @@ dev->devnum = -1; return 1; } + dev->epmaxpacketin [0] = dev->descriptor.bMaxPacketSize0; dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;