diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-06-28 14:15:17 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-06-28 14:15:17 -0400 |
| commit | 2e34b429a404675dc4fc4ad2ee339eea028da3ca (patch) | |
| tree | 93c9595fa65bf1e676f9b2a2b03bc8c187c25d06 | |
| parent | 04b905942b482092a547798a2477f21e32a8f65d (diff) | |
| parent | 857aab34f04ff86666aa80e751ee696eff0113dd (diff) | |
Merge branch 'usb-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6
* 'usb-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6:
MAINTAINERS: add myself as maintainer of USB/IP
usb: r8a66597-hcd: fix cannot detect low/full speed device
USB: ehci-ath79: fix a NULL pointer dereference
USB: Add new FT232H chip to drivers/usb/serial/ftdi_sio.c
usb/isp1760: Fix bug preventing the unlinking of control urbs
USB: Fix up URB error codes to reflect implementation.
xhci: Always set urb->status to zero for isoc endpoints.
xhci: Add reset on resume quirk for asrock p67 host
xHCI 1.0: Incompatible Device Error
USB: don't let errors prevent system sleep
USB: don't let the hub driver prevent system sleep
USB: change maintainership of ohci-hcd and ehci-hcd
xHCI 1.0: Force Stopped Event(FSE)
xhci: Don't warn about zeroed bMaxBurst descriptor field.
USB: Free bandwidth when usb_disable_device is called.
xhci: Reject double add of active endpoints.
USB: TI 3410/5052 USB Serial Driver: Fix mem leak when firmware is too big.
usb: musb: gadget: clear TXPKTRDY flag when set FLUSHFIFO
usb: musb: host: compare status for negative error values
| -rw-r--r-- | Documentation/usb/error-codes.txt | 9 | ||||
| -rw-r--r-- | MAINTAINERS | 12 | ||||
| -rw-r--r-- | drivers/usb/core/driver.c | 11 | ||||
| -rw-r--r-- | drivers/usb/core/hub.c | 16 | ||||
| -rw-r--r-- | drivers/usb/core/message.c | 15 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-ath79.c | 10 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-hcd.c | 4 | ||||
| -rw-r--r-- | drivers/usb/host/isp1760-hcd.c | 2 | ||||
| -rw-r--r-- | drivers/usb/host/ohci-hcd.c | 4 | ||||
| -rw-r--r-- | drivers/usb/host/r8a66597-hcd.c | 1 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-mem.c | 2 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-pci.c | 8 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-ring.c | 30 | ||||
| -rw-r--r-- | drivers/usb/host/xhci.c | 39 | ||||
| -rw-r--r-- | drivers/usb/host/xhci.h | 3 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_gadget.c | 6 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_host.c | 2 | ||||
| -rw-r--r-- | drivers/usb/serial/ftdi_sio.c | 19 | ||||
| -rw-r--r-- | drivers/usb/serial/ftdi_sio.h | 3 | ||||
| -rw-r--r-- | drivers/usb/serial/ftdi_sio_ids.h | 1 | ||||
| -rw-r--r-- | drivers/usb/serial/ti_usb_3410_5052.c | 1 |
21 files changed, 164 insertions, 34 deletions
diff --git a/Documentation/usb/error-codes.txt b/Documentation/usb/error-codes.txt index d83703ea74b2..b3f606b81a03 100644 --- a/Documentation/usb/error-codes.txt +++ b/Documentation/usb/error-codes.txt | |||
| @@ -76,6 +76,13 @@ A transfer's actual_length may be positive even when an error has been | |||
| 76 | reported. That's because transfers often involve several packets, so that | 76 | reported. That's because transfers often involve several packets, so that |
| 77 | one or more packets could finish before an error stops further endpoint I/O. | 77 | one or more packets could finish before an error stops further endpoint I/O. |
| 78 | 78 | ||
| 79 | For isochronous URBs, the urb status value is non-zero only if the URB is | ||
| 80 | unlinked, the device is removed, the host controller is disabled, or the total | ||
| 81 | transferred length is less than the requested length and the URB_SHORT_NOT_OK | ||
| 82 | flag is set. Completion handlers for isochronous URBs should only see | ||
| 83 | urb->status set to zero, -ENOENT, -ECONNRESET, -ESHUTDOWN, or -EREMOTEIO. | ||
| 84 | Individual frame descriptor status fields may report more status codes. | ||
| 85 | |||
| 79 | 86 | ||
| 80 | 0 Transfer completed successfully | 87 | 0 Transfer completed successfully |
| 81 | 88 | ||
| @@ -132,7 +139,7 @@ one or more packets could finish before an error stops further endpoint I/O. | |||
| 132 | device removal events immediately. | 139 | device removal events immediately. |
| 133 | 140 | ||
| 134 | -EXDEV ISO transfer only partially completed | 141 | -EXDEV ISO transfer only partially completed |
| 135 | look at individual frame status for details | 142 | (only set in iso_frame_desc[n].status, not urb->status) |
| 136 | 143 | ||
| 137 | -EINVAL ISO madness, if this happens: Log off and go home | 144 | -EINVAL ISO madness, if this happens: Log off and go home |
| 138 | 145 | ||
diff --git a/MAINTAINERS b/MAINTAINERS index f0358cd91de3..d2dcef7cd9b2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -6434,8 +6434,9 @@ S: Maintained | |||
| 6434 | F: drivers/usb/misc/rio500* | 6434 | F: drivers/usb/misc/rio500* |
| 6435 | 6435 | ||
| 6436 | USB EHCI DRIVER | 6436 | USB EHCI DRIVER |
| 6437 | M: Alan Stern <stern@rowland.harvard.edu> | ||
| 6437 | L: linux-usb@vger.kernel.org | 6438 | L: linux-usb@vger.kernel.org |
| 6438 | S: Orphan | 6439 | S: Maintained |
| 6439 | F: Documentation/usb/ehci.txt | 6440 | F: Documentation/usb/ehci.txt |
| 6440 | F: drivers/usb/host/ehci* | 6441 | F: drivers/usb/host/ehci* |
| 6441 | 6442 | ||
| @@ -6465,6 +6466,12 @@ S: Maintained | |||
| 6465 | F: Documentation/hid/hiddev.txt | 6466 | F: Documentation/hid/hiddev.txt |
| 6466 | F: drivers/hid/usbhid/ | 6467 | F: drivers/hid/usbhid/ |
| 6467 | 6468 | ||
| 6469 | USB/IP DRIVERS | ||
| 6470 | M: Matt Mooney <mfm@muteddisk.com> | ||
| 6471 | L: linux-usb@vger.kernel.org | ||
| 6472 | S: Maintained | ||
| 6473 | F: drivers/staging/usbip/ | ||
| 6474 | |||
| 6468 | USB ISP116X DRIVER | 6475 | USB ISP116X DRIVER |
| 6469 | M: Olav Kongas <ok@artecdesign.ee> | 6476 | M: Olav Kongas <ok@artecdesign.ee> |
| 6470 | L: linux-usb@vger.kernel.org | 6477 | L: linux-usb@vger.kernel.org |
| @@ -6494,8 +6501,9 @@ S: Maintained | |||
| 6494 | F: sound/usb/midi.* | 6501 | F: sound/usb/midi.* |
| 6495 | 6502 | ||
| 6496 | USB OHCI DRIVER | 6503 | USB OHCI DRIVER |
| 6504 | M: Alan Stern <stern@rowland.harvard.edu> | ||
| 6497 | L: linux-usb@vger.kernel.org | 6505 | L: linux-usb@vger.kernel.org |
| 6498 | S: Orphan | 6506 | S: Maintained |
| 6499 | F: Documentation/usb/ohci.txt | 6507 | F: Documentation/usb/ohci.txt |
| 6500 | F: drivers/usb/host/ohci* | 6508 | F: drivers/usb/host/ohci* |
| 6501 | 6509 | ||
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index aa3cc465a601..34e3da5aa72a 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
| @@ -1187,13 +1187,22 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg) | |||
| 1187 | for (i = n - 1; i >= 0; --i) { | 1187 | for (i = n - 1; i >= 0; --i) { |
| 1188 | intf = udev->actconfig->interface[i]; | 1188 | intf = udev->actconfig->interface[i]; |
| 1189 | status = usb_suspend_interface(udev, intf, msg); | 1189 | status = usb_suspend_interface(udev, intf, msg); |
| 1190 | |||
| 1191 | /* Ignore errors during system sleep transitions */ | ||
| 1192 | if (!(msg.event & PM_EVENT_AUTO)) | ||
| 1193 | status = 0; | ||
| 1190 | if (status != 0) | 1194 | if (status != 0) |
| 1191 | break; | 1195 | break; |
| 1192 | } | 1196 | } |
| 1193 | } | 1197 | } |
| 1194 | if (status == 0) | 1198 | if (status == 0) { |
| 1195 | status = usb_suspend_device(udev, msg); | 1199 | status = usb_suspend_device(udev, msg); |
| 1196 | 1200 | ||
| 1201 | /* Again, ignore errors during system sleep transitions */ | ||
| 1202 | if (!(msg.event & PM_EVENT_AUTO)) | ||
| 1203 | status = 0; | ||
| 1204 | } | ||
| 1205 | |||
| 1197 | /* If the suspend failed, resume interfaces that did get suspended */ | 1206 | /* If the suspend failed, resume interfaces that did get suspended */ |
| 1198 | if (status != 0) { | 1207 | if (status != 0) { |
| 1199 | msg.event ^= (PM_EVENT_SUSPEND | PM_EVENT_RESUME); | 1208 | msg.event ^= (PM_EVENT_SUSPEND | PM_EVENT_RESUME); |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 90ae1753dda1..a428aa080a36 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -1634,6 +1634,7 @@ void usb_disconnect(struct usb_device **pdev) | |||
| 1634 | { | 1634 | { |
| 1635 | struct usb_device *udev = *pdev; | 1635 | struct usb_device *udev = *pdev; |
| 1636 | int i; | 1636 | int i; |
| 1637 | struct usb_hcd *hcd = bus_to_hcd(udev->bus); | ||
| 1637 | 1638 | ||
| 1638 | if (!udev) { | 1639 | if (!udev) { |
| 1639 | pr_debug ("%s nodev\n", __func__); | 1640 | pr_debug ("%s nodev\n", __func__); |
| @@ -1661,7 +1662,9 @@ void usb_disconnect(struct usb_device **pdev) | |||
| 1661 | * so that the hardware is now fully quiesced. | 1662 | * so that the hardware is now fully quiesced. |
| 1662 | */ | 1663 | */ |
| 1663 | dev_dbg (&udev->dev, "unregistering device\n"); | 1664 | dev_dbg (&udev->dev, "unregistering device\n"); |
| 1665 | mutex_lock(hcd->bandwidth_mutex); | ||
| 1664 | usb_disable_device(udev, 0); | 1666 | usb_disable_device(udev, 0); |
| 1667 | mutex_unlock(hcd->bandwidth_mutex); | ||
| 1665 | usb_hcd_synchronize_unlinks(udev); | 1668 | usb_hcd_synchronize_unlinks(udev); |
| 1666 | 1669 | ||
| 1667 | usb_remove_ep_devs(&udev->ep0); | 1670 | usb_remove_ep_devs(&udev->ep0); |
| @@ -2362,6 +2365,10 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) | |||
| 2362 | USB_DEVICE_REMOTE_WAKEUP, 0, | 2365 | USB_DEVICE_REMOTE_WAKEUP, 0, |
| 2363 | NULL, 0, | 2366 | NULL, 0, |
| 2364 | USB_CTRL_SET_TIMEOUT); | 2367 | USB_CTRL_SET_TIMEOUT); |
| 2368 | |||
| 2369 | /* System sleep transitions should never fail */ | ||
| 2370 | if (!(msg.event & PM_EVENT_AUTO)) | ||
| 2371 | status = 0; | ||
| 2365 | } else { | 2372 | } else { |
| 2366 | /* device has up to 10 msec to fully suspend */ | 2373 | /* device has up to 10 msec to fully suspend */ |
| 2367 | dev_dbg(&udev->dev, "usb %ssuspend\n", | 2374 | dev_dbg(&udev->dev, "usb %ssuspend\n", |
| @@ -2611,16 +2618,15 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) | |||
| 2611 | struct usb_device *hdev = hub->hdev; | 2618 | struct usb_device *hdev = hub->hdev; |
| 2612 | unsigned port1; | 2619 | unsigned port1; |
| 2613 | 2620 | ||
| 2614 | /* fail if children aren't already suspended */ | 2621 | /* Warn if children aren't already suspended */ |
| 2615 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { | 2622 | for (port1 = 1; port1 <= hdev->maxchild; port1++) { |
| 2616 | struct usb_device *udev; | 2623 | struct usb_device *udev; |
| 2617 | 2624 | ||
| 2618 | udev = hdev->children [port1-1]; | 2625 | udev = hdev->children [port1-1]; |
| 2619 | if (udev && udev->can_submit) { | 2626 | if (udev && udev->can_submit) { |
| 2620 | if (!(msg.event & PM_EVENT_AUTO)) | 2627 | dev_warn(&intf->dev, "port %d nyet suspended\n", port1); |
| 2621 | dev_dbg(&intf->dev, "port %d nyet suspended\n", | 2628 | if (msg.event & PM_EVENT_AUTO) |
| 2622 | port1); | 2629 | return -EBUSY; |
| 2623 | return -EBUSY; | ||
| 2624 | } | 2630 | } |
| 2625 | } | 2631 | } |
| 2626 | 2632 | ||
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 5701e857392b..64c7ab4702df 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
| @@ -1135,10 +1135,13 @@ void usb_disable_interface(struct usb_device *dev, struct usb_interface *intf, | |||
| 1135 | * Deallocates hcd/hardware state for the endpoints (nuking all or most | 1135 | * Deallocates hcd/hardware state for the endpoints (nuking all or most |
| 1136 | * pending urbs) and usbcore state for the interfaces, so that usbcore | 1136 | * pending urbs) and usbcore state for the interfaces, so that usbcore |
| 1137 | * must usb_set_configuration() before any interfaces could be used. | 1137 | * must usb_set_configuration() before any interfaces could be used. |
| 1138 | * | ||
| 1139 | * Must be called with hcd->bandwidth_mutex held. | ||
| 1138 | */ | 1140 | */ |
| 1139 | void usb_disable_device(struct usb_device *dev, int skip_ep0) | 1141 | void usb_disable_device(struct usb_device *dev, int skip_ep0) |
| 1140 | { | 1142 | { |
| 1141 | int i; | 1143 | int i; |
| 1144 | struct usb_hcd *hcd = bus_to_hcd(dev->bus); | ||
| 1142 | 1145 | ||
| 1143 | /* getting rid of interfaces will disconnect | 1146 | /* getting rid of interfaces will disconnect |
| 1144 | * any drivers bound to them (a key side effect) | 1147 | * any drivers bound to them (a key side effect) |
| @@ -1172,6 +1175,16 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0) | |||
| 1172 | 1175 | ||
| 1173 | dev_dbg(&dev->dev, "%s nuking %s URBs\n", __func__, | 1176 | dev_dbg(&dev->dev, "%s nuking %s URBs\n", __func__, |
| 1174 | skip_ep0 ? "non-ep0" : "all"); | 1177 | skip_ep0 ? "non-ep0" : "all"); |
| 1178 | if (hcd->driver->check_bandwidth) { | ||
| 1179 | /* First pass: Cancel URBs, leave endpoint pointers intact. */ | ||
| 1180 | for (i = skip_ep0; i < 16; ++i) { | ||
| 1181 | usb_disable_endpoint(dev, i, false); | ||
| 1182 | usb_disable_endpoint(dev, i + USB_DIR_IN, false); | ||
| 1183 | } | ||
| 1184 | /* Remove endpoints from the host controller internal state */ | ||
| 1185 | usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL); | ||
| 1186 | /* Second pass: remove endpoint pointers */ | ||
| 1187 | } | ||
| 1175 | for (i = skip_ep0; i < 16; ++i) { | 1188 | for (i = skip_ep0; i < 16; ++i) { |
| 1176 | usb_disable_endpoint(dev, i, true); | 1189 | usb_disable_endpoint(dev, i, true); |
| 1177 | usb_disable_endpoint(dev, i + USB_DIR_IN, true); | 1190 | usb_disable_endpoint(dev, i + USB_DIR_IN, true); |
| @@ -1727,6 +1740,7 @@ free_interfaces: | |||
| 1727 | /* if it's already configured, clear out old state first. | 1740 | /* if it's already configured, clear out old state first. |
| 1728 | * getting rid of old interfaces means unbinding their drivers. | 1741 | * getting rid of old interfaces means unbinding their drivers. |
| 1729 | */ | 1742 | */ |
| 1743 | mutex_lock(hcd->bandwidth_mutex); | ||
| 1730 | if (dev->state != USB_STATE_ADDRESS) | 1744 | if (dev->state != USB_STATE_ADDRESS) |
| 1731 | usb_disable_device(dev, 1); /* Skip ep0 */ | 1745 | usb_disable_device(dev, 1); /* Skip ep0 */ |
| 1732 | 1746 | ||
| @@ -1739,7 +1753,6 @@ free_interfaces: | |||
| 1739 | * host controller will not allow submissions to dropped endpoints. If | 1753 | * host controller will not allow submissions to dropped endpoints. If |
| 1740 | * this call fails, the device state is unchanged. | 1754 | * this call fails, the device state is unchanged. |
| 1741 | */ | 1755 | */ |
| 1742 | mutex_lock(hcd->bandwidth_mutex); | ||
| 1743 | ret = usb_hcd_alloc_bandwidth(dev, cp, NULL, NULL); | 1756 | ret = usb_hcd_alloc_bandwidth(dev, cp, NULL, NULL); |
| 1744 | if (ret < 0) { | 1757 | if (ret < 0) { |
| 1745 | mutex_unlock(hcd->bandwidth_mutex); | 1758 | mutex_unlock(hcd->bandwidth_mutex); |
diff --git a/drivers/usb/host/ehci-ath79.c b/drivers/usb/host/ehci-ath79.c index 98cc8a13169c..aa248c2f2c60 100644 --- a/drivers/usb/host/ehci-ath79.c +++ b/drivers/usb/host/ehci-ath79.c | |||
| @@ -44,7 +44,6 @@ static int ehci_ath79_init(struct usb_hcd *hcd) | |||
| 44 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 44 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
| 45 | struct platform_device *pdev = to_platform_device(hcd->self.controller); | 45 | struct platform_device *pdev = to_platform_device(hcd->self.controller); |
| 46 | const struct platform_device_id *id; | 46 | const struct platform_device_id *id; |
| 47 | int hclength; | ||
| 48 | int ret; | 47 | int ret; |
| 49 | 48 | ||
| 50 | id = platform_get_device_id(pdev); | 49 | id = platform_get_device_id(pdev); |
| @@ -53,20 +52,23 @@ static int ehci_ath79_init(struct usb_hcd *hcd) | |||
| 53 | return -EINVAL; | 52 | return -EINVAL; |
| 54 | } | 53 | } |
| 55 | 54 | ||
| 56 | hclength = HC_LENGTH(ehci, ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
| 57 | switch (id->driver_data) { | 55 | switch (id->driver_data) { |
| 58 | case EHCI_ATH79_IP_V1: | 56 | case EHCI_ATH79_IP_V1: |
| 59 | ehci->has_synopsys_hc_bug = 1; | 57 | ehci->has_synopsys_hc_bug = 1; |
| 60 | 58 | ||
| 61 | ehci->caps = hcd->regs; | 59 | ehci->caps = hcd->regs; |
| 62 | ehci->regs = hcd->regs + hclength; | 60 | ehci->regs = hcd->regs + |
| 61 | HC_LENGTH(ehci, | ||
| 62 | ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
| 63 | break; | 63 | break; |
| 64 | 64 | ||
| 65 | case EHCI_ATH79_IP_V2: | 65 | case EHCI_ATH79_IP_V2: |
| 66 | hcd->has_tt = 1; | 66 | hcd->has_tt = 1; |
| 67 | 67 | ||
| 68 | ehci->caps = hcd->regs + 0x100; | 68 | ehci->caps = hcd->regs + 0x100; |
| 69 | ehci->regs = hcd->regs + 0x100 + hclength; | 69 | ehci->regs = hcd->regs + 0x100 + |
| 70 | HC_LENGTH(ehci, | ||
| 71 | ehci_readl(ehci, &ehci->caps->hc_capbase)); | ||
| 70 | break; | 72 | break; |
| 71 | 73 | ||
| 72 | default: | 74 | default: |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index b435ed67dd5c..f8030ee928e8 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
| @@ -1,4 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Enhanced Host Controller Interface (EHCI) driver for USB. | ||
| 3 | * | ||
| 4 | * Maintainer: Alan Stern <stern@rowland.harvard.edu> | ||
| 5 | * | ||
| 2 | * Copyright (c) 2000-2004 by David Brownell | 6 | * Copyright (c) 2000-2004 by David Brownell |
| 3 | * | 7 | * |
| 4 | * This program is free software; you can redistribute it and/or modify it | 8 | * This program is free software; you can redistribute it and/or modify it |
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index c9e6e454c625..55d3d5859ac5 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c | |||
| @@ -1555,7 +1555,7 @@ static void kill_transfer(struct usb_hcd *hcd, struct urb *urb, | |||
| 1555 | 1555 | ||
| 1556 | /* We need to forcefully reclaim the slot since some transfers never | 1556 | /* We need to forcefully reclaim the slot since some transfers never |
| 1557 | return, e.g. interrupt transfers and NAKed bulk transfers. */ | 1557 | return, e.g. interrupt transfers and NAKed bulk transfers. */ |
| 1558 | if (usb_pipebulk(urb->pipe)) { | 1558 | if (usb_pipecontrol(urb->pipe) || usb_pipebulk(urb->pipe)) { |
| 1559 | skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); | 1559 | skip_map = reg_read32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG); |
| 1560 | skip_map |= (1 << qh->slot); | 1560 | skip_map |= (1 << qh->slot); |
| 1561 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); | 1561 | reg_write32(hcd->regs, HC_ATL_PTD_SKIPMAP_REG, skip_map); |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 9aa10bdf3918..f9cf3f04b742 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
| @@ -1,5 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * OHCI HCD (Host Controller Driver) for USB. | 2 | * Open Host Controller Interface (OHCI) driver for USB. |
| 3 | * | ||
| 4 | * Maintainer: Alan Stern <stern@rowland.harvard.edu> | ||
| 3 | * | 5 | * |
| 4 | * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> | 6 | * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at> |
| 5 | * (C) Copyright 2000-2004 David Brownell <dbrownell@users.sourceforge.net> | 7 | * (C) Copyright 2000-2004 David Brownell <dbrownell@users.sourceforge.net> |
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index db6f8b9c19b6..4586369dda00 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c | |||
| @@ -2517,6 +2517,7 @@ static int __devinit r8a66597_probe(struct platform_device *pdev) | |||
| 2517 | INIT_LIST_HEAD(&r8a66597->child_device); | 2517 | INIT_LIST_HEAD(&r8a66597->child_device); |
| 2518 | 2518 | ||
| 2519 | hcd->rsrc_start = res->start; | 2519 | hcd->rsrc_start = res->start; |
| 2520 | hcd->has_tt = 1; | ||
| 2520 | 2521 | ||
| 2521 | ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | irq_trigger); | 2522 | ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | irq_trigger); |
| 2522 | if (ret != 0) { | 2523 | if (ret != 0) { |
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 0f8e1d29a858..fcb7f7efc86d 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
| @@ -1215,8 +1215,6 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, | |||
| 1215 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet)); | 1215 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet)); |
| 1216 | /* dig out max burst from ep companion desc */ | 1216 | /* dig out max burst from ep companion desc */ |
| 1217 | max_packet = ep->ss_ep_comp.bMaxBurst; | 1217 | max_packet = ep->ss_ep_comp.bMaxBurst; |
| 1218 | if (!max_packet) | ||
| 1219 | xhci_warn(xhci, "WARN no SS endpoint bMaxBurst\n"); | ||
| 1220 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_BURST(max_packet)); | 1218 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_BURST(max_packet)); |
| 1221 | break; | 1219 | break; |
| 1222 | case USB_SPEED_HIGH: | 1220 | case USB_SPEED_HIGH: |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 17541d09eabb..cb16de213f64 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
| @@ -29,6 +29,9 @@ | |||
| 29 | #define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 | 29 | #define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 |
| 30 | #define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 | 30 | #define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 |
| 31 | 31 | ||
| 32 | #define PCI_VENDOR_ID_ETRON 0x1b6f | ||
| 33 | #define PCI_DEVICE_ID_ASROCK_P67 0x7023 | ||
| 34 | |||
| 32 | static const char hcd_name[] = "xhci_hcd"; | 35 | static const char hcd_name[] = "xhci_hcd"; |
| 33 | 36 | ||
| 34 | /* called after powerup, by probe or system-pm "wakeup" */ | 37 | /* called after powerup, by probe or system-pm "wakeup" */ |
| @@ -134,6 +137,11 @@ static int xhci_pci_setup(struct usb_hcd *hcd) | |||
| 134 | xhci->quirks |= XHCI_EP_LIMIT_QUIRK; | 137 | xhci->quirks |= XHCI_EP_LIMIT_QUIRK; |
| 135 | xhci->limit_active_eps = 64; | 138 | xhci->limit_active_eps = 64; |
| 136 | } | 139 | } |
| 140 | if (pdev->vendor == PCI_VENDOR_ID_ETRON && | ||
| 141 | pdev->device == PCI_DEVICE_ID_ASROCK_P67) { | ||
| 142 | xhci->quirks |= XHCI_RESET_ON_RESUME; | ||
| 143 | xhci_dbg(xhci, "QUIRK: Resetting on resume\n"); | ||
| 144 | } | ||
| 137 | 145 | ||
| 138 | /* Make sure the HC is halted. */ | 146 | /* Make sure the HC is halted. */ |
| 139 | retval = xhci_halt(xhci); | 147 | retval = xhci_halt(xhci); |
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 800f417c7309..70cacbbe7fb9 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
| @@ -1733,6 +1733,7 @@ static int process_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1733 | frame->status = -EOVERFLOW; | 1733 | frame->status = -EOVERFLOW; |
| 1734 | skip_td = true; | 1734 | skip_td = true; |
| 1735 | break; | 1735 | break; |
| 1736 | case COMP_DEV_ERR: | ||
| 1736 | case COMP_STALL: | 1737 | case COMP_STALL: |
| 1737 | frame->status = -EPROTO; | 1738 | frame->status = -EPROTO; |
| 1738 | skip_td = true; | 1739 | skip_td = true; |
| @@ -1767,9 +1768,6 @@ static int process_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1767 | } | 1768 | } |
| 1768 | } | 1769 | } |
| 1769 | 1770 | ||
| 1770 | if ((idx == urb_priv->length - 1) && *status == -EINPROGRESS) | ||
| 1771 | *status = 0; | ||
| 1772 | |||
| 1773 | return finish_td(xhci, td, event_trb, event, ep, status, false); | 1771 | return finish_td(xhci, td, event_trb, event, ep, status, false); |
| 1774 | } | 1772 | } |
| 1775 | 1773 | ||
| @@ -1787,8 +1785,7 @@ static int skip_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 1787 | idx = urb_priv->td_cnt; | 1785 | idx = urb_priv->td_cnt; |
| 1788 | frame = &td->urb->iso_frame_desc[idx]; | 1786 | frame = &td->urb->iso_frame_desc[idx]; |
| 1789 | 1787 | ||
| 1790 | /* The transfer is partly done */ | 1788 | /* The transfer is partly done. */ |
| 1791 | *status = -EXDEV; | ||
| 1792 | frame->status = -EXDEV; | 1789 | frame->status = -EXDEV; |
| 1793 | 1790 | ||
| 1794 | /* calc actual length */ | 1791 | /* calc actual length */ |
| @@ -2016,6 +2013,10 @@ static int handle_tx_event(struct xhci_hcd *xhci, | |||
| 2016 | TRB_TO_SLOT_ID(le32_to_cpu(event->flags)), | 2013 | TRB_TO_SLOT_ID(le32_to_cpu(event->flags)), |
| 2017 | ep_index); | 2014 | ep_index); |
| 2018 | goto cleanup; | 2015 | goto cleanup; |
| 2016 | case COMP_DEV_ERR: | ||
| 2017 | xhci_warn(xhci, "WARN: detect an incompatible device"); | ||
| 2018 | status = -EPROTO; | ||
| 2019 | break; | ||
| 2019 | case COMP_MISSED_INT: | 2020 | case COMP_MISSED_INT: |
| 2020 | /* | 2021 | /* |
| 2021 | * When encounter missed service error, one or more isoc tds | 2022 | * When encounter missed service error, one or more isoc tds |
| @@ -2063,6 +2064,20 @@ static int handle_tx_event(struct xhci_hcd *xhci, | |||
| 2063 | /* Is this a TRB in the currently executing TD? */ | 2064 | /* Is this a TRB in the currently executing TD? */ |
| 2064 | event_seg = trb_in_td(ep_ring->deq_seg, ep_ring->dequeue, | 2065 | event_seg = trb_in_td(ep_ring->deq_seg, ep_ring->dequeue, |
| 2065 | td->last_trb, event_dma); | 2066 | td->last_trb, event_dma); |
| 2067 | |||
| 2068 | /* | ||
| 2069 | * Skip the Force Stopped Event. The event_trb(event_dma) of FSE | ||
| 2070 | * is not in the current TD pointed by ep_ring->dequeue because | ||
| 2071 | * that the hardware dequeue pointer still at the previous TRB | ||
| 2072 | * of the current TD. The previous TRB maybe a Link TD or the | ||
| 2073 | * last TRB of the previous TD. The command completion handle | ||
| 2074 | * will take care the rest. | ||
| 2075 | */ | ||
| 2076 | if (!event_seg && trb_comp_code == COMP_STOP_INVAL) { | ||
| 2077 | ret = 0; | ||
| 2078 | goto cleanup; | ||
| 2079 | } | ||
| 2080 | |||
| 2066 | if (!event_seg) { | 2081 | if (!event_seg) { |
| 2067 | if (!ep->skip || | 2082 | if (!ep->skip || |
| 2068 | !usb_endpoint_xfer_isoc(&td->urb->ep->desc)) { | 2083 | !usb_endpoint_xfer_isoc(&td->urb->ep->desc)) { |
| @@ -2158,6 +2173,11 @@ cleanup: | |||
| 2158 | urb->transfer_buffer_length, | 2173 | urb->transfer_buffer_length, |
| 2159 | status); | 2174 | status); |
| 2160 | spin_unlock(&xhci->lock); | 2175 | spin_unlock(&xhci->lock); |
| 2176 | /* EHCI, UHCI, and OHCI always unconditionally set the | ||
| 2177 | * urb->status of an isochronous endpoint to 0. | ||
| 2178 | */ | ||
| 2179 | if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) | ||
| 2180 | status = 0; | ||
| 2161 | usb_hcd_giveback_urb(bus_to_hcd(urb->dev->bus), urb, status); | 2181 | usb_hcd_giveback_urb(bus_to_hcd(urb->dev->bus), urb, status); |
| 2162 | spin_lock(&xhci->lock); | 2182 | spin_lock(&xhci->lock); |
| 2163 | } | 2183 | } |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 06e7023258d0..f5fe1ac301ab 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -759,6 +759,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | |||
| 759 | msleep(100); | 759 | msleep(100); |
| 760 | 760 | ||
| 761 | spin_lock_irq(&xhci->lock); | 761 | spin_lock_irq(&xhci->lock); |
| 762 | if (xhci->quirks & XHCI_RESET_ON_RESUME) | ||
| 763 | hibernated = true; | ||
| 762 | 764 | ||
| 763 | if (!hibernated) { | 765 | if (!hibernated) { |
| 764 | /* step 1: restore register */ | 766 | /* step 1: restore register */ |
| @@ -1401,6 +1403,7 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 1401 | u32 added_ctxs; | 1403 | u32 added_ctxs; |
| 1402 | unsigned int last_ctx; | 1404 | unsigned int last_ctx; |
| 1403 | u32 new_add_flags, new_drop_flags, new_slot_info; | 1405 | u32 new_add_flags, new_drop_flags, new_slot_info; |
| 1406 | struct xhci_virt_device *virt_dev; | ||
| 1404 | int ret = 0; | 1407 | int ret = 0; |
| 1405 | 1408 | ||
| 1406 | ret = xhci_check_args(hcd, udev, ep, 1, true, __func__); | 1409 | ret = xhci_check_args(hcd, udev, ep, 1, true, __func__); |
| @@ -1425,11 +1428,25 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 1425 | return 0; | 1428 | return 0; |
| 1426 | } | 1429 | } |
| 1427 | 1430 | ||
| 1428 | in_ctx = xhci->devs[udev->slot_id]->in_ctx; | 1431 | virt_dev = xhci->devs[udev->slot_id]; |
| 1429 | out_ctx = xhci->devs[udev->slot_id]->out_ctx; | 1432 | in_ctx = virt_dev->in_ctx; |
| 1433 | out_ctx = virt_dev->out_ctx; | ||
| 1430 | ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); | 1434 | ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); |
| 1431 | ep_index = xhci_get_endpoint_index(&ep->desc); | 1435 | ep_index = xhci_get_endpoint_index(&ep->desc); |
| 1432 | ep_ctx = xhci_get_ep_ctx(xhci, out_ctx, ep_index); | 1436 | ep_ctx = xhci_get_ep_ctx(xhci, out_ctx, ep_index); |
| 1437 | |||
| 1438 | /* If this endpoint is already in use, and the upper layers are trying | ||
| 1439 | * to add it again without dropping it, reject the addition. | ||
| 1440 | */ | ||
| 1441 | if (virt_dev->eps[ep_index].ring && | ||
| 1442 | !(le32_to_cpu(ctrl_ctx->drop_flags) & | ||
| 1443 | xhci_get_endpoint_flag(&ep->desc))) { | ||
| 1444 | xhci_warn(xhci, "Trying to add endpoint 0x%x " | ||
| 1445 | "without dropping it.\n", | ||
| 1446 | (unsigned int) ep->desc.bEndpointAddress); | ||
| 1447 | return -EINVAL; | ||
| 1448 | } | ||
| 1449 | |||
| 1433 | /* If the HCD has already noted the endpoint is enabled, | 1450 | /* If the HCD has already noted the endpoint is enabled, |
| 1434 | * ignore this request. | 1451 | * ignore this request. |
| 1435 | */ | 1452 | */ |
| @@ -1445,8 +1462,7 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 1445 | * process context, not interrupt context (or so documenation | 1462 | * process context, not interrupt context (or so documenation |
| 1446 | * for usb_set_interface() and usb_set_configuration() claim). | 1463 | * for usb_set_interface() and usb_set_configuration() claim). |
| 1447 | */ | 1464 | */ |
| 1448 | if (xhci_endpoint_init(xhci, xhci->devs[udev->slot_id], | 1465 | if (xhci_endpoint_init(xhci, virt_dev, udev, ep, GFP_NOIO) < 0) { |
| 1449 | udev, ep, GFP_NOIO) < 0) { | ||
| 1450 | dev_dbg(&udev->dev, "%s - could not initialize ep %#x\n", | 1466 | dev_dbg(&udev->dev, "%s - could not initialize ep %#x\n", |
| 1451 | __func__, ep->desc.bEndpointAddress); | 1467 | __func__, ep->desc.bEndpointAddress); |
| 1452 | return -ENOMEM; | 1468 | return -ENOMEM; |
| @@ -1537,6 +1553,11 @@ static int xhci_configure_endpoint_result(struct xhci_hcd *xhci, | |||
| 1537 | "and endpoint is not disabled.\n"); | 1553 | "and endpoint is not disabled.\n"); |
| 1538 | ret = -EINVAL; | 1554 | ret = -EINVAL; |
| 1539 | break; | 1555 | break; |
| 1556 | case COMP_DEV_ERR: | ||
| 1557 | dev_warn(&udev->dev, "ERROR: Incompatible device for endpoint " | ||
| 1558 | "configure command.\n"); | ||
| 1559 | ret = -ENODEV; | ||
| 1560 | break; | ||
| 1540 | case COMP_SUCCESS: | 1561 | case COMP_SUCCESS: |
| 1541 | dev_dbg(&udev->dev, "Successful Endpoint Configure command\n"); | 1562 | dev_dbg(&udev->dev, "Successful Endpoint Configure command\n"); |
| 1542 | ret = 0; | 1563 | ret = 0; |
| @@ -1571,6 +1592,11 @@ static int xhci_evaluate_context_result(struct xhci_hcd *xhci, | |||
| 1571 | xhci_dbg_ctx(xhci, virt_dev->out_ctx, 1); | 1592 | xhci_dbg_ctx(xhci, virt_dev->out_ctx, 1); |
| 1572 | ret = -EINVAL; | 1593 | ret = -EINVAL; |
| 1573 | break; | 1594 | break; |
| 1595 | case COMP_DEV_ERR: | ||
| 1596 | dev_warn(&udev->dev, "ERROR: Incompatible device for evaluate " | ||
| 1597 | "context command.\n"); | ||
| 1598 | ret = -ENODEV; | ||
| 1599 | break; | ||
| 1574 | case COMP_MEL_ERR: | 1600 | case COMP_MEL_ERR: |
| 1575 | /* Max Exit Latency too large error */ | 1601 | /* Max Exit Latency too large error */ |
| 1576 | dev_warn(&udev->dev, "WARN: Max Exit Latency too large\n"); | 1602 | dev_warn(&udev->dev, "WARN: Max Exit Latency too large\n"); |
| @@ -2853,6 +2879,11 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 2853 | dev_warn(&udev->dev, "Device not responding to set address.\n"); | 2879 | dev_warn(&udev->dev, "Device not responding to set address.\n"); |
| 2854 | ret = -EPROTO; | 2880 | ret = -EPROTO; |
| 2855 | break; | 2881 | break; |
| 2882 | case COMP_DEV_ERR: | ||
| 2883 | dev_warn(&udev->dev, "ERROR: Incompatible device for address " | ||
| 2884 | "device command.\n"); | ||
| 2885 | ret = -ENODEV; | ||
| 2886 | break; | ||
| 2856 | case COMP_SUCCESS: | 2887 | case COMP_SUCCESS: |
| 2857 | xhci_dbg(xhci, "Successful Address Device command\n"); | 2888 | xhci_dbg(xhci, "Successful Address Device command\n"); |
| 2858 | break; | 2889 | break; |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 7d1ea3bf5e1f..d8bbf5ccb10d 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
| @@ -874,6 +874,8 @@ struct xhci_transfer_event { | |||
| 874 | #define COMP_PING_ERR 20 | 874 | #define COMP_PING_ERR 20 |
| 875 | /* Event Ring is full */ | 875 | /* Event Ring is full */ |
| 876 | #define COMP_ER_FULL 21 | 876 | #define COMP_ER_FULL 21 |
| 877 | /* Incompatible Device Error */ | ||
| 878 | #define COMP_DEV_ERR 22 | ||
| 877 | /* Missed Service Error - HC couldn't service an isoc ep within interval */ | 879 | /* Missed Service Error - HC couldn't service an isoc ep within interval */ |
| 878 | #define COMP_MISSED_INT 23 | 880 | #define COMP_MISSED_INT 23 |
| 879 | /* Successfully stopped command ring */ | 881 | /* Successfully stopped command ring */ |
| @@ -1308,6 +1310,7 @@ struct xhci_hcd { | |||
| 1308 | */ | 1310 | */ |
| 1309 | #define XHCI_EP_LIMIT_QUIRK (1 << 5) | 1311 | #define XHCI_EP_LIMIT_QUIRK (1 << 5) |
| 1310 | #define XHCI_BROKEN_MSI (1 << 6) | 1312 | #define XHCI_BROKEN_MSI (1 << 6) |
| 1313 | #define XHCI_RESET_ON_RESUME (1 << 7) | ||
| 1311 | unsigned int num_active_eps; | 1314 | unsigned int num_active_eps; |
| 1312 | unsigned int limit_active_eps; | 1315 | unsigned int limit_active_eps; |
| 1313 | /* There are two roothubs to keep track of bus suspend info for */ | 1316 | /* There are two roothubs to keep track of bus suspend info for */ |
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index 0a50a35e1853..6aeb363e63e7 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
| @@ -1524,6 +1524,12 @@ static void musb_gadget_fifo_flush(struct usb_ep *ep) | |||
| 1524 | csr = musb_readw(epio, MUSB_TXCSR); | 1524 | csr = musb_readw(epio, MUSB_TXCSR); |
| 1525 | if (csr & MUSB_TXCSR_FIFONOTEMPTY) { | 1525 | if (csr & MUSB_TXCSR_FIFONOTEMPTY) { |
| 1526 | csr |= MUSB_TXCSR_FLUSHFIFO | MUSB_TXCSR_P_WZC_BITS; | 1526 | csr |= MUSB_TXCSR_FLUSHFIFO | MUSB_TXCSR_P_WZC_BITS; |
| 1527 | /* | ||
| 1528 | * Setting both TXPKTRDY and FLUSHFIFO makes controller | ||
| 1529 | * to interrupt current FIFO loading, but not flushing | ||
| 1530 | * the already loaded ones. | ||
| 1531 | */ | ||
| 1532 | csr &= ~MUSB_TXCSR_TXPKTRDY; | ||
| 1527 | musb_writew(epio, MUSB_TXCSR, csr); | 1533 | musb_writew(epio, MUSB_TXCSR, csr); |
| 1528 | /* REVISIT may be inappropriate w/o FIFONOTEMPTY ... */ | 1534 | /* REVISIT may be inappropriate w/o FIFONOTEMPTY ... */ |
| 1529 | musb_writew(epio, MUSB_TXCSR, csr); | 1535 | musb_writew(epio, MUSB_TXCSR, csr); |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 7295e316bdfc..8b2473fa0f47 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
| @@ -1575,7 +1575,7 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
| 1575 | /* even if there was an error, we did the dma | 1575 | /* even if there was an error, we did the dma |
| 1576 | * for iso_frame_desc->length | 1576 | * for iso_frame_desc->length |
| 1577 | */ | 1577 | */ |
| 1578 | if (d->status != EILSEQ && d->status != -EOVERFLOW) | 1578 | if (d->status != -EILSEQ && d->status != -EOVERFLOW) |
| 1579 | d->status = 0; | 1579 | d->status = 0; |
| 1580 | 1580 | ||
| 1581 | if (++qh->iso_idx >= urb->number_of_packets) | 1581 | if (++qh->iso_idx >= urb->number_of_packets) |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 162728977553..2e06b90aa1f8 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -179,6 +179,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 179 | { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) }, | 179 | { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) }, |
| 180 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, | 180 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, |
| 181 | { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) }, | 181 | { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) }, |
| 182 | { USB_DEVICE(FTDI_VID, FTDI_232H_PID) }, | ||
| 182 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, | 183 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, |
| 183 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, | 184 | { USB_DEVICE(FTDI_VID, FTDI_RELAIS_PID) }, |
| 184 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, | 185 | { USB_DEVICE(FTDI_VID, FTDI_OPENDCC_PID) }, |
| @@ -848,7 +849,8 @@ static const char *ftdi_chip_name[] = { | |||
| 848 | [FT2232C] = "FT2232C", | 849 | [FT2232C] = "FT2232C", |
| 849 | [FT232RL] = "FT232RL", | 850 | [FT232RL] = "FT232RL", |
| 850 | [FT2232H] = "FT2232H", | 851 | [FT2232H] = "FT2232H", |
| 851 | [FT4232H] = "FT4232H" | 852 | [FT4232H] = "FT4232H", |
| 853 | [FT232H] = "FT232H" | ||
| 852 | }; | 854 | }; |
| 853 | 855 | ||
| 854 | 856 | ||
| @@ -1168,6 +1170,7 @@ static __u32 get_ftdi_divisor(struct tty_struct *tty, | |||
| 1168 | break; | 1170 | break; |
| 1169 | case FT2232H: /* FT2232H chip */ | 1171 | case FT2232H: /* FT2232H chip */ |
| 1170 | case FT4232H: /* FT4232H chip */ | 1172 | case FT4232H: /* FT4232H chip */ |
| 1173 | case FT232H: /* FT232H chip */ | ||
| 1171 | if ((baud <= 12000000) & (baud >= 1200)) { | 1174 | if ((baud <= 12000000) & (baud >= 1200)) { |
| 1172 | div_value = ftdi_2232h_baud_to_divisor(baud); | 1175 | div_value = ftdi_2232h_baud_to_divisor(baud); |
| 1173 | } else if (baud < 1200) { | 1176 | } else if (baud < 1200) { |
| @@ -1429,9 +1432,12 @@ static void ftdi_determine_type(struct usb_serial_port *port) | |||
| 1429 | } else if (version < 0x600) { | 1432 | } else if (version < 0x600) { |
| 1430 | /* Assume it's an FT232BM (or FT245BM) */ | 1433 | /* Assume it's an FT232BM (or FT245BM) */ |
| 1431 | priv->chip_type = FT232BM; | 1434 | priv->chip_type = FT232BM; |
| 1432 | } else { | 1435 | } else if (version < 0x900) { |
| 1433 | /* Assume it's an FT232R */ | 1436 | /* Assume it's an FT232RL */ |
| 1434 | priv->chip_type = FT232RL; | 1437 | priv->chip_type = FT232RL; |
| 1438 | } else { | ||
| 1439 | /* Assume it's an FT232H */ | ||
| 1440 | priv->chip_type = FT232H; | ||
| 1435 | } | 1441 | } |
| 1436 | dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]); | 1442 | dev_info(&udev->dev, "Detected %s\n", ftdi_chip_name[priv->chip_type]); |
| 1437 | } | 1443 | } |
| @@ -1559,7 +1565,8 @@ static int create_sysfs_attrs(struct usb_serial_port *port) | |||
| 1559 | priv->chip_type == FT2232C || | 1565 | priv->chip_type == FT2232C || |
| 1560 | priv->chip_type == FT232RL || | 1566 | priv->chip_type == FT232RL || |
| 1561 | priv->chip_type == FT2232H || | 1567 | priv->chip_type == FT2232H || |
| 1562 | priv->chip_type == FT4232H)) { | 1568 | priv->chip_type == FT4232H || |
| 1569 | priv->chip_type == FT232H)) { | ||
| 1563 | retval = device_create_file(&port->dev, | 1570 | retval = device_create_file(&port->dev, |
| 1564 | &dev_attr_latency_timer); | 1571 | &dev_attr_latency_timer); |
| 1565 | } | 1572 | } |
| @@ -1580,7 +1587,8 @@ static void remove_sysfs_attrs(struct usb_serial_port *port) | |||
| 1580 | priv->chip_type == FT2232C || | 1587 | priv->chip_type == FT2232C || |
| 1581 | priv->chip_type == FT232RL || | 1588 | priv->chip_type == FT232RL || |
| 1582 | priv->chip_type == FT2232H || | 1589 | priv->chip_type == FT2232H || |
| 1583 | priv->chip_type == FT4232H) { | 1590 | priv->chip_type == FT4232H || |
| 1591 | priv->chip_type == FT232H) { | ||
| 1584 | device_remove_file(&port->dev, &dev_attr_latency_timer); | 1592 | device_remove_file(&port->dev, &dev_attr_latency_timer); |
| 1585 | } | 1593 | } |
| 1586 | } | 1594 | } |
| @@ -2212,6 +2220,7 @@ static int ftdi_tiocmget(struct tty_struct *tty) | |||
| 2212 | case FT232RL: | 2220 | case FT232RL: |
| 2213 | case FT2232H: | 2221 | case FT2232H: |
| 2214 | case FT4232H: | 2222 | case FT4232H: |
| 2223 | case FT232H: | ||
| 2215 | len = 2; | 2224 | len = 2; |
| 2216 | break; | 2225 | break; |
| 2217 | default: | 2226 | default: |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index 213fe3d61282..19584faa86f9 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
| @@ -156,7 +156,8 @@ enum ftdi_chip_type { | |||
| 156 | FT2232C = 4, | 156 | FT2232C = 4, |
| 157 | FT232RL = 5, | 157 | FT232RL = 5, |
| 158 | FT2232H = 6, | 158 | FT2232H = 6, |
| 159 | FT4232H = 7 | 159 | FT4232H = 7, |
| 160 | FT232H = 8 | ||
| 160 | }; | 161 | }; |
| 161 | 162 | ||
| 162 | enum ftdi_sio_baudrate { | 163 | enum ftdi_sio_baudrate { |
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index ab1fcdf3c378..19156d1049fe 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI's alternate PID for above */ | 22 | #define FTDI_8U232AM_ALT_PID 0x6006 /* FTDI's alternate PID for above */ |
| 23 | #define FTDI_8U2232C_PID 0x6010 /* Dual channel device */ | 23 | #define FTDI_8U2232C_PID 0x6010 /* Dual channel device */ |
| 24 | #define FTDI_4232H_PID 0x6011 /* Quad channel hi-speed device */ | 24 | #define FTDI_4232H_PID 0x6011 /* Quad channel hi-speed device */ |
| 25 | #define FTDI_232H_PID 0x6014 /* Single channel hi-speed device */ | ||
| 25 | #define FTDI_SIO_PID 0x8372 /* Product Id SIO application of 8U100AX */ | 26 | #define FTDI_SIO_PID 0x8372 /* Product Id SIO application of 8U100AX */ |
| 26 | #define FTDI_232RL_PID 0xFBFA /* Product ID for FT232RL */ | 27 | #define FTDI_232RL_PID 0xFBFA /* Product ID for FT232RL */ |
| 27 | 28 | ||
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index c6d92a530086..ea8445689c85 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
| @@ -1745,6 +1745,7 @@ static int ti_download_firmware(struct ti_device *tdev) | |||
| 1745 | } | 1745 | } |
| 1746 | if (fw_p->size > TI_FIRMWARE_BUF_SIZE) { | 1746 | if (fw_p->size > TI_FIRMWARE_BUF_SIZE) { |
| 1747 | dev_err(&dev->dev, "%s - firmware too large %zu\n", __func__, fw_p->size); | 1747 | dev_err(&dev->dev, "%s - firmware too large %zu\n", __func__, fw_p->size); |
| 1748 | release_firmware(fw_p); | ||
| 1748 | return -ENOENT; | 1749 | return -ENOENT; |
| 1749 | } | 1750 | } |
| 1750 | 1751 | ||
