]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
usb: Correct CLEAR_FEATURE code in ehci-hcd
authorSimon Glass <sjg@chromium.org>
Sat, 11 May 2013 02:49:00 +0000 (19:49 -0700)
committerMarek Vasut <marex@denx.de>
Wed, 12 Jun 2013 20:22:50 +0000 (22:22 +0200)
This commit broke USB2 on link (Chromebook Pixel):

  020bbcb usb: hub: Power-cycle on root-hub ports

However the root cause seems to be a missing mask and missing 'break'
in ehci-hcd.c. This patch fixes both.

On link, 'usb start' with a USB keyboard and memory stick inserted now
finds both. The keyboard works as expected. Also ext2ls shows a directory
listing from the memory stick.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/usb/host/ehci-hcd.c

index e0f3e4b6c788bf3e3d78dcf929c652f5e971845c..445759b9ac1aed2429ea439f14b23c99f4e15ed3 100644 (file)
@@ -809,21 +809,23 @@ ehci_submit_root(struct usb_device *dev, unsigned long pipe, void *buffer,
                break;
        case USB_REQ_CLEAR_FEATURE | ((USB_DIR_OUT | USB_RT_PORT) << 8):
                reg = ehci_readl(status_reg);
+               reg &= ~EHCI_PS_CLEAR;
                switch (le16_to_cpu(req->value)) {
                case USB_PORT_FEAT_ENABLE:
                        reg &= ~EHCI_PS_PE;
                        break;
                case USB_PORT_FEAT_C_ENABLE:
-                       reg = (reg & ~EHCI_PS_CLEAR) | EHCI_PS_PE;
+                       reg |= EHCI_PS_PE;
                        break;
                case USB_PORT_FEAT_POWER:
                        if (HCS_PPC(ehci_readl(&ctrl->hccr->cr_hcsparams)))
-                               reg = reg & ~(EHCI_PS_CLEAR | EHCI_PS_PP);
+                               reg &= ~EHCI_PS_PP;
+                       break;
                case USB_PORT_FEAT_C_CONNECTION:
-                       reg = (reg & ~EHCI_PS_CLEAR) | EHCI_PS_CSC;
+                       reg |= EHCI_PS_CSC;
                        break;
                case USB_PORT_FEAT_OVER_CURRENT:
-                       reg = (reg & ~EHCI_PS_CLEAR) | EHCI_PS_OCC;
+                       reg |= EHCI_PS_OCC;
                        break;
                case USB_PORT_FEAT_C_RESET:
                        ctrl->portreset &= ~(1 << port);