]> git.hungrycats.org Git - linux/commitdiff
[PATCH] USB: usb enumeration clears full speed ep0 state
authorDavid Brownell <david-b@pacbell.net>
Thu, 23 Oct 2003 15:07:41 +0000 (08:07 -0700)
committerGreg Kroah-Hartman <greg@kroah.com>
Thu, 23 Oct 2003 15:07:41 +0000 (08:07 -0700)
This resolves a bug that was recently reported to me by someone
enumerating a USB 1.1 modem through a high speed hub.  I'm a bit
surprised we never saw it before; I think cache/dma timings must
usually be strongly in our favor.

The problem was that the HC was still using the old ep0 maxpacket
value, so when it received an 18 byte device descriptor it would
report a packet overrun and enumeration would fail.  The fix is
straightforward:  invalidate the HC's old endpoint state when we
change the full speed maxpacket size.  (And eventually, we can
remove EHCI and OHCI code coping with usbcore not doing this.)

drivers/usb/core/usb.c

index 5d2b6ebdf517c58cc4e1420b05af45055a64f658..3fad1ec8b4a34434bc0d7de292fcaf6a39fd1f3f 100644 (file)
@@ -1063,6 +1063,9 @@ int usb_new_device(struct usb_device *dev, struct device *parent)
                goto fail;
        }
        if (dev->speed == USB_SPEED_FULL) {
+               usb_disable_endpoint(dev, 0);
+               usb_endpoint_running(dev, 0, 1);
+               usb_endpoint_running(dev, 0, 0);
                dev->epmaxpacketin [0] = dev->descriptor.bMaxPacketSize0;
                dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
        }