diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-06-20 19:24:02 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-06-20 19:24:02 -0400 |
| commit | ff446f2001cf9b5ed97c6256c4ee3549d3b7abed (patch) | |
| tree | ec5fd60a8b9c21ae85eaa99003f26e6c342e2234 /drivers/usb | |
| parent | 78091dc2f6f04b03131218df590c877cadcd9379 (diff) | |
| parent | 485802a6c524e62b5924849dd727ddbb1497cc71 (diff) | |
Merge 3.5-rc3 into usb-next
This lets us catch the USB fixes that went into 3.5-rc3 into this branch,
as we want them here as well.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb')
| -rw-r--r-- | drivers/usb/class/cdc-acm.c | 8 | ||||
| -rw-r--r-- | drivers/usb/core/hub.c | 2 | ||||
| -rw-r--r-- | drivers/usb/core/message.c | 3 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-hcd.c | 2 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-omap.c | 168 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-sh.c | 3 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-xilinx-of.c | 4 | ||||
| -rw-r--r-- | drivers/usb/host/ohci-hub.c | 2 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-mem.c | 74 | ||||
| -rw-r--r-- | drivers/usb/host/xhci.c | 10 | ||||
| -rw-r--r-- | drivers/usb/serial/usb-serial.c | 6 | ||||
| -rw-r--r-- | drivers/usb/storage/unusual_devs.h | 7 |
12 files changed, 222 insertions, 67 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index f2a120eea9d4..36a2a0b7b82c 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -567,6 +567,14 @@ static int acm_port_activate(struct tty_port *port, struct tty_struct *tty) | |||
| 567 | 567 | ||
| 568 | usb_autopm_put_interface(acm->control); | 568 | usb_autopm_put_interface(acm->control); |
| 569 | 569 | ||
| 570 | /* | ||
| 571 | * Unthrottle device in case the TTY was closed while throttled. | ||
| 572 | */ | ||
| 573 | spin_lock_irq(&acm->read_lock); | ||
| 574 | acm->throttled = 0; | ||
| 575 | acm->throttle_req = 0; | ||
| 576 | spin_unlock_irq(&acm->read_lock); | ||
| 577 | |||
| 570 | if (acm_submit_read_urbs(acm, GFP_KERNEL)) | 578 | if (acm_submit_read_urbs(acm, GFP_KERNEL)) |
| 571 | goto error_submit_read_urbs; | 579 | goto error_submit_read_urbs; |
| 572 | 580 | ||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 04fb834c3fa1..25a7422ee657 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -3379,7 +3379,7 @@ int usb_disable_lpm(struct usb_device *udev) | |||
| 3379 | return 0; | 3379 | return 0; |
| 3380 | 3380 | ||
| 3381 | udev->lpm_disable_count++; | 3381 | udev->lpm_disable_count++; |
| 3382 | if ((udev->u1_params.timeout == 0 && udev->u1_params.timeout == 0)) | 3382 | if ((udev->u1_params.timeout == 0 && udev->u2_params.timeout == 0)) |
| 3383 | return 0; | 3383 | return 0; |
| 3384 | 3384 | ||
| 3385 | /* If LPM is enabled, attempt to disable it. */ | 3385 | /* If LPM is enabled, attempt to disable it. */ |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index ca7fc392fd9e..8b9d669e3784 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
| @@ -1839,7 +1839,6 @@ free_interfaces: | |||
| 1839 | intfc = cp->intf_cache[i]; | 1839 | intfc = cp->intf_cache[i]; |
| 1840 | intf->altsetting = intfc->altsetting; | 1840 | intf->altsetting = intfc->altsetting; |
| 1841 | intf->num_altsetting = intfc->num_altsetting; | 1841 | intf->num_altsetting = intfc->num_altsetting; |
| 1842 | intf->intf_assoc = find_iad(dev, cp, i); | ||
| 1843 | kref_get(&intfc->ref); | 1842 | kref_get(&intfc->ref); |
| 1844 | 1843 | ||
| 1845 | alt = usb_altnum_to_altsetting(intf, 0); | 1844 | alt = usb_altnum_to_altsetting(intf, 0); |
| @@ -1852,6 +1851,8 @@ free_interfaces: | |||
| 1852 | if (!alt) | 1851 | if (!alt) |
| 1853 | alt = &intf->altsetting[0]; | 1852 | alt = &intf->altsetting[0]; |
| 1854 | 1853 | ||
| 1854 | intf->intf_assoc = | ||
| 1855 | find_iad(dev, cp, alt->desc.bInterfaceNumber); | ||
| 1855 | intf->cur_altsetting = alt; | 1856 | intf->cur_altsetting = alt; |
| 1856 | usb_enable_interface(dev, intf, true); | 1857 | usb_enable_interface(dev, intf, true); |
| 1857 | intf->dev.parent = &dev->dev; | 1858 | intf->dev.parent = &dev->dev; |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index b100f5f9f4b6..800be38c78b4 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
| @@ -671,7 +671,9 @@ static int ehci_init(struct usb_hcd *hcd) | |||
| 671 | hw = ehci->async->hw; | 671 | hw = ehci->async->hw; |
| 672 | hw->hw_next = QH_NEXT(ehci, ehci->async->qh_dma); | 672 | hw->hw_next = QH_NEXT(ehci, ehci->async->qh_dma); |
| 673 | hw->hw_info1 = cpu_to_hc32(ehci, QH_HEAD); | 673 | hw->hw_info1 = cpu_to_hc32(ehci, QH_HEAD); |
| 674 | #if defined(CONFIG_PPC_PS3) | ||
| 674 | hw->hw_info1 |= cpu_to_hc32(ehci, (1 << 7)); /* I = 1 */ | 675 | hw->hw_info1 |= cpu_to_hc32(ehci, (1 << 7)); /* I = 1 */ |
| 676 | #endif | ||
| 675 | hw->hw_token = cpu_to_hc32(ehci, QTD_STS_HALT); | 677 | hw->hw_token = cpu_to_hc32(ehci, QTD_STS_HALT); |
| 676 | hw->hw_qtd_next = EHCI_LIST_END(ehci); | 678 | hw->hw_qtd_next = EHCI_LIST_END(ehci); |
| 677 | ehci->async->qh_state = QH_STATE_LINKED; | 679 | ehci->async->qh_state = QH_STATE_LINKED; |
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c index a44294d13494..17cfb8a1131c 100644 --- a/drivers/usb/host/ehci-omap.c +++ b/drivers/usb/host/ehci-omap.c | |||
| @@ -43,6 +43,7 @@ | |||
| 43 | #include <linux/regulator/consumer.h> | 43 | #include <linux/regulator/consumer.h> |
| 44 | #include <linux/pm_runtime.h> | 44 | #include <linux/pm_runtime.h> |
| 45 | #include <linux/gpio.h> | 45 | #include <linux/gpio.h> |
| 46 | #include <linux/clk.h> | ||
| 46 | 47 | ||
| 47 | /* EHCI Register Set */ | 48 | /* EHCI Register Set */ |
| 48 | #define EHCI_INSNREG04 (0xA0) | 49 | #define EHCI_INSNREG04 (0xA0) |
| @@ -55,6 +56,15 @@ | |||
| 55 | #define EHCI_INSNREG05_ULPI_EXTREGADD_SHIFT 8 | 56 | #define EHCI_INSNREG05_ULPI_EXTREGADD_SHIFT 8 |
| 56 | #define EHCI_INSNREG05_ULPI_WRDATA_SHIFT 0 | 57 | #define EHCI_INSNREG05_ULPI_WRDATA_SHIFT 0 |
| 57 | 58 | ||
| 59 | /* Errata i693 */ | ||
| 60 | static struct clk *utmi_p1_fck; | ||
| 61 | static struct clk *utmi_p2_fck; | ||
| 62 | static struct clk *xclk60mhsp1_ck; | ||
| 63 | static struct clk *xclk60mhsp2_ck; | ||
| 64 | static struct clk *usbhost_p1_fck; | ||
| 65 | static struct clk *usbhost_p2_fck; | ||
| 66 | static struct clk *init_60m_fclk; | ||
| 67 | |||
| 58 | /*-------------------------------------------------------------------------*/ | 68 | /*-------------------------------------------------------------------------*/ |
| 59 | 69 | ||
| 60 | static const struct hc_driver ehci_omap_hc_driver; | 70 | static const struct hc_driver ehci_omap_hc_driver; |
| @@ -70,6 +80,41 @@ static inline u32 ehci_read(void __iomem *base, u32 reg) | |||
| 70 | return __raw_readl(base + reg); | 80 | return __raw_readl(base + reg); |
| 71 | } | 81 | } |
| 72 | 82 | ||
| 83 | /* Erratum i693 workaround sequence */ | ||
| 84 | static void omap_ehci_erratum_i693(struct ehci_hcd *ehci) | ||
| 85 | { | ||
| 86 | int ret = 0; | ||
| 87 | |||
| 88 | /* Switch to the internal 60 MHz clock */ | ||
| 89 | ret = clk_set_parent(utmi_p1_fck, init_60m_fclk); | ||
| 90 | if (ret != 0) | ||
| 91 | ehci_err(ehci, "init_60m_fclk set parent" | ||
| 92 | "failed error:%d\n", ret); | ||
| 93 | |||
| 94 | ret = clk_set_parent(utmi_p2_fck, init_60m_fclk); | ||
| 95 | if (ret != 0) | ||
| 96 | ehci_err(ehci, "init_60m_fclk set parent" | ||
| 97 | "failed error:%d\n", ret); | ||
| 98 | |||
| 99 | clk_enable(usbhost_p1_fck); | ||
| 100 | clk_enable(usbhost_p2_fck); | ||
| 101 | |||
| 102 | /* Wait 1ms and switch back to the external clock */ | ||
| 103 | mdelay(1); | ||
| 104 | ret = clk_set_parent(utmi_p1_fck, xclk60mhsp1_ck); | ||
| 105 | if (ret != 0) | ||
| 106 | ehci_err(ehci, "xclk60mhsp1_ck set parent" | ||
| 107 | "failed error:%d\n", ret); | ||
| 108 | |||
| 109 | ret = clk_set_parent(utmi_p2_fck, xclk60mhsp2_ck); | ||
| 110 | if (ret != 0) | ||
| 111 | ehci_err(ehci, "xclk60mhsp2_ck set parent" | ||
| 112 | "failed error:%d\n", ret); | ||
| 113 | |||
| 114 | clk_disable(usbhost_p1_fck); | ||
| 115 | clk_disable(usbhost_p2_fck); | ||
| 116 | } | ||
| 117 | |||
| 73 | static void omap_ehci_soft_phy_reset(struct platform_device *pdev, u8 port) | 118 | static void omap_ehci_soft_phy_reset(struct platform_device *pdev, u8 port) |
| 74 | { | 119 | { |
| 75 | struct usb_hcd *hcd = dev_get_drvdata(&pdev->dev); | 120 | struct usb_hcd *hcd = dev_get_drvdata(&pdev->dev); |
| @@ -100,6 +145,50 @@ static void omap_ehci_soft_phy_reset(struct platform_device *pdev, u8 port) | |||
| 100 | } | 145 | } |
| 101 | } | 146 | } |
| 102 | 147 | ||
| 148 | static int omap_ehci_hub_control( | ||
| 149 | struct usb_hcd *hcd, | ||
| 150 | u16 typeReq, | ||
| 151 | u16 wValue, | ||
| 152 | u16 wIndex, | ||
| 153 | char *buf, | ||
| 154 | u16 wLength | ||
| 155 | ) | ||
| 156 | { | ||
| 157 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | ||
| 158 | u32 __iomem *status_reg = &ehci->regs->port_status[ | ||
| 159 | (wIndex & 0xff) - 1]; | ||
| 160 | u32 temp; | ||
| 161 | unsigned long flags; | ||
| 162 | int retval = 0; | ||
| 163 | |||
| 164 | spin_lock_irqsave(&ehci->lock, flags); | ||
| 165 | |||
| 166 | if (typeReq == SetPortFeature && wValue == USB_PORT_FEAT_SUSPEND) { | ||
| 167 | temp = ehci_readl(ehci, status_reg); | ||
| 168 | if ((temp & PORT_PE) == 0 || (temp & PORT_RESET) != 0) { | ||
| 169 | retval = -EPIPE; | ||
| 170 | goto done; | ||
| 171 | } | ||
| 172 | |||
| 173 | temp &= ~PORT_WKCONN_E; | ||
| 174 | temp |= PORT_WKDISC_E | PORT_WKOC_E; | ||
| 175 | ehci_writel(ehci, temp | PORT_SUSPEND, status_reg); | ||
| 176 | |||
| 177 | omap_ehci_erratum_i693(ehci); | ||
| 178 | |||
| 179 | set_bit((wIndex & 0xff) - 1, &ehci->suspended_ports); | ||
| 180 | goto done; | ||
| 181 | } | ||
| 182 | |||
| 183 | spin_unlock_irqrestore(&ehci->lock, flags); | ||
| 184 | |||
| 185 | /* Handle the hub control events here */ | ||
| 186 | return ehci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength); | ||
| 187 | done: | ||
| 188 | spin_unlock_irqrestore(&ehci->lock, flags); | ||
| 189 | return retval; | ||
| 190 | } | ||
| 191 | |||
| 103 | static void disable_put_regulator( | 192 | static void disable_put_regulator( |
| 104 | struct ehci_hcd_omap_platform_data *pdata) | 193 | struct ehci_hcd_omap_platform_data *pdata) |
| 105 | { | 194 | { |
| @@ -264,8 +353,76 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev) | |||
| 264 | /* root ports should always stay powered */ | 353 | /* root ports should always stay powered */ |
| 265 | ehci_port_power(omap_ehci, 1); | 354 | ehci_port_power(omap_ehci, 1); |
| 266 | 355 | ||
| 356 | /* get clocks */ | ||
| 357 | utmi_p1_fck = clk_get(dev, "utmi_p1_gfclk"); | ||
| 358 | if (IS_ERR(utmi_p1_fck)) { | ||
| 359 | ret = PTR_ERR(utmi_p1_fck); | ||
| 360 | dev_err(dev, "utmi_p1_gfclk failed error:%d\n", ret); | ||
| 361 | goto err_add_hcd; | ||
| 362 | } | ||
| 363 | |||
| 364 | xclk60mhsp1_ck = clk_get(dev, "xclk60mhsp1_ck"); | ||
| 365 | if (IS_ERR(xclk60mhsp1_ck)) { | ||
| 366 | ret = PTR_ERR(xclk60mhsp1_ck); | ||
| 367 | dev_err(dev, "xclk60mhsp1_ck failed error:%d\n", ret); | ||
| 368 | goto err_utmi_p1_fck; | ||
| 369 | } | ||
| 370 | |||
| 371 | utmi_p2_fck = clk_get(dev, "utmi_p2_gfclk"); | ||
| 372 | if (IS_ERR(utmi_p2_fck)) { | ||
| 373 | ret = PTR_ERR(utmi_p2_fck); | ||
| 374 | dev_err(dev, "utmi_p2_gfclk failed error:%d\n", ret); | ||
| 375 | goto err_xclk60mhsp1_ck; | ||
| 376 | } | ||
| 377 | |||
| 378 | xclk60mhsp2_ck = clk_get(dev, "xclk60mhsp2_ck"); | ||
| 379 | if (IS_ERR(xclk60mhsp2_ck)) { | ||
| 380 | ret = PTR_ERR(xclk60mhsp2_ck); | ||
| 381 | dev_err(dev, "xclk60mhsp2_ck failed error:%d\n", ret); | ||
| 382 | goto err_utmi_p2_fck; | ||
| 383 | } | ||
| 384 | |||
| 385 | usbhost_p1_fck = clk_get(dev, "usb_host_hs_utmi_p1_clk"); | ||
| 386 | if (IS_ERR(usbhost_p1_fck)) { | ||
| 387 | ret = PTR_ERR(usbhost_p1_fck); | ||
| 388 | dev_err(dev, "usbhost_p1_fck failed error:%d\n", ret); | ||
| 389 | goto err_xclk60mhsp2_ck; | ||
| 390 | } | ||
| 391 | |||
| 392 | usbhost_p2_fck = clk_get(dev, "usb_host_hs_utmi_p2_clk"); | ||
| 393 | if (IS_ERR(usbhost_p2_fck)) { | ||
| 394 | ret = PTR_ERR(usbhost_p2_fck); | ||
| 395 | dev_err(dev, "usbhost_p2_fck failed error:%d\n", ret); | ||
| 396 | goto err_usbhost_p1_fck; | ||
| 397 | } | ||
| 398 | |||
| 399 | init_60m_fclk = clk_get(dev, "init_60m_fclk"); | ||
| 400 | if (IS_ERR(init_60m_fclk)) { | ||
| 401 | ret = PTR_ERR(init_60m_fclk); | ||
| 402 | dev_err(dev, "init_60m_fclk failed error:%d\n", ret); | ||
| 403 | goto err_usbhost_p2_fck; | ||
| 404 | } | ||
| 405 | |||
| 267 | return 0; | 406 | return 0; |
| 268 | 407 | ||
| 408 | err_usbhost_p2_fck: | ||
| 409 | clk_put(usbhost_p2_fck); | ||
| 410 | |||
| 411 | err_usbhost_p1_fck: | ||
| 412 | clk_put(usbhost_p1_fck); | ||
| 413 | |||
| 414 | err_xclk60mhsp2_ck: | ||
| 415 | clk_put(xclk60mhsp2_ck); | ||
| 416 | |||
| 417 | err_utmi_p2_fck: | ||
| 418 | clk_put(utmi_p2_fck); | ||
| 419 | |||
| 420 | err_xclk60mhsp1_ck: | ||
| 421 | clk_put(xclk60mhsp1_ck); | ||
| 422 | |||
| 423 | err_utmi_p1_fck: | ||
| 424 | clk_put(utmi_p1_fck); | ||
| 425 | |||
| 269 | err_add_hcd: | 426 | err_add_hcd: |
| 270 | disable_put_regulator(pdata); | 427 | disable_put_regulator(pdata); |
| 271 | pm_runtime_put_sync(dev); | 428 | pm_runtime_put_sync(dev); |
| @@ -294,6 +451,15 @@ static int ehci_hcd_omap_remove(struct platform_device *pdev) | |||
| 294 | disable_put_regulator(dev->platform_data); | 451 | disable_put_regulator(dev->platform_data); |
| 295 | iounmap(hcd->regs); | 452 | iounmap(hcd->regs); |
| 296 | usb_put_hcd(hcd); | 453 | usb_put_hcd(hcd); |
| 454 | |||
| 455 | clk_put(utmi_p1_fck); | ||
| 456 | clk_put(utmi_p2_fck); | ||
| 457 | clk_put(xclk60mhsp1_ck); | ||
| 458 | clk_put(xclk60mhsp2_ck); | ||
| 459 | clk_put(usbhost_p1_fck); | ||
| 460 | clk_put(usbhost_p2_fck); | ||
| 461 | clk_put(init_60m_fclk); | ||
| 462 | |||
| 297 | pm_runtime_put_sync(dev); | 463 | pm_runtime_put_sync(dev); |
| 298 | pm_runtime_disable(dev); | 464 | pm_runtime_disable(dev); |
| 299 | 465 | ||
| @@ -364,7 +530,7 @@ static const struct hc_driver ehci_omap_hc_driver = { | |||
| 364 | * root hub support | 530 | * root hub support |
| 365 | */ | 531 | */ |
| 366 | .hub_status_data = ehci_hub_status_data, | 532 | .hub_status_data = ehci_hub_status_data, |
| 367 | .hub_control = ehci_hub_control, | 533 | .hub_control = omap_ehci_hub_control, |
| 368 | .bus_suspend = ehci_bus_suspend, | 534 | .bus_suspend = ehci_bus_suspend, |
| 369 | .bus_resume = ehci_bus_resume, | 535 | .bus_resume = ehci_bus_resume, |
| 370 | 536 | ||
diff --git a/drivers/usb/host/ehci-sh.c b/drivers/usb/host/ehci-sh.c index ca819cdd0c5e..e7cb3925abf8 100644 --- a/drivers/usb/host/ehci-sh.c +++ b/drivers/usb/host/ehci-sh.c | |||
| @@ -126,8 +126,7 @@ static int ehci_hcd_sh_probe(struct platform_device *pdev) | |||
| 126 | goto fail_create_hcd; | 126 | goto fail_create_hcd; |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | if (pdev->dev.platform_data != NULL) | 129 | pdata = pdev->dev.platform_data; |
| 130 | pdata = pdev->dev.platform_data; | ||
| 131 | 130 | ||
| 132 | /* initialize hcd */ | 131 | /* initialize hcd */ |
| 133 | hcd = usb_create_hcd(&ehci_sh_hc_driver, &pdev->dev, | 132 | hcd = usb_create_hcd(&ehci_sh_hc_driver, &pdev->dev, |
diff --git a/drivers/usb/host/ehci-xilinx-of.c b/drivers/usb/host/ehci-xilinx-of.c index 9c2cc4633894..e9713d589e30 100644 --- a/drivers/usb/host/ehci-xilinx-of.c +++ b/drivers/usb/host/ehci-xilinx-of.c | |||
| @@ -270,14 +270,12 @@ static int ehci_hcd_xilinx_of_remove(struct platform_device *op) | |||
| 270 | * | 270 | * |
| 271 | * Properly shutdown the hcd, call driver's shutdown routine. | 271 | * Properly shutdown the hcd, call driver's shutdown routine. |
| 272 | */ | 272 | */ |
| 273 | static int ehci_hcd_xilinx_of_shutdown(struct platform_device *op) | 273 | static void ehci_hcd_xilinx_of_shutdown(struct platform_device *op) |
| 274 | { | 274 | { |
| 275 | struct usb_hcd *hcd = dev_get_drvdata(&op->dev); | 275 | struct usb_hcd *hcd = dev_get_drvdata(&op->dev); |
| 276 | 276 | ||
| 277 | if (hcd->driver->shutdown) | 277 | if (hcd->driver->shutdown) |
| 278 | hcd->driver->shutdown(hcd); | 278 | hcd->driver->shutdown(hcd); |
| 279 | |||
| 280 | return 0; | ||
| 281 | } | 279 | } |
| 282 | 280 | ||
| 283 | 281 | ||
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 836772dfabd3..2f3619eefefa 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
| @@ -317,7 +317,7 @@ static int ohci_bus_resume (struct usb_hcd *hcd) | |||
| 317 | } | 317 | } |
| 318 | 318 | ||
| 319 | /* Carry out the final steps of resuming the controller device */ | 319 | /* Carry out the final steps of resuming the controller device */ |
| 320 | static void ohci_finish_controller_resume(struct usb_hcd *hcd) | 320 | static void __maybe_unused ohci_finish_controller_resume(struct usb_hcd *hcd) |
| 321 | { | 321 | { |
| 322 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); | 322 | struct ohci_hcd *ohci = hcd_to_ohci(hcd); |
| 323 | int port; | 323 | int port; |
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index ec4338eec826..77689bd64cac 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
| @@ -793,10 +793,9 @@ static void xhci_free_tt_info(struct xhci_hcd *xhci, | |||
| 793 | struct xhci_virt_device *virt_dev, | 793 | struct xhci_virt_device *virt_dev, |
| 794 | int slot_id) | 794 | int slot_id) |
| 795 | { | 795 | { |
| 796 | struct list_head *tt; | ||
| 797 | struct list_head *tt_list_head; | 796 | struct list_head *tt_list_head; |
| 798 | struct list_head *tt_next; | 797 | struct xhci_tt_bw_info *tt_info, *next; |
| 799 | struct xhci_tt_bw_info *tt_info; | 798 | bool slot_found = false; |
| 800 | 799 | ||
| 801 | /* If the device never made it past the Set Address stage, | 800 | /* If the device never made it past the Set Address stage, |
| 802 | * it may not have the real_port set correctly. | 801 | * it may not have the real_port set correctly. |
| @@ -808,34 +807,16 @@ static void xhci_free_tt_info(struct xhci_hcd *xhci, | |||
| 808 | } | 807 | } |
| 809 | 808 | ||
| 810 | tt_list_head = &(xhci->rh_bw[virt_dev->real_port - 1].tts); | 809 | tt_list_head = &(xhci->rh_bw[virt_dev->real_port - 1].tts); |
| 811 | if (list_empty(tt_list_head)) | 810 | list_for_each_entry_safe(tt_info, next, tt_list_head, tt_list) { |
| 812 | return; | 811 | /* Multi-TT hubs will have more than one entry */ |
| 813 | 812 | if (tt_info->slot_id == slot_id) { | |
| 814 | list_for_each(tt, tt_list_head) { | 813 | slot_found = true; |
| 815 | tt_info = list_entry(tt, struct xhci_tt_bw_info, tt_list); | 814 | list_del(&tt_info->tt_list); |
| 816 | if (tt_info->slot_id == slot_id) | 815 | kfree(tt_info); |
| 816 | } else if (slot_found) { | ||
| 817 | break; | 817 | break; |
| 818 | } | ||
| 818 | } | 819 | } |
| 819 | /* Cautionary measure in case the hub was disconnected before we | ||
| 820 | * stored the TT information. | ||
| 821 | */ | ||
| 822 | if (tt_info->slot_id != slot_id) | ||
| 823 | return; | ||
| 824 | |||
| 825 | tt_next = tt->next; | ||
| 826 | tt_info = list_entry(tt, struct xhci_tt_bw_info, | ||
| 827 | tt_list); | ||
| 828 | /* Multi-TT hubs will have more than one entry */ | ||
| 829 | do { | ||
| 830 | list_del(tt); | ||
| 831 | kfree(tt_info); | ||
| 832 | tt = tt_next; | ||
| 833 | if (list_empty(tt_list_head)) | ||
| 834 | break; | ||
| 835 | tt_next = tt->next; | ||
| 836 | tt_info = list_entry(tt, struct xhci_tt_bw_info, | ||
| 837 | tt_list); | ||
| 838 | } while (tt_info->slot_id == slot_id); | ||
| 839 | } | 820 | } |
| 840 | 821 | ||
| 841 | int xhci_alloc_tt_info(struct xhci_hcd *xhci, | 822 | int xhci_alloc_tt_info(struct xhci_hcd *xhci, |
| @@ -1791,17 +1772,9 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | |||
| 1791 | { | 1772 | { |
| 1792 | struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); | 1773 | struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); |
| 1793 | struct dev_info *dev_info, *next; | 1774 | struct dev_info *dev_info, *next; |
| 1794 | struct list_head *tt_list_head; | ||
| 1795 | struct list_head *tt; | ||
| 1796 | struct list_head *endpoints; | ||
| 1797 | struct list_head *ep, *q; | ||
| 1798 | struct xhci_tt_bw_info *tt_info; | ||
| 1799 | struct xhci_interval_bw_table *bwt; | ||
| 1800 | struct xhci_virt_ep *virt_ep; | ||
| 1801 | |||
| 1802 | unsigned long flags; | 1775 | unsigned long flags; |
| 1803 | int size; | 1776 | int size; |
| 1804 | int i; | 1777 | int i, j, num_ports; |
| 1805 | 1778 | ||
| 1806 | /* Free the Event Ring Segment Table and the actual Event Ring */ | 1779 | /* Free the Event Ring Segment Table and the actual Event Ring */ |
| 1807 | size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries); | 1780 | size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries); |
| @@ -1860,21 +1833,22 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | |||
| 1860 | } | 1833 | } |
| 1861 | spin_unlock_irqrestore(&xhci->lock, flags); | 1834 | spin_unlock_irqrestore(&xhci->lock, flags); |
| 1862 | 1835 | ||
| 1863 | bwt = &xhci->rh_bw->bw_table; | 1836 | num_ports = HCS_MAX_PORTS(xhci->hcs_params1); |
| 1864 | for (i = 0; i < XHCI_MAX_INTERVAL; i++) { | 1837 | for (i = 0; i < num_ports; i++) { |
| 1865 | endpoints = &bwt->interval_bw[i].endpoints; | 1838 | struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table; |
| 1866 | list_for_each_safe(ep, q, endpoints) { | 1839 | for (j = 0; j < XHCI_MAX_INTERVAL; j++) { |
| 1867 | virt_ep = list_entry(ep, struct xhci_virt_ep, bw_endpoint_list); | 1840 | struct list_head *ep = &bwt->interval_bw[j].endpoints; |
| 1868 | list_del(&virt_ep->bw_endpoint_list); | 1841 | while (!list_empty(ep)) |
| 1869 | kfree(virt_ep); | 1842 | list_del_init(ep->next); |
| 1870 | } | 1843 | } |
| 1871 | } | 1844 | } |
| 1872 | 1845 | ||
| 1873 | tt_list_head = &xhci->rh_bw->tts; | 1846 | for (i = 0; i < num_ports; i++) { |
| 1874 | list_for_each_safe(tt, q, tt_list_head) { | 1847 | struct xhci_tt_bw_info *tt, *n; |
| 1875 | tt_info = list_entry(tt, struct xhci_tt_bw_info, tt_list); | 1848 | list_for_each_entry_safe(tt, n, &xhci->rh_bw[i].tts, tt_list) { |
| 1876 | list_del(tt); | 1849 | list_del(&tt->tt_list); |
| 1877 | kfree(tt_info); | 1850 | kfree(tt); |
| 1851 | } | ||
| 1878 | } | 1852 | } |
| 1879 | 1853 | ||
| 1880 | xhci->num_usb2_ports = 0; | 1854 | xhci->num_usb2_ports = 0; |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index afdc73ee84a6..a979cd0dbe0f 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -795,8 +795,8 @@ int xhci_suspend(struct xhci_hcd *xhci) | |||
| 795 | command = xhci_readl(xhci, &xhci->op_regs->command); | 795 | command = xhci_readl(xhci, &xhci->op_regs->command); |
| 796 | command |= CMD_CSS; | 796 | command |= CMD_CSS; |
| 797 | xhci_writel(xhci, command, &xhci->op_regs->command); | 797 | xhci_writel(xhci, command, &xhci->op_regs->command); |
| 798 | if (handshake(xhci, &xhci->op_regs->status, STS_SAVE, 0, 10*100)) { | 798 | if (handshake(xhci, &xhci->op_regs->status, STS_SAVE, 0, 10 * 1000)) { |
| 799 | xhci_warn(xhci, "WARN: xHC CMD_CSS timeout\n"); | 799 | xhci_warn(xhci, "WARN: xHC save state timeout\n"); |
| 800 | spin_unlock_irq(&xhci->lock); | 800 | spin_unlock_irq(&xhci->lock); |
| 801 | return -ETIMEDOUT; | 801 | return -ETIMEDOUT; |
| 802 | } | 802 | } |
| @@ -848,8 +848,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | |||
| 848 | command |= CMD_CRS; | 848 | command |= CMD_CRS; |
| 849 | xhci_writel(xhci, command, &xhci->op_regs->command); | 849 | xhci_writel(xhci, command, &xhci->op_regs->command); |
| 850 | if (handshake(xhci, &xhci->op_regs->status, | 850 | if (handshake(xhci, &xhci->op_regs->status, |
| 851 | STS_RESTORE, 0, 10*100)) { | 851 | STS_RESTORE, 0, 10 * 1000)) { |
| 852 | xhci_dbg(xhci, "WARN: xHC CMD_CSS timeout\n"); | 852 | xhci_warn(xhci, "WARN: xHC restore state timeout\n"); |
| 853 | spin_unlock_irq(&xhci->lock); | 853 | spin_unlock_irq(&xhci->lock); |
| 854 | return -ETIMEDOUT; | 854 | return -ETIMEDOUT; |
| 855 | } | 855 | } |
| @@ -3906,7 +3906,7 @@ static u16 xhci_get_timeout_no_hub_lpm(struct usb_device *udev, | |||
| 3906 | default: | 3906 | default: |
| 3907 | dev_warn(&udev->dev, "%s: Can't get timeout for non-U1 or U2 state.\n", | 3907 | dev_warn(&udev->dev, "%s: Can't get timeout for non-U1 or U2 state.\n", |
| 3908 | __func__); | 3908 | __func__); |
| 3909 | return -EINVAL; | 3909 | return USB3_LPM_DISABLED; |
| 3910 | } | 3910 | } |
| 3911 | 3911 | ||
| 3912 | if (sel <= max_sel_pel && pel <= max_sel_pel) | 3912 | if (sel <= max_sel_pel && pel <= max_sel_pel) |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 6e8c527e07c9..27483f91a4a3 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
| @@ -757,7 +757,7 @@ static int usb_serial_probe(struct usb_interface *interface, | |||
| 757 | 757 | ||
| 758 | if (retval) { | 758 | if (retval) { |
| 759 | dbg("sub driver rejected device"); | 759 | dbg("sub driver rejected device"); |
| 760 | kfree(serial); | 760 | usb_serial_put(serial); |
| 761 | module_put(type->driver.owner); | 761 | module_put(type->driver.owner); |
| 762 | return retval; | 762 | return retval; |
| 763 | } | 763 | } |
| @@ -829,7 +829,7 @@ static int usb_serial_probe(struct usb_interface *interface, | |||
| 829 | */ | 829 | */ |
| 830 | if (num_bulk_in == 0 || num_bulk_out == 0) { | 830 | if (num_bulk_in == 0 || num_bulk_out == 0) { |
| 831 | dev_info(&interface->dev, "PL-2303 hack: descriptors matched but endpoints did not\n"); | 831 | dev_info(&interface->dev, "PL-2303 hack: descriptors matched but endpoints did not\n"); |
| 832 | kfree(serial); | 832 | usb_serial_put(serial); |
| 833 | module_put(type->driver.owner); | 833 | module_put(type->driver.owner); |
| 834 | return -ENODEV; | 834 | return -ENODEV; |
| 835 | } | 835 | } |
| @@ -843,7 +843,7 @@ static int usb_serial_probe(struct usb_interface *interface, | |||
| 843 | if (num_ports == 0) { | 843 | if (num_ports == 0) { |
| 844 | dev_err(&interface->dev, | 844 | dev_err(&interface->dev, |
| 845 | "Generic device with no bulk out, not allowed.\n"); | 845 | "Generic device with no bulk out, not allowed.\n"); |
| 846 | kfree(serial); | 846 | usb_serial_put(serial); |
| 847 | module_put(type->driver.owner); | 847 | module_put(type->driver.owner); |
| 848 | return -EIO; | 848 | return -EIO; |
| 849 | } | 849 | } |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 1719886bb9be..caf22bf5f822 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -1107,6 +1107,13 @@ UNUSUAL_DEV( 0x090a, 0x1200, 0x0000, 0x9999, | |||
| 1107 | USB_SC_RBC, USB_PR_BULK, NULL, | 1107 | USB_SC_RBC, USB_PR_BULK, NULL, |
| 1108 | 0 ), | 1108 | 0 ), |
| 1109 | 1109 | ||
| 1110 | /* Feiya QDI U2 DISK, reported by Hans de Goede <hdegoede@redhat.com> */ | ||
| 1111 | UNUSUAL_DEV( 0x090c, 0x1000, 0x0000, 0xffff, | ||
| 1112 | "Feiya", | ||
| 1113 | "QDI U2 DISK", | ||
| 1114 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
| 1115 | US_FL_NO_READ_CAPACITY_16 ), | ||
| 1116 | |||
| 1110 | /* aeb */ | 1117 | /* aeb */ |
| 1111 | UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff, | 1118 | UNUSUAL_DEV( 0x090c, 0x1132, 0x0000, 0xffff, |
| 1112 | "Feiya", | 1119 | "Feiya", |
