USB: xhci: Set correct max packet size for HS/FS control endpoints.
authorSarah Sharp <sarah.a.sharp@linux.intel.com>
Fri, 7 Aug 2009 21:04:46 +0000 (14:04 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 23 Sep 2009 13:46:17 +0000 (06:46 -0700)
Set the max packet size for the default control endpoint on high speed
devices to be 64 bytes.  High speed devices always have a max packet size
of 64 bytes.  There's no use setting it to eight for the initial 8 byte
descriptor fetch and then issuing (and waiting for) an evaluate context
command to update it to 64 bytes for the subsequent control transfers.

The USB core guesses that the max packet size on a full speed control
endpoint is 64 bytes, and then updates it after the first 8-byte
descriptor fetch.  Change the initial setup for the xHCI internal
representation of the full speed device to have a 64 byte max packet size.

Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Cc: stable <stable@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/host/xhci-mem.c

index c5313c8..55920b3 100644 (file)
@@ -401,15 +401,28 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud
        /* Step 5 */
        ep0_ctx->ep_info2 = EP_TYPE(CTRL_EP);
        /*
-        * See section 4.3 bullet 6:
-        * The default Max Packet size for ep0 is "8 bytes for a USB2
-        * LS/FS/HS device or 512 bytes for a USB3 SS device"
         * XXX: Not sure about wireless USB devices.
         */
-       if (udev->speed == USB_SPEED_SUPER)
+       switch (udev->speed) {
+       case USB_SPEED_SUPER:
                ep0_ctx->ep_info2 |= MAX_PACKET(512);
-       else
+               break;
+       case USB_SPEED_HIGH:
+       /* USB core guesses at a 64-byte max packet first for FS devices */
+       case USB_SPEED_FULL:
+               ep0_ctx->ep_info2 |= MAX_PACKET(64);
+               break;
+       case USB_SPEED_LOW:
                ep0_ctx->ep_info2 |= MAX_PACKET(8);
+               break;
+       case USB_SPEED_VARIABLE:
+               xhci_dbg(xhci, "FIXME xHCI doesn't support wireless speeds\n");
+               return -EINVAL;
+               break;
+       default:
+               /* New speed? */
+               BUG();
+       }
        /* EP 0 can handle "burst" sizes of 1, so Max Burst Size field is 0 */
        ep0_ctx->ep_info2 |= MAX_BURST(0);
        ep0_ctx->ep_info2 |= ERROR_COUNT(3);