diff options
Diffstat (limited to 'drivers/usb')
76 files changed, 819 insertions, 387 deletions
diff --git a/drivers/usb/Makefile b/drivers/usb/Makefile index f5ed3d75fa5a..8f5ebced5df0 100644 --- a/drivers/usb/Makefile +++ b/drivers/usb/Makefile | |||
| @@ -46,7 +46,7 @@ obj-$(CONFIG_USB_MICROTEK) += image/ | |||
| 46 | obj-$(CONFIG_USB_SERIAL) += serial/ | 46 | obj-$(CONFIG_USB_SERIAL) += serial/ |
| 47 | 47 | ||
| 48 | obj-$(CONFIG_USB) += misc/ | 48 | obj-$(CONFIG_USB) += misc/ |
| 49 | obj-$(CONFIG_USB_COMMON) += phy/ | 49 | obj-$(CONFIG_USB_OTG_UTILS) += phy/ |
| 50 | obj-$(CONFIG_EARLY_PRINTK_DBGP) += early/ | 50 | obj-$(CONFIG_EARLY_PRINTK_DBGP) += early/ |
| 51 | 51 | ||
| 52 | obj-$(CONFIG_USB_ATM) += atm/ | 52 | obj-$(CONFIG_USB_ATM) += atm/ |
diff --git a/drivers/usb/c67x00/c67x00-sched.c b/drivers/usb/c67x00/c67x00-sched.c index a03fbc15fa9c..aa491627a45b 100644 --- a/drivers/usb/c67x00/c67x00-sched.c +++ b/drivers/usb/c67x00/c67x00-sched.c | |||
| @@ -100,7 +100,7 @@ struct c67x00_urb_priv { | |||
| 100 | #define TD_PIDEP_OFFSET 0x04 | 100 | #define TD_PIDEP_OFFSET 0x04 |
| 101 | #define TD_PIDEPMASK_PID 0xF0 | 101 | #define TD_PIDEPMASK_PID 0xF0 |
| 102 | #define TD_PIDEPMASK_EP 0x0F | 102 | #define TD_PIDEPMASK_EP 0x0F |
| 103 | #define TD_PORTLENMASK_DL 0x02FF | 103 | #define TD_PORTLENMASK_DL 0x03FF |
| 104 | #define TD_PORTLENMASK_PN 0xC000 | 104 | #define TD_PORTLENMASK_PN 0xC000 |
| 105 | 105 | ||
| 106 | #define TD_STATUS_OFFSET 0x07 | 106 | #define TD_STATUS_OFFSET 0x07 |
| @@ -590,7 +590,7 @@ static int c67x00_create_td(struct c67x00_hcd *c67x00, struct urb *urb, | |||
| 590 | { | 590 | { |
| 591 | struct c67x00_td *td; | 591 | struct c67x00_td *td; |
| 592 | struct c67x00_urb_priv *urbp = urb->hcpriv; | 592 | struct c67x00_urb_priv *urbp = urb->hcpriv; |
| 593 | const __u8 active_flag = 1, retry_cnt = 1; | 593 | const __u8 active_flag = 1, retry_cnt = 3; |
| 594 | __u8 cmd = 0; | 594 | __u8 cmd = 0; |
| 595 | int tt = 0; | 595 | int tt = 0; |
| 596 | 596 | ||
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index 2f45bba8561d..f64fbea1cf20 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c | |||
| @@ -1767,7 +1767,7 @@ static int udc_start(struct ci13xxx *ci) | |||
| 1767 | goto put_transceiver; | 1767 | goto put_transceiver; |
| 1768 | } | 1768 | } |
| 1769 | 1769 | ||
| 1770 | retval = dbg_create_files(&ci->gadget.dev); | 1770 | retval = dbg_create_files(ci->dev); |
| 1771 | if (retval) | 1771 | if (retval) |
| 1772 | goto unreg_device; | 1772 | goto unreg_device; |
| 1773 | 1773 | ||
| @@ -1796,7 +1796,7 @@ remove_trans: | |||
| 1796 | 1796 | ||
| 1797 | dev_err(dev, "error = %i\n", retval); | 1797 | dev_err(dev, "error = %i\n", retval); |
| 1798 | remove_dbg: | 1798 | remove_dbg: |
| 1799 | dbg_remove_files(&ci->gadget.dev); | 1799 | dbg_remove_files(ci->dev); |
| 1800 | unreg_device: | 1800 | unreg_device: |
| 1801 | device_unregister(&ci->gadget.dev); | 1801 | device_unregister(&ci->gadget.dev); |
| 1802 | put_transceiver: | 1802 | put_transceiver: |
| @@ -1836,7 +1836,7 @@ static void udc_stop(struct ci13xxx *ci) | |||
| 1836 | if (ci->global_phy) | 1836 | if (ci->global_phy) |
| 1837 | usb_put_phy(ci->transceiver); | 1837 | usb_put_phy(ci->transceiver); |
| 1838 | } | 1838 | } |
| 1839 | dbg_remove_files(&ci->gadget.dev); | 1839 | dbg_remove_files(ci->dev); |
| 1840 | device_unregister(&ci->gadget.dev); | 1840 | device_unregister(&ci->gadget.dev); |
| 1841 | /* my kobject is dynamic, I swear! */ | 1841 | /* my kobject is dynamic, I swear! */ |
| 1842 | memset(&ci->gadget, 0, sizeof(ci->gadget)); | 1842 | memset(&ci->gadget, 0, sizeof(ci->gadget)); |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 8ac25adf31b4..387dc6c8ad25 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -593,7 +593,6 @@ static void acm_port_destruct(struct tty_port *port) | |||
| 593 | 593 | ||
| 594 | dev_dbg(&acm->control->dev, "%s\n", __func__); | 594 | dev_dbg(&acm->control->dev, "%s\n", __func__); |
| 595 | 595 | ||
| 596 | tty_unregister_device(acm_tty_driver, acm->minor); | ||
| 597 | acm_release_minor(acm); | 596 | acm_release_minor(acm); |
| 598 | usb_put_intf(acm->control); | 597 | usb_put_intf(acm->control); |
| 599 | kfree(acm->country_codes); | 598 | kfree(acm->country_codes); |
| @@ -977,6 +976,8 @@ static int acm_probe(struct usb_interface *intf, | |||
| 977 | int num_rx_buf; | 976 | int num_rx_buf; |
| 978 | int i; | 977 | int i; |
| 979 | int combined_interfaces = 0; | 978 | int combined_interfaces = 0; |
| 979 | struct device *tty_dev; | ||
| 980 | int rv = -ENOMEM; | ||
| 980 | 981 | ||
| 981 | /* normal quirks */ | 982 | /* normal quirks */ |
| 982 | quirks = (unsigned long)id->driver_info; | 983 | quirks = (unsigned long)id->driver_info; |
| @@ -1339,11 +1340,24 @@ skip_countries: | |||
| 1339 | usb_set_intfdata(data_interface, acm); | 1340 | usb_set_intfdata(data_interface, acm); |
| 1340 | 1341 | ||
| 1341 | usb_get_intf(control_interface); | 1342 | usb_get_intf(control_interface); |
| 1342 | tty_port_register_device(&acm->port, acm_tty_driver, minor, | 1343 | tty_dev = tty_port_register_device(&acm->port, acm_tty_driver, minor, |
| 1343 | &control_interface->dev); | 1344 | &control_interface->dev); |
| 1345 | if (IS_ERR(tty_dev)) { | ||
| 1346 | rv = PTR_ERR(tty_dev); | ||
| 1347 | goto alloc_fail8; | ||
| 1348 | } | ||
| 1344 | 1349 | ||
| 1345 | return 0; | 1350 | return 0; |
| 1351 | alloc_fail8: | ||
| 1352 | if (acm->country_codes) { | ||
| 1353 | device_remove_file(&acm->control->dev, | ||
| 1354 | &dev_attr_wCountryCodes); | ||
| 1355 | device_remove_file(&acm->control->dev, | ||
| 1356 | &dev_attr_iCountryCodeRelDate); | ||
| 1357 | } | ||
| 1358 | device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities); | ||
| 1346 | alloc_fail7: | 1359 | alloc_fail7: |
| 1360 | usb_set_intfdata(intf, NULL); | ||
| 1347 | for (i = 0; i < ACM_NW; i++) | 1361 | for (i = 0; i < ACM_NW; i++) |
| 1348 | usb_free_urb(acm->wb[i].urb); | 1362 | usb_free_urb(acm->wb[i].urb); |
| 1349 | alloc_fail6: | 1363 | alloc_fail6: |
| @@ -1359,7 +1373,7 @@ alloc_fail2: | |||
| 1359 | acm_release_minor(acm); | 1373 | acm_release_minor(acm); |
| 1360 | kfree(acm); | 1374 | kfree(acm); |
| 1361 | alloc_fail: | 1375 | alloc_fail: |
| 1362 | return -ENOMEM; | 1376 | return rv; |
| 1363 | } | 1377 | } |
| 1364 | 1378 | ||
| 1365 | static void stop_data_traffic(struct acm *acm) | 1379 | static void stop_data_traffic(struct acm *acm) |
| @@ -1411,6 +1425,8 @@ static void acm_disconnect(struct usb_interface *intf) | |||
| 1411 | 1425 | ||
| 1412 | stop_data_traffic(acm); | 1426 | stop_data_traffic(acm); |
| 1413 | 1427 | ||
| 1428 | tty_unregister_device(acm_tty_driver, acm->minor); | ||
| 1429 | |||
| 1414 | usb_free_urb(acm->ctrlurb); | 1430 | usb_free_urb(acm->ctrlurb); |
| 1415 | for (i = 0; i < ACM_NW; i++) | 1431 | for (i = 0; i < ACM_NW; i++) |
| 1416 | usb_free_urb(acm->wb[i].urb); | 1432 | usb_free_urb(acm->wb[i].urb); |
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 5f0cb417b736..122d056d96d5 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c | |||
| @@ -56,6 +56,7 @@ MODULE_DEVICE_TABLE (usb, wdm_ids); | |||
| 56 | #define WDM_RESPONDING 7 | 56 | #define WDM_RESPONDING 7 |
| 57 | #define WDM_SUSPENDING 8 | 57 | #define WDM_SUSPENDING 8 |
| 58 | #define WDM_RESETTING 9 | 58 | #define WDM_RESETTING 9 |
| 59 | #define WDM_OVERFLOW 10 | ||
| 59 | 60 | ||
| 60 | #define WDM_MAX 16 | 61 | #define WDM_MAX 16 |
| 61 | 62 | ||
| @@ -155,6 +156,7 @@ static void wdm_in_callback(struct urb *urb) | |||
| 155 | { | 156 | { |
| 156 | struct wdm_device *desc = urb->context; | 157 | struct wdm_device *desc = urb->context; |
| 157 | int status = urb->status; | 158 | int status = urb->status; |
| 159 | int length = urb->actual_length; | ||
| 158 | 160 | ||
| 159 | spin_lock(&desc->iuspin); | 161 | spin_lock(&desc->iuspin); |
| 160 | clear_bit(WDM_RESPONDING, &desc->flags); | 162 | clear_bit(WDM_RESPONDING, &desc->flags); |
| @@ -185,9 +187,17 @@ static void wdm_in_callback(struct urb *urb) | |||
| 185 | } | 187 | } |
| 186 | 188 | ||
| 187 | desc->rerr = status; | 189 | desc->rerr = status; |
| 188 | desc->reslength = urb->actual_length; | 190 | if (length + desc->length > desc->wMaxCommand) { |
| 189 | memmove(desc->ubuf + desc->length, desc->inbuf, desc->reslength); | 191 | /* The buffer would overflow */ |
| 190 | desc->length += desc->reslength; | 192 | set_bit(WDM_OVERFLOW, &desc->flags); |
| 193 | } else { | ||
| 194 | /* we may already be in overflow */ | ||
| 195 | if (!test_bit(WDM_OVERFLOW, &desc->flags)) { | ||
| 196 | memmove(desc->ubuf + desc->length, desc->inbuf, length); | ||
| 197 | desc->length += length; | ||
| 198 | desc->reslength = length; | ||
| 199 | } | ||
| 200 | } | ||
| 191 | skip_error: | 201 | skip_error: |
| 192 | wake_up(&desc->wait); | 202 | wake_up(&desc->wait); |
| 193 | 203 | ||
| @@ -435,6 +445,11 @@ retry: | |||
| 435 | rv = -ENODEV; | 445 | rv = -ENODEV; |
| 436 | goto err; | 446 | goto err; |
| 437 | } | 447 | } |
| 448 | if (test_bit(WDM_OVERFLOW, &desc->flags)) { | ||
| 449 | clear_bit(WDM_OVERFLOW, &desc->flags); | ||
| 450 | rv = -ENOBUFS; | ||
| 451 | goto err; | ||
| 452 | } | ||
| 438 | i++; | 453 | i++; |
| 439 | if (file->f_flags & O_NONBLOCK) { | 454 | if (file->f_flags & O_NONBLOCK) { |
| 440 | if (!test_bit(WDM_READ, &desc->flags)) { | 455 | if (!test_bit(WDM_READ, &desc->flags)) { |
| @@ -478,6 +493,7 @@ retry: | |||
| 478 | spin_unlock_irq(&desc->iuspin); | 493 | spin_unlock_irq(&desc->iuspin); |
| 479 | goto retry; | 494 | goto retry; |
| 480 | } | 495 | } |
| 496 | |||
| 481 | if (!desc->reslength) { /* zero length read */ | 497 | if (!desc->reslength) { /* zero length read */ |
| 482 | dev_dbg(&desc->intf->dev, "%s: zero length - clearing WDM_READ\n", __func__); | 498 | dev_dbg(&desc->intf->dev, "%s: zero length - clearing WDM_READ\n", __func__); |
| 483 | clear_bit(WDM_READ, &desc->flags); | 499 | clear_bit(WDM_READ, &desc->flags); |
| @@ -1004,6 +1020,7 @@ static int wdm_post_reset(struct usb_interface *intf) | |||
| 1004 | struct wdm_device *desc = wdm_find_device(intf); | 1020 | struct wdm_device *desc = wdm_find_device(intf); |
| 1005 | int rv; | 1021 | int rv; |
| 1006 | 1022 | ||
| 1023 | clear_bit(WDM_OVERFLOW, &desc->flags); | ||
| 1007 | clear_bit(WDM_RESETTING, &desc->flags); | 1024 | clear_bit(WDM_RESETTING, &desc->flags); |
| 1008 | rv = recover_from_urb_loss(desc); | 1025 | rv = recover_from_urb_loss(desc); |
| 1009 | mutex_unlock(&desc->wlock); | 1026 | mutex_unlock(&desc->wlock); |
diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c index 622b4a48e732..2b487d4797bd 100644 --- a/drivers/usb/core/hcd-pci.c +++ b/drivers/usb/core/hcd-pci.c | |||
| @@ -173,6 +173,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
| 173 | struct hc_driver *driver; | 173 | struct hc_driver *driver; |
| 174 | struct usb_hcd *hcd; | 174 | struct usb_hcd *hcd; |
| 175 | int retval; | 175 | int retval; |
| 176 | int hcd_irq = 0; | ||
| 176 | 177 | ||
| 177 | if (usb_disabled()) | 178 | if (usb_disabled()) |
| 178 | return -ENODEV; | 179 | return -ENODEV; |
| @@ -187,15 +188,19 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
| 187 | return -ENODEV; | 188 | return -ENODEV; |
| 188 | dev->current_state = PCI_D0; | 189 | dev->current_state = PCI_D0; |
| 189 | 190 | ||
| 190 | /* The xHCI driver supports MSI and MSI-X, | 191 | /* |
| 191 | * so don't fail if the BIOS doesn't provide a legacy IRQ. | 192 | * The xHCI driver has its own irq management |
| 193 | * make sure irq setup is not touched for xhci in generic hcd code | ||
| 192 | */ | 194 | */ |
| 193 | if (!dev->irq && (driver->flags & HCD_MASK) != HCD_USB3) { | 195 | if ((driver->flags & HCD_MASK) != HCD_USB3) { |
| 194 | dev_err(&dev->dev, | 196 | if (!dev->irq) { |
| 195 | "Found HC with no IRQ. Check BIOS/PCI %s setup!\n", | 197 | dev_err(&dev->dev, |
| 196 | pci_name(dev)); | 198 | "Found HC with no IRQ. Check BIOS/PCI %s setup!\n", |
| 197 | retval = -ENODEV; | 199 | pci_name(dev)); |
| 198 | goto disable_pci; | 200 | retval = -ENODEV; |
| 201 | goto disable_pci; | ||
| 202 | } | ||
| 203 | hcd_irq = dev->irq; | ||
| 199 | } | 204 | } |
| 200 | 205 | ||
| 201 | hcd = usb_create_hcd(driver, &dev->dev, pci_name(dev)); | 206 | hcd = usb_create_hcd(driver, &dev->dev, pci_name(dev)); |
| @@ -245,7 +250,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
| 245 | 250 | ||
| 246 | pci_set_master(dev); | 251 | pci_set_master(dev); |
| 247 | 252 | ||
| 248 | retval = usb_add_hcd(hcd, dev->irq, IRQF_SHARED); | 253 | retval = usb_add_hcd(hcd, hcd_irq, IRQF_SHARED); |
| 249 | if (retval != 0) | 254 | if (retval != 0) |
| 250 | goto unmap_registers; | 255 | goto unmap_registers; |
| 251 | set_hs_companion(dev, hcd); | 256 | set_hs_companion(dev, hcd); |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 99b34a30354f..f9ec44cbb82f 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
| @@ -2412,6 +2412,14 @@ int usb_hcd_is_primary_hcd(struct usb_hcd *hcd) | |||
| 2412 | } | 2412 | } |
| 2413 | EXPORT_SYMBOL_GPL(usb_hcd_is_primary_hcd); | 2413 | EXPORT_SYMBOL_GPL(usb_hcd_is_primary_hcd); |
| 2414 | 2414 | ||
| 2415 | int usb_hcd_find_raw_port_number(struct usb_hcd *hcd, int port1) | ||
| 2416 | { | ||
| 2417 | if (!hcd->driver->find_raw_port_number) | ||
| 2418 | return port1; | ||
| 2419 | |||
| 2420 | return hcd->driver->find_raw_port_number(hcd, port1); | ||
| 2421 | } | ||
| 2422 | |||
| 2415 | static int usb_hcd_request_irqs(struct usb_hcd *hcd, | 2423 | static int usb_hcd_request_irqs(struct usb_hcd *hcd, |
| 2416 | unsigned int irqnum, unsigned long irqflags) | 2424 | unsigned int irqnum, unsigned long irqflags) |
| 2417 | { | 2425 | { |
diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c index 797f9d514732..65d4e55552c6 100644 --- a/drivers/usb/core/port.c +++ b/drivers/usb/core/port.c | |||
| @@ -67,7 +67,6 @@ static void usb_port_device_release(struct device *dev) | |||
| 67 | { | 67 | { |
| 68 | struct usb_port *port_dev = to_usb_port(dev); | 68 | struct usb_port *port_dev = to_usb_port(dev); |
| 69 | 69 | ||
| 70 | dev_pm_qos_hide_flags(dev); | ||
| 71 | kfree(port_dev); | 70 | kfree(port_dev); |
| 72 | } | 71 | } |
| 73 | 72 | ||
diff --git a/drivers/usb/core/usb-acpi.c b/drivers/usb/core/usb-acpi.c index b6f4bad3f756..255c14464bf2 100644 --- a/drivers/usb/core/usb-acpi.c +++ b/drivers/usb/core/usb-acpi.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
| 16 | #include <linux/acpi.h> | 16 | #include <linux/acpi.h> |
| 17 | #include <linux/pci.h> | 17 | #include <linux/pci.h> |
| 18 | #include <linux/usb/hcd.h> | ||
| 18 | #include <acpi/acpi_bus.h> | 19 | #include <acpi/acpi_bus.h> |
| 19 | 20 | ||
| 20 | #include "usb.h" | 21 | #include "usb.h" |
| @@ -188,8 +189,13 @@ static int usb_acpi_find_device(struct device *dev, acpi_handle *handle) | |||
| 188 | * connected to. | 189 | * connected to. |
| 189 | */ | 190 | */ |
| 190 | if (!udev->parent) { | 191 | if (!udev->parent) { |
| 191 | *handle = acpi_get_child(DEVICE_ACPI_HANDLE(&udev->dev), | 192 | struct usb_hcd *hcd = bus_to_hcd(udev->bus); |
| 193 | int raw_port_num; | ||
| 194 | |||
| 195 | raw_port_num = usb_hcd_find_raw_port_number(hcd, | ||
| 192 | port_num); | 196 | port_num); |
| 197 | *handle = acpi_get_child(DEVICE_ACPI_HANDLE(&udev->dev), | ||
| 198 | raw_port_num); | ||
| 193 | if (!*handle) | 199 | if (!*handle) |
| 194 | return -ENODEV; | 200 | return -ENODEV; |
| 195 | } else { | 201 | } else { |
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 999909451e37..ffa6b004a84b 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
| @@ -583,6 +583,7 @@ static int dwc3_remove(struct platform_device *pdev) | |||
| 583 | break; | 583 | break; |
| 584 | } | 584 | } |
| 585 | 585 | ||
| 586 | dwc3_free_event_buffers(dwc); | ||
| 586 | dwc3_core_exit(dwc); | 587 | dwc3_core_exit(dwc); |
| 587 | 588 | ||
| 588 | return 0; | 589 | return 0; |
diff --git a/drivers/usb/dwc3/dwc3-exynos.c b/drivers/usb/dwc3/dwc3-exynos.c index b50da53e9a52..b082bec7343e 100644 --- a/drivers/usb/dwc3/dwc3-exynos.c +++ b/drivers/usb/dwc3/dwc3-exynos.c | |||
| @@ -23,8 +23,6 @@ | |||
| 23 | #include <linux/usb/nop-usb-xceiv.h> | 23 | #include <linux/usb/nop-usb-xceiv.h> |
| 24 | #include <linux/of.h> | 24 | #include <linux/of.h> |
| 25 | 25 | ||
| 26 | #include "core.h" | ||
| 27 | |||
| 28 | struct dwc3_exynos { | 26 | struct dwc3_exynos { |
| 29 | struct platform_device *dwc3; | 27 | struct platform_device *dwc3; |
| 30 | struct platform_device *usb2_phy; | 28 | struct platform_device *usb2_phy; |
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c index 22f337f57219..afa05e3c9cf4 100644 --- a/drivers/usb/dwc3/dwc3-omap.c +++ b/drivers/usb/dwc3/dwc3-omap.c | |||
| @@ -54,8 +54,6 @@ | |||
| 54 | #include <linux/usb/otg.h> | 54 | #include <linux/usb/otg.h> |
| 55 | #include <linux/usb/nop-usb-xceiv.h> | 55 | #include <linux/usb/nop-usb-xceiv.h> |
| 56 | 56 | ||
| 57 | #include "core.h" | ||
| 58 | |||
| 59 | /* | 57 | /* |
| 60 | * All these registers belong to OMAP's Wrapper around the | 58 | * All these registers belong to OMAP's Wrapper around the |
| 61 | * DesignWare USB3 Core. | 59 | * DesignWare USB3 Core. |
| @@ -465,20 +463,20 @@ static int dwc3_omap_remove(struct platform_device *pdev) | |||
| 465 | return 0; | 463 | return 0; |
| 466 | } | 464 | } |
| 467 | 465 | ||
| 468 | static const struct of_device_id of_dwc3_matach[] = { | 466 | static const struct of_device_id of_dwc3_match[] = { |
| 469 | { | 467 | { |
| 470 | "ti,dwc3", | 468 | "ti,dwc3", |
| 471 | }, | 469 | }, |
| 472 | { }, | 470 | { }, |
| 473 | }; | 471 | }; |
| 474 | MODULE_DEVICE_TABLE(of, of_dwc3_matach); | 472 | MODULE_DEVICE_TABLE(of, of_dwc3_match); |
| 475 | 473 | ||
| 476 | static struct platform_driver dwc3_omap_driver = { | 474 | static struct platform_driver dwc3_omap_driver = { |
| 477 | .probe = dwc3_omap_probe, | 475 | .probe = dwc3_omap_probe, |
| 478 | .remove = dwc3_omap_remove, | 476 | .remove = dwc3_omap_remove, |
| 479 | .driver = { | 477 | .driver = { |
| 480 | .name = "omap-dwc3", | 478 | .name = "omap-dwc3", |
| 481 | .of_match_table = of_dwc3_matach, | 479 | .of_match_table = of_dwc3_match, |
| 482 | }, | 480 | }, |
| 483 | }; | 481 | }; |
| 484 | 482 | ||
diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c index 7d70f44567d2..e8d77689a322 100644 --- a/drivers/usb/dwc3/dwc3-pci.c +++ b/drivers/usb/dwc3/dwc3-pci.c | |||
| @@ -45,8 +45,6 @@ | |||
| 45 | #include <linux/usb/otg.h> | 45 | #include <linux/usb/otg.h> |
| 46 | #include <linux/usb/nop-usb-xceiv.h> | 46 | #include <linux/usb/nop-usb-xceiv.h> |
| 47 | 47 | ||
| 48 | #include "core.h" | ||
| 49 | |||
| 50 | /* FIXME define these in <linux/pci_ids.h> */ | 48 | /* FIXME define these in <linux/pci_ids.h> */ |
| 51 | #define PCI_VENDOR_ID_SYNOPSYS 0x16c3 | 49 | #define PCI_VENDOR_ID_SYNOPSYS 0x16c3 |
| 52 | #define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3 0xabcd | 50 | #define PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3 0xabcd |
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index d7da073a23fe..1d139ca05ef1 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c | |||
| @@ -891,7 +891,8 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc, | |||
| 891 | DWC3_TRBCTL_CONTROL_DATA); | 891 | DWC3_TRBCTL_CONTROL_DATA); |
| 892 | } else if (!IS_ALIGNED(req->request.length, dep->endpoint.maxpacket) | 892 | } else if (!IS_ALIGNED(req->request.length, dep->endpoint.maxpacket) |
| 893 | && (dep->number == 0)) { | 893 | && (dep->number == 0)) { |
| 894 | u32 transfer_size; | 894 | u32 transfer_size; |
| 895 | u32 maxpacket; | ||
| 895 | 896 | ||
| 896 | ret = usb_gadget_map_request(&dwc->gadget, &req->request, | 897 | ret = usb_gadget_map_request(&dwc->gadget, &req->request, |
| 897 | dep->number); | 898 | dep->number); |
| @@ -902,8 +903,8 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc, | |||
| 902 | 903 | ||
| 903 | WARN_ON(req->request.length > DWC3_EP0_BOUNCE_SIZE); | 904 | WARN_ON(req->request.length > DWC3_EP0_BOUNCE_SIZE); |
| 904 | 905 | ||
| 905 | transfer_size = roundup(req->request.length, | 906 | maxpacket = dep->endpoint.maxpacket; |
| 906 | (u32) dep->endpoint.maxpacket); | 907 | transfer_size = roundup(req->request.length, maxpacket); |
| 907 | 908 | ||
| 908 | dwc->ep0_bounced = true; | 909 | dwc->ep0_bounced = true; |
| 909 | 910 | ||
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index a04342f6cbfa..82e160e96fca 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
| @@ -2159,7 +2159,6 @@ static void dwc3_gadget_phy_suspend(struct dwc3 *dwc, u8 speed) | |||
| 2159 | 2159 | ||
| 2160 | static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) | 2160 | static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) |
| 2161 | { | 2161 | { |
| 2162 | struct dwc3_gadget_ep_cmd_params params; | ||
| 2163 | struct dwc3_ep *dep; | 2162 | struct dwc3_ep *dep; |
| 2164 | int ret; | 2163 | int ret; |
| 2165 | u32 reg; | 2164 | u32 reg; |
| @@ -2167,8 +2166,6 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc) | |||
| 2167 | 2166 | ||
| 2168 | dev_vdbg(dwc->dev, "%s\n", __func__); | 2167 | dev_vdbg(dwc->dev, "%s\n", __func__); |
| 2169 | 2168 | ||
| 2170 | memset(¶ms, 0x00, sizeof(params)); | ||
| 2171 | |||
| 2172 | reg = dwc3_readl(dwc->regs, DWC3_DSTS); | 2169 | reg = dwc3_readl(dwc->regs, DWC3_DSTS); |
| 2173 | speed = reg & DWC3_DSTS_CONNECTSPD; | 2170 | speed = reg & DWC3_DSTS_CONNECTSPD; |
| 2174 | dwc->speed = speed; | 2171 | dwc->speed = speed; |
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 5a0c541daf89..c7525b1cad74 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
| @@ -145,6 +145,7 @@ config USB_LPC32XX | |||
| 145 | tristate "LPC32XX USB Peripheral Controller" | 145 | tristate "LPC32XX USB Peripheral Controller" |
| 146 | depends on ARCH_LPC32XX | 146 | depends on ARCH_LPC32XX |
| 147 | select USB_ISP1301 | 147 | select USB_ISP1301 |
| 148 | select USB_OTG_UTILS | ||
| 148 | help | 149 | help |
| 149 | This option selects the USB device controller in the LPC32xx SoC. | 150 | This option selects the USB device controller in the LPC32xx SoC. |
| 150 | 151 | ||
diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile index 97a13c349cc5..82fb22511356 100644 --- a/drivers/usb/gadget/Makefile +++ b/drivers/usb/gadget/Makefile | |||
| @@ -35,6 +35,12 @@ mv_udc-y := mv_udc_core.o | |||
| 35 | obj-$(CONFIG_USB_FUSB300) += fusb300_udc.o | 35 | obj-$(CONFIG_USB_FUSB300) += fusb300_udc.o |
| 36 | obj-$(CONFIG_USB_MV_U3D) += mv_u3d_core.o | 36 | obj-$(CONFIG_USB_MV_U3D) += mv_u3d_core.o |
| 37 | 37 | ||
| 38 | # USB Functions | ||
| 39 | obj-$(CONFIG_USB_F_ACM) += f_acm.o | ||
| 40 | f_ss_lb-y := f_loopback.o f_sourcesink.o | ||
| 41 | obj-$(CONFIG_USB_F_SS_LB) += f_ss_lb.o | ||
| 42 | obj-$(CONFIG_USB_U_SERIAL) += u_serial.o | ||
| 43 | |||
| 38 | # | 44 | # |
| 39 | # USB gadget drivers | 45 | # USB gadget drivers |
| 40 | # | 46 | # |
| @@ -74,9 +80,3 @@ obj-$(CONFIG_USB_G_WEBCAM) += g_webcam.o | |||
| 74 | obj-$(CONFIG_USB_G_NCM) += g_ncm.o | 80 | obj-$(CONFIG_USB_G_NCM) += g_ncm.o |
| 75 | obj-$(CONFIG_USB_G_ACM_MS) += g_acm_ms.o | 81 | obj-$(CONFIG_USB_G_ACM_MS) += g_acm_ms.o |
| 76 | obj-$(CONFIG_USB_GADGET_TARGET) += tcm_usb_gadget.o | 82 | obj-$(CONFIG_USB_GADGET_TARGET) += tcm_usb_gadget.o |
| 77 | |||
| 78 | # USB Functions | ||
| 79 | obj-$(CONFIG_USB_F_ACM) += f_acm.o | ||
| 80 | f_ss_lb-y := f_loopback.o f_sourcesink.o | ||
| 81 | obj-$(CONFIG_USB_F_SS_LB) += f_ss_lb.o | ||
| 82 | obj-$(CONFIG_USB_U_SERIAL) += u_serial.o | ||
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 7c821de8ce3d..c0d62b278610 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c | |||
| @@ -1757,10 +1757,7 @@ static const struct usb_gadget_driver composite_driver_template = { | |||
| 1757 | /** | 1757 | /** |
| 1758 | * usb_composite_probe() - register a composite driver | 1758 | * usb_composite_probe() - register a composite driver |
| 1759 | * @driver: the driver to register | 1759 | * @driver: the driver to register |
| 1760 | * @bind: the callback used to allocate resources that are shared across the | 1760 | * |
| 1761 | * whole device, such as string IDs, and add its configurations using | ||
| 1762 | * @usb_add_config(). This may fail by returning a negative errno | ||
| 1763 | * value; it should return zero on successful initialization. | ||
| 1764 | * Context: single threaded during gadget setup | 1761 | * Context: single threaded during gadget setup |
| 1765 | * | 1762 | * |
| 1766 | * This function is used to register drivers using the composite driver | 1763 | * This function is used to register drivers using the composite driver |
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index 71beeb833558..cc9c49c57c80 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c | |||
| @@ -447,14 +447,13 @@ static void rndis_response_complete(struct usb_ep *ep, struct usb_request *req) | |||
| 447 | static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req) | 447 | static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req) |
| 448 | { | 448 | { |
| 449 | struct f_rndis *rndis = req->context; | 449 | struct f_rndis *rndis = req->context; |
| 450 | struct usb_composite_dev *cdev = rndis->port.func.config->cdev; | ||
| 451 | int status; | 450 | int status; |
| 452 | 451 | ||
| 453 | /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */ | 452 | /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */ |
| 454 | // spin_lock(&dev->lock); | 453 | // spin_lock(&dev->lock); |
| 455 | status = rndis_msg_parser(rndis->config, (u8 *) req->buf); | 454 | status = rndis_msg_parser(rndis->config, (u8 *) req->buf); |
| 456 | if (status < 0) | 455 | if (status < 0) |
| 457 | ERROR(cdev, "RNDIS command error %d, %d/%d\n", | 456 | pr_err("RNDIS command error %d, %d/%d\n", |
| 458 | status, req->actual, req->length); | 457 | status, req->actual, req->length); |
| 459 | // spin_unlock(&dev->lock); | 458 | // spin_unlock(&dev->lock); |
| 460 | } | 459 | } |
diff --git a/drivers/usb/gadget/f_uac1.c b/drivers/usb/gadget/f_uac1.c index f570e667a640..fa8ea4ea00c1 100644 --- a/drivers/usb/gadget/f_uac1.c +++ b/drivers/usb/gadget/f_uac1.c | |||
| @@ -418,6 +418,7 @@ static int audio_get_intf_req(struct usb_function *f, | |||
| 418 | 418 | ||
| 419 | req->context = audio; | 419 | req->context = audio; |
| 420 | req->complete = f_audio_complete; | 420 | req->complete = f_audio_complete; |
| 421 | len = min_t(size_t, sizeof(value), len); | ||
| 421 | memcpy(req->buf, &value, len); | 422 | memcpy(req->buf, &value, len); |
| 422 | 423 | ||
| 423 | return len; | 424 | return len; |
diff --git a/drivers/usb/gadget/g_ffs.c b/drivers/usb/gadget/g_ffs.c index 3953dd4d7186..3b343b23e4b0 100644 --- a/drivers/usb/gadget/g_ffs.c +++ b/drivers/usb/gadget/g_ffs.c | |||
| @@ -357,7 +357,7 @@ static int gfs_bind(struct usb_composite_dev *cdev) | |||
| 357 | goto error; | 357 | goto error; |
| 358 | gfs_dev_desc.iProduct = gfs_strings[USB_GADGET_PRODUCT_IDX].id; | 358 | gfs_dev_desc.iProduct = gfs_strings[USB_GADGET_PRODUCT_IDX].id; |
| 359 | 359 | ||
| 360 | for (i = func_num; --i; ) { | 360 | for (i = func_num; i--; ) { |
| 361 | ret = functionfs_bind(ffs_tab[i].ffs_data, cdev); | 361 | ret = functionfs_bind(ffs_tab[i].ffs_data, cdev); |
| 362 | if (unlikely(ret < 0)) { | 362 | if (unlikely(ret < 0)) { |
| 363 | while (++i < func_num) | 363 | while (++i < func_num) |
| @@ -413,7 +413,7 @@ static int gfs_unbind(struct usb_composite_dev *cdev) | |||
| 413 | gether_cleanup(); | 413 | gether_cleanup(); |
| 414 | gfs_ether_setup = false; | 414 | gfs_ether_setup = false; |
| 415 | 415 | ||
| 416 | for (i = func_num; --i; ) | 416 | for (i = func_num; i--; ) |
| 417 | if (ffs_tab[i].ffs_data) | 417 | if (ffs_tab[i].ffs_data) |
| 418 | functionfs_unbind(ffs_tab[i].ffs_data); | 418 | functionfs_unbind(ffs_tab[i].ffs_data); |
| 419 | 419 | ||
diff --git a/drivers/usb/gadget/imx_udc.c b/drivers/usb/gadget/imx_udc.c index 8efd7555fa21..5bd930d779b9 100644 --- a/drivers/usb/gadget/imx_udc.c +++ b/drivers/usb/gadget/imx_udc.c | |||
| @@ -1334,27 +1334,18 @@ static int imx_udc_start(struct usb_gadget *gadget, | |||
| 1334 | struct usb_gadget_driver *driver) | 1334 | struct usb_gadget_driver *driver) |
| 1335 | { | 1335 | { |
| 1336 | struct imx_udc_struct *imx_usb; | 1336 | struct imx_udc_struct *imx_usb; |
| 1337 | int retval; | ||
| 1338 | 1337 | ||
| 1339 | imx_usb = container_of(gadget, struct imx_udc_struct, gadget); | 1338 | imx_usb = container_of(gadget, struct imx_udc_struct, gadget); |
| 1340 | /* first hook up the driver ... */ | 1339 | /* first hook up the driver ... */ |
| 1341 | imx_usb->driver = driver; | 1340 | imx_usb->driver = driver; |
| 1342 | imx_usb->gadget.dev.driver = &driver->driver; | 1341 | imx_usb->gadget.dev.driver = &driver->driver; |
| 1343 | 1342 | ||
| 1344 | retval = device_add(&imx_usb->gadget.dev); | ||
| 1345 | if (retval) | ||
| 1346 | goto fail; | ||
| 1347 | |||
| 1348 | D_INI(imx_usb->dev, "<%s> registered gadget driver '%s'\n", | 1343 | D_INI(imx_usb->dev, "<%s> registered gadget driver '%s'\n", |
| 1349 | __func__, driver->driver.name); | 1344 | __func__, driver->driver.name); |
| 1350 | 1345 | ||
| 1351 | imx_udc_enable(imx_usb); | 1346 | imx_udc_enable(imx_usb); |
| 1352 | 1347 | ||
| 1353 | return 0; | 1348 | return 0; |
| 1354 | fail: | ||
| 1355 | imx_usb->driver = NULL; | ||
| 1356 | imx_usb->gadget.dev.driver = NULL; | ||
| 1357 | return retval; | ||
| 1358 | } | 1349 | } |
| 1359 | 1350 | ||
| 1360 | static int imx_udc_stop(struct usb_gadget *gadget, | 1351 | static int imx_udc_stop(struct usb_gadget *gadget, |
| @@ -1370,8 +1361,6 @@ static int imx_udc_stop(struct usb_gadget *gadget, | |||
| 1370 | imx_usb->gadget.dev.driver = NULL; | 1361 | imx_usb->gadget.dev.driver = NULL; |
| 1371 | imx_usb->driver = NULL; | 1362 | imx_usb->driver = NULL; |
| 1372 | 1363 | ||
| 1373 | device_del(&imx_usb->gadget.dev); | ||
| 1374 | |||
| 1375 | D_INI(imx_usb->dev, "<%s> unregistered gadget driver '%s'\n", | 1364 | D_INI(imx_usb->dev, "<%s> unregistered gadget driver '%s'\n", |
| 1376 | __func__, driver->driver.name); | 1365 | __func__, driver->driver.name); |
| 1377 | 1366 | ||
| @@ -1477,6 +1466,10 @@ static int __init imx_udc_probe(struct platform_device *pdev) | |||
| 1477 | imx_usb->gadget.dev.parent = &pdev->dev; | 1466 | imx_usb->gadget.dev.parent = &pdev->dev; |
| 1478 | imx_usb->gadget.dev.dma_mask = pdev->dev.dma_mask; | 1467 | imx_usb->gadget.dev.dma_mask = pdev->dev.dma_mask; |
| 1479 | 1468 | ||
| 1469 | ret = device_add(&imx_usb->gadget.dev); | ||
| 1470 | if (retval) | ||
| 1471 | goto fail4; | ||
| 1472 | |||
| 1480 | platform_set_drvdata(pdev, imx_usb); | 1473 | platform_set_drvdata(pdev, imx_usb); |
| 1481 | 1474 | ||
| 1482 | usb_init_data(imx_usb); | 1475 | usb_init_data(imx_usb); |
| @@ -1488,9 +1481,11 @@ static int __init imx_udc_probe(struct platform_device *pdev) | |||
| 1488 | 1481 | ||
| 1489 | ret = usb_add_gadget_udc(&pdev->dev, &imx_usb->gadget); | 1482 | ret = usb_add_gadget_udc(&pdev->dev, &imx_usb->gadget); |
| 1490 | if (ret) | 1483 | if (ret) |
| 1491 | goto fail4; | 1484 | goto fail5; |
| 1492 | 1485 | ||
| 1493 | return 0; | 1486 | return 0; |
| 1487 | fail5: | ||
| 1488 | device_unregister(&imx_usb->gadget.dev); | ||
| 1494 | fail4: | 1489 | fail4: |
| 1495 | for (i = 0; i < IMX_USB_NB_EP + 1; i++) | 1490 | for (i = 0; i < IMX_USB_NB_EP + 1; i++) |
| 1496 | free_irq(imx_usb->usbd_int[i], imx_usb); | 1491 | free_irq(imx_usb->usbd_int[i], imx_usb); |
| @@ -1514,6 +1509,7 @@ static int __exit imx_udc_remove(struct platform_device *pdev) | |||
| 1514 | int i; | 1509 | int i; |
| 1515 | 1510 | ||
| 1516 | usb_del_gadget_udc(&imx_usb->gadget); | 1511 | usb_del_gadget_udc(&imx_usb->gadget); |
| 1512 | device_unregister(&imx_usb->gadget.dev); | ||
| 1517 | imx_udc_disable(imx_usb); | 1513 | imx_udc_disable(imx_usb); |
| 1518 | del_timer(&imx_usb->timer); | 1514 | del_timer(&imx_usb->timer); |
| 1519 | 1515 | ||
diff --git a/drivers/usb/gadget/net2272.c b/drivers/usb/gadget/net2272.c index d226058e3b88..32524b631959 100644 --- a/drivers/usb/gadget/net2272.c +++ b/drivers/usb/gadget/net2272.c | |||
| @@ -59,7 +59,7 @@ static const char * const ep_name[] = { | |||
| 59 | }; | 59 | }; |
| 60 | 60 | ||
| 61 | #define DMA_ADDR_INVALID (~(dma_addr_t)0) | 61 | #define DMA_ADDR_INVALID (~(dma_addr_t)0) |
| 62 | #ifdef CONFIG_USB_GADGET_NET2272_DMA | 62 | #ifdef CONFIG_USB_NET2272_DMA |
| 63 | /* | 63 | /* |
| 64 | * use_dma: the NET2272 can use an external DMA controller. | 64 | * use_dma: the NET2272 can use an external DMA controller. |
| 65 | * Note that since there is no generic DMA api, some functions, | 65 | * Note that since there is no generic DMA api, some functions, |
| @@ -1495,6 +1495,13 @@ stop_activity(struct net2272 *dev, struct usb_gadget_driver *driver) | |||
| 1495 | for (i = 0; i < 4; ++i) | 1495 | for (i = 0; i < 4; ++i) |
| 1496 | net2272_dequeue_all(&dev->ep[i]); | 1496 | net2272_dequeue_all(&dev->ep[i]); |
| 1497 | 1497 | ||
| 1498 | /* report disconnect; the driver is already quiesced */ | ||
| 1499 | if (driver) { | ||
| 1500 | spin_unlock(&dev->lock); | ||
| 1501 | driver->disconnect(&dev->gadget); | ||
| 1502 | spin_lock(&dev->lock); | ||
| 1503 | } | ||
| 1504 | |||
| 1498 | net2272_usb_reinit(dev); | 1505 | net2272_usb_reinit(dev); |
| 1499 | } | 1506 | } |
| 1500 | 1507 | ||
diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c index a1b650e11339..3bd0f992fb49 100644 --- a/drivers/usb/gadget/net2280.c +++ b/drivers/usb/gadget/net2280.c | |||
| @@ -1924,7 +1924,6 @@ static int net2280_start(struct usb_gadget *_gadget, | |||
| 1924 | err_func: | 1924 | err_func: |
| 1925 | device_remove_file (&dev->pdev->dev, &dev_attr_function); | 1925 | device_remove_file (&dev->pdev->dev, &dev_attr_function); |
| 1926 | err_unbind: | 1926 | err_unbind: |
| 1927 | driver->unbind (&dev->gadget); | ||
| 1928 | dev->gadget.dev.driver = NULL; | 1927 | dev->gadget.dev.driver = NULL; |
| 1929 | dev->driver = NULL; | 1928 | dev->driver = NULL; |
| 1930 | return retval; | 1929 | return retval; |
| @@ -1946,6 +1945,13 @@ stop_activity (struct net2280 *dev, struct usb_gadget_driver *driver) | |||
| 1946 | for (i = 0; i < 7; i++) | 1945 | for (i = 0; i < 7; i++) |
| 1947 | nuke (&dev->ep [i]); | 1946 | nuke (&dev->ep [i]); |
| 1948 | 1947 | ||
| 1948 | /* report disconnect; the driver is already quiesced */ | ||
| 1949 | if (driver) { | ||
| 1950 | spin_unlock(&dev->lock); | ||
| 1951 | driver->disconnect(&dev->gadget); | ||
| 1952 | spin_lock(&dev->lock); | ||
| 1953 | } | ||
| 1954 | |||
| 1949 | usb_reinit (dev); | 1955 | usb_reinit (dev); |
| 1950 | } | 1956 | } |
| 1951 | 1957 | ||
diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c index 06be85c2b233..f8445653577f 100644 --- a/drivers/usb/gadget/omap_udc.c +++ b/drivers/usb/gadget/omap_udc.c | |||
| @@ -62,6 +62,7 @@ | |||
| 62 | #define DRIVER_VERSION "4 October 2004" | 62 | #define DRIVER_VERSION "4 October 2004" |
| 63 | 63 | ||
| 64 | #define OMAP_DMA_USB_W2FC_TX0 29 | 64 | #define OMAP_DMA_USB_W2FC_TX0 29 |
| 65 | #define OMAP_DMA_USB_W2FC_RX0 26 | ||
| 65 | 66 | ||
| 66 | /* | 67 | /* |
| 67 | * The OMAP UDC needs _very_ early endpoint setup: before enabling the | 68 | * The OMAP UDC needs _very_ early endpoint setup: before enabling the |
| @@ -1310,7 +1311,7 @@ static int omap_pullup(struct usb_gadget *gadget, int is_on) | |||
| 1310 | } | 1311 | } |
| 1311 | 1312 | ||
| 1312 | static int omap_udc_start(struct usb_gadget *g, | 1313 | static int omap_udc_start(struct usb_gadget *g, |
| 1313 | struct usb_gadget_driver *driver) | 1314 | struct usb_gadget_driver *driver); |
| 1314 | static int omap_udc_stop(struct usb_gadget *g, | 1315 | static int omap_udc_stop(struct usb_gadget *g, |
| 1315 | struct usb_gadget_driver *driver); | 1316 | struct usb_gadget_driver *driver); |
| 1316 | 1317 | ||
diff --git a/drivers/usb/gadget/pxa25x_udc.c b/drivers/usb/gadget/pxa25x_udc.c index 2bbcdce942dc..d0f37484b6b0 100644 --- a/drivers/usb/gadget/pxa25x_udc.c +++ b/drivers/usb/gadget/pxa25x_udc.c | |||
| @@ -1266,13 +1266,6 @@ static int pxa25x_udc_start(struct usb_gadget *g, | |||
| 1266 | dev->gadget.dev.driver = &driver->driver; | 1266 | dev->gadget.dev.driver = &driver->driver; |
| 1267 | dev->pullup = 1; | 1267 | dev->pullup = 1; |
| 1268 | 1268 | ||
| 1269 | retval = device_add (&dev->gadget.dev); | ||
| 1270 | if (retval) { | ||
| 1271 | dev->driver = NULL; | ||
| 1272 | dev->gadget.dev.driver = NULL; | ||
| 1273 | return retval; | ||
| 1274 | } | ||
| 1275 | |||
| 1276 | /* ... then enable host detection and ep0; and we're ready | 1269 | /* ... then enable host detection and ep0; and we're ready |
| 1277 | * for set_configuration as well as eventual disconnect. | 1270 | * for set_configuration as well as eventual disconnect. |
| 1278 | */ | 1271 | */ |
| @@ -1310,6 +1303,10 @@ stop_activity(struct pxa25x_udc *dev, struct usb_gadget_driver *driver) | |||
| 1310 | } | 1303 | } |
| 1311 | del_timer_sync(&dev->timer); | 1304 | del_timer_sync(&dev->timer); |
| 1312 | 1305 | ||
| 1306 | /* report disconnect; the driver is already quiesced */ | ||
| 1307 | if (driver) | ||
| 1308 | driver->disconnect(&dev->gadget); | ||
| 1309 | |||
| 1313 | /* re-init driver-visible data structures */ | 1310 | /* re-init driver-visible data structures */ |
| 1314 | udc_reinit(dev); | 1311 | udc_reinit(dev); |
| 1315 | } | 1312 | } |
| @@ -1331,7 +1328,6 @@ static int pxa25x_udc_stop(struct usb_gadget*g, | |||
| 1331 | dev->gadget.dev.driver = NULL; | 1328 | dev->gadget.dev.driver = NULL; |
| 1332 | dev->driver = NULL; | 1329 | dev->driver = NULL; |
| 1333 | 1330 | ||
| 1334 | device_del (&dev->gadget.dev); | ||
| 1335 | dump_state(dev); | 1331 | dump_state(dev); |
| 1336 | 1332 | ||
| 1337 | return 0; | 1333 | return 0; |
| @@ -2146,6 +2142,13 @@ static int __init pxa25x_udc_probe(struct platform_device *pdev) | |||
| 2146 | dev->gadget.dev.parent = &pdev->dev; | 2142 | dev->gadget.dev.parent = &pdev->dev; |
| 2147 | dev->gadget.dev.dma_mask = pdev->dev.dma_mask; | 2143 | dev->gadget.dev.dma_mask = pdev->dev.dma_mask; |
| 2148 | 2144 | ||
| 2145 | retval = device_add(&dev->gadget.dev); | ||
| 2146 | if (retval) { | ||
| 2147 | dev->driver = NULL; | ||
| 2148 | dev->gadget.dev.driver = NULL; | ||
| 2149 | goto err_device_add; | ||
| 2150 | } | ||
| 2151 | |||
| 2149 | the_controller = dev; | 2152 | the_controller = dev; |
| 2150 | platform_set_drvdata(pdev, dev); | 2153 | platform_set_drvdata(pdev, dev); |
| 2151 | 2154 | ||
| @@ -2196,6 +2199,8 @@ lubbock_fail0: | |||
| 2196 | free_irq(irq, dev); | 2199 | free_irq(irq, dev); |
| 2197 | #endif | 2200 | #endif |
| 2198 | err_irq1: | 2201 | err_irq1: |
| 2202 | device_unregister(&dev->gadget.dev); | ||
| 2203 | err_device_add: | ||
| 2199 | if (gpio_is_valid(dev->mach->gpio_pullup)) | 2204 | if (gpio_is_valid(dev->mach->gpio_pullup)) |
| 2200 | gpio_free(dev->mach->gpio_pullup); | 2205 | gpio_free(dev->mach->gpio_pullup); |
| 2201 | err_gpio_pullup: | 2206 | err_gpio_pullup: |
| @@ -2217,10 +2222,11 @@ static int __exit pxa25x_udc_remove(struct platform_device *pdev) | |||
| 2217 | { | 2222 | { |
| 2218 | struct pxa25x_udc *dev = platform_get_drvdata(pdev); | 2223 | struct pxa25x_udc *dev = platform_get_drvdata(pdev); |
| 2219 | 2224 | ||
| 2220 | usb_del_gadget_udc(&dev->gadget); | ||
| 2221 | if (dev->driver) | 2225 | if (dev->driver) |
| 2222 | return -EBUSY; | 2226 | return -EBUSY; |
| 2223 | 2227 | ||
| 2228 | usb_del_gadget_udc(&dev->gadget); | ||
| 2229 | device_unregister(&dev->gadget.dev); | ||
| 2224 | dev->pullup = 0; | 2230 | dev->pullup = 0; |
| 2225 | pullup(dev); | 2231 | pullup(dev); |
| 2226 | 2232 | ||
diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c index f7d25795821a..2fc867652ef5 100644 --- a/drivers/usb/gadget/pxa27x_udc.c +++ b/drivers/usb/gadget/pxa27x_udc.c | |||
| @@ -1814,11 +1814,6 @@ static int pxa27x_udc_start(struct usb_gadget *g, | |||
| 1814 | udc->gadget.dev.driver = &driver->driver; | 1814 | udc->gadget.dev.driver = &driver->driver; |
| 1815 | dplus_pullup(udc, 1); | 1815 | dplus_pullup(udc, 1); |
| 1816 | 1816 | ||
| 1817 | retval = device_add(&udc->gadget.dev); | ||
| 1818 | if (retval) { | ||
| 1819 | dev_err(udc->dev, "device_add error %d\n", retval); | ||
| 1820 | goto fail; | ||
| 1821 | } | ||
| 1822 | if (!IS_ERR_OR_NULL(udc->transceiver)) { | 1817 | if (!IS_ERR_OR_NULL(udc->transceiver)) { |
| 1823 | retval = otg_set_peripheral(udc->transceiver->otg, | 1818 | retval = otg_set_peripheral(udc->transceiver->otg, |
| 1824 | &udc->gadget); | 1819 | &udc->gadget); |
| @@ -1876,7 +1871,6 @@ static int pxa27x_udc_stop(struct usb_gadget *g, | |||
| 1876 | 1871 | ||
| 1877 | udc->driver = NULL; | 1872 | udc->driver = NULL; |
| 1878 | 1873 | ||
| 1879 | device_del(&udc->gadget.dev); | ||
| 1880 | 1874 | ||
| 1881 | if (!IS_ERR_OR_NULL(udc->transceiver)) | 1875 | if (!IS_ERR_OR_NULL(udc->transceiver)) |
| 1882 | return otg_set_peripheral(udc->transceiver->otg, NULL); | 1876 | return otg_set_peripheral(udc->transceiver->otg, NULL); |
| @@ -2480,13 +2474,24 @@ static int __init pxa_udc_probe(struct platform_device *pdev) | |||
| 2480 | driver_name, udc->irq, retval); | 2474 | driver_name, udc->irq, retval); |
| 2481 | goto err_irq; | 2475 | goto err_irq; |
| 2482 | } | 2476 | } |
| 2477 | |||
| 2478 | retval = device_add(&udc->gadget.dev); | ||
| 2479 | if (retval) { | ||
| 2480 | dev_err(udc->dev, "device_add error %d\n", retval); | ||
| 2481 | goto err_dev_add; | ||
| 2482 | } | ||
| 2483 | |||
| 2483 | retval = usb_add_gadget_udc(&pdev->dev, &udc->gadget); | 2484 | retval = usb_add_gadget_udc(&pdev->dev, &udc->gadget); |
| 2484 | if (retval) | 2485 | if (retval) |
| 2485 | goto err_add_udc; | 2486 | goto err_add_udc; |
| 2486 | 2487 | ||
| 2487 | pxa_init_debugfs(udc); | 2488 | pxa_init_debugfs(udc); |
| 2489 | |||
| 2488 | return 0; | 2490 | return 0; |
| 2491 | |||
| 2489 | err_add_udc: | 2492 | err_add_udc: |
| 2493 | device_unregister(&udc->gadget.dev); | ||
| 2494 | err_dev_add: | ||
| 2490 | free_irq(udc->irq, udc); | 2495 | free_irq(udc->irq, udc); |
| 2491 | err_irq: | 2496 | err_irq: |
| 2492 | iounmap(udc->regs); | 2497 | iounmap(udc->regs); |
| @@ -2507,6 +2512,7 @@ static int __exit pxa_udc_remove(struct platform_device *_dev) | |||
| 2507 | int gpio = udc->mach->gpio_pullup; | 2512 | int gpio = udc->mach->gpio_pullup; |
| 2508 | 2513 | ||
| 2509 | usb_del_gadget_udc(&udc->gadget); | 2514 | usb_del_gadget_udc(&udc->gadget); |
| 2515 | device_del(&udc->gadget.dev); | ||
| 2510 | usb_gadget_unregister_driver(udc->driver); | 2516 | usb_gadget_unregister_driver(udc->driver); |
| 2511 | free_irq(udc->irq, udc); | 2517 | free_irq(udc->irq, udc); |
| 2512 | pxa_cleanup_debugfs(udc); | 2518 | pxa_cleanup_debugfs(udc); |
diff --git a/drivers/usb/gadget/s3c2410_udc.c b/drivers/usb/gadget/s3c2410_udc.c index fc07b4381286..08f89652533b 100644 --- a/drivers/usb/gadget/s3c2410_udc.c +++ b/drivers/usb/gadget/s3c2410_udc.c | |||
| @@ -1668,8 +1668,7 @@ static void s3c2410_udc_enable(struct s3c2410_udc *dev) | |||
| 1668 | static int s3c2410_udc_start(struct usb_gadget *g, | 1668 | static int s3c2410_udc_start(struct usb_gadget *g, |
| 1669 | struct usb_gadget_driver *driver) | 1669 | struct usb_gadget_driver *driver) |
| 1670 | { | 1670 | { |
| 1671 | struct s3c2410_udc *udc = to_s3c2410(g) | 1671 | struct s3c2410_udc *udc = to_s3c2410(g); |
| 1672 | int retval; | ||
| 1673 | 1672 | ||
| 1674 | dprintk(DEBUG_NORMAL, "%s() '%s'\n", __func__, driver->driver.name); | 1673 | dprintk(DEBUG_NORMAL, "%s() '%s'\n", __func__, driver->driver.name); |
| 1675 | 1674 | ||
| @@ -1677,22 +1676,10 @@ static int s3c2410_udc_start(struct usb_gadget *g, | |||
| 1677 | udc->driver = driver; | 1676 | udc->driver = driver; |
| 1678 | udc->gadget.dev.driver = &driver->driver; | 1677 | udc->gadget.dev.driver = &driver->driver; |
| 1679 | 1678 | ||
| 1680 | /* Bind the driver */ | ||
| 1681 | retval = device_add(&udc->gadget.dev); | ||
| 1682 | if (retval) { | ||
| 1683 | dev_err(&udc->gadget.dev, "Error in device_add() : %d\n", retval); | ||
| 1684 | goto register_error; | ||
| 1685 | } | ||
| 1686 | |||
| 1687 | /* Enable udc */ | 1679 | /* Enable udc */ |
| 1688 | s3c2410_udc_enable(udc); | 1680 | s3c2410_udc_enable(udc); |
| 1689 | 1681 | ||
| 1690 | return 0; | 1682 | return 0; |
| 1691 | |||
| 1692 | register_error: | ||
| 1693 | udc->driver = NULL; | ||
| 1694 | udc->gadget.dev.driver = NULL; | ||
| 1695 | return retval; | ||
| 1696 | } | 1683 | } |
| 1697 | 1684 | ||
| 1698 | static int s3c2410_udc_stop(struct usb_gadget *g, | 1685 | static int s3c2410_udc_stop(struct usb_gadget *g, |
| @@ -1700,7 +1687,6 @@ static int s3c2410_udc_stop(struct usb_gadget *g, | |||
| 1700 | { | 1687 | { |
| 1701 | struct s3c2410_udc *udc = to_s3c2410(g); | 1688 | struct s3c2410_udc *udc = to_s3c2410(g); |
| 1702 | 1689 | ||
| 1703 | device_del(&udc->gadget.dev); | ||
| 1704 | udc->driver = NULL; | 1690 | udc->driver = NULL; |
| 1705 | 1691 | ||
| 1706 | /* Disable udc */ | 1692 | /* Disable udc */ |
| @@ -1842,6 +1828,13 @@ static int s3c2410_udc_probe(struct platform_device *pdev) | |||
| 1842 | udc->gadget.dev.parent = &pdev->dev; | 1828 | udc->gadget.dev.parent = &pdev->dev; |
| 1843 | udc->gadget.dev.dma_mask = pdev->dev.dma_mask; | 1829 | udc->gadget.dev.dma_mask = pdev->dev.dma_mask; |
| 1844 | 1830 | ||
| 1831 | /* Bind the driver */ | ||
| 1832 | retval = device_add(&udc->gadget.dev); | ||
| 1833 | if (retval) { | ||
| 1834 | dev_err(&udc->gadget.dev, "Error in device_add() : %d\n", retval); | ||
| 1835 | goto err_device_add; | ||
| 1836 | } | ||
| 1837 | |||
| 1845 | the_controller = udc; | 1838 | the_controller = udc; |
| 1846 | platform_set_drvdata(pdev, udc); | 1839 | platform_set_drvdata(pdev, udc); |
| 1847 | 1840 | ||
| @@ -1930,6 +1923,8 @@ err_gpio_claim: | |||
| 1930 | err_int: | 1923 | err_int: |
| 1931 | free_irq(IRQ_USBD, udc); | 1924 | free_irq(IRQ_USBD, udc); |
| 1932 | err_map: | 1925 | err_map: |
| 1926 | device_unregister(&udc->gadget.dev); | ||
| 1927 | err_device_add: | ||
| 1933 | iounmap(base_addr); | 1928 | iounmap(base_addr); |
| 1934 | err_mem: | 1929 | err_mem: |
| 1935 | release_mem_region(rsrc_start, rsrc_len); | 1930 | release_mem_region(rsrc_start, rsrc_len); |
| @@ -1947,10 +1942,11 @@ static int s3c2410_udc_remove(struct platform_device *pdev) | |||
| 1947 | 1942 | ||
| 1948 | dev_dbg(&pdev->dev, "%s()\n", __func__); | 1943 | dev_dbg(&pdev->dev, "%s()\n", __func__); |
| 1949 | 1944 | ||
| 1950 | usb_del_gadget_udc(&udc->gadget); | ||
| 1951 | if (udc->driver) | 1945 | if (udc->driver) |
| 1952 | return -EBUSY; | 1946 | return -EBUSY; |
| 1953 | 1947 | ||
| 1948 | usb_del_gadget_udc(&udc->gadget); | ||
| 1949 | device_unregister(&udc->gadget.dev); | ||
| 1954 | debugfs_remove(udc->regs_info); | 1950 | debugfs_remove(udc->regs_info); |
| 1955 | 1951 | ||
| 1956 | if (udc_info && !udc_info->udc_command && | 1952 | if (udc_info && !udc_info->udc_command && |
diff --git a/drivers/usb/gadget/u_serial.c b/drivers/usb/gadget/u_serial.c index c5034d9c946b..b369292d4b90 100644 --- a/drivers/usb/gadget/u_serial.c +++ b/drivers/usb/gadget/u_serial.c | |||
| @@ -136,7 +136,7 @@ static struct portmaster { | |||
| 136 | pr_debug(fmt, ##arg) | 136 | pr_debug(fmt, ##arg) |
| 137 | #endif /* pr_vdebug */ | 137 | #endif /* pr_vdebug */ |
| 138 | #else | 138 | #else |
| 139 | #ifndef pr_vdebig | 139 | #ifndef pr_vdebug |
| 140 | #define pr_vdebug(fmt, arg...) \ | 140 | #define pr_vdebug(fmt, arg...) \ |
| 141 | ({ if (0) pr_debug(fmt, ##arg); }) | 141 | ({ if (0) pr_debug(fmt, ##arg); }) |
| 142 | #endif /* pr_vdebug */ | 142 | #endif /* pr_vdebug */ |
diff --git a/drivers/usb/gadget/u_uac1.c b/drivers/usb/gadget/u_uac1.c index e0c5e88e03ed..c7d460f43390 100644 --- a/drivers/usb/gadget/u_uac1.c +++ b/drivers/usb/gadget/u_uac1.c | |||
| @@ -240,8 +240,11 @@ static int gaudio_open_snd_dev(struct gaudio *card) | |||
| 240 | snd = &card->playback; | 240 | snd = &card->playback; |
| 241 | snd->filp = filp_open(fn_play, O_WRONLY, 0); | 241 | snd->filp = filp_open(fn_play, O_WRONLY, 0); |
| 242 | if (IS_ERR(snd->filp)) { | 242 | if (IS_ERR(snd->filp)) { |
| 243 | int ret = PTR_ERR(snd->filp); | ||
| 244 | |||
| 243 | ERROR(card, "No such PCM playback device: %s\n", fn_play); | 245 | ERROR(card, "No such PCM playback device: %s\n", fn_play); |
| 244 | snd->filp = NULL; | 246 | snd->filp = NULL; |
| 247 | return ret; | ||
| 245 | } | 248 | } |
| 246 | pcm_file = snd->filp->private_data; | 249 | pcm_file = snd->filp->private_data; |
| 247 | snd->substream = pcm_file->substream; | 250 | snd->substream = pcm_file->substream; |
diff --git a/drivers/usb/gadget/udc-core.c b/drivers/usb/gadget/udc-core.c index 2a9cd369f71c..f8f62c3ed65e 100644 --- a/drivers/usb/gadget/udc-core.c +++ b/drivers/usb/gadget/udc-core.c | |||
| @@ -216,7 +216,7 @@ static void usb_gadget_remove_driver(struct usb_udc *udc) | |||
| 216 | usb_gadget_disconnect(udc->gadget); | 216 | usb_gadget_disconnect(udc->gadget); |
| 217 | udc->driver->disconnect(udc->gadget); | 217 | udc->driver->disconnect(udc->gadget); |
| 218 | udc->driver->unbind(udc->gadget); | 218 | udc->driver->unbind(udc->gadget); |
| 219 | usb_gadget_udc_stop(udc->gadget, udc->driver); | 219 | usb_gadget_udc_stop(udc->gadget, NULL); |
| 220 | 220 | ||
| 221 | udc->driver = NULL; | 221 | udc->driver = NULL; |
| 222 | udc->dev.driver = NULL; | 222 | udc->dev.driver = NULL; |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index b416a3fc9959..416a6dce5e11 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
| @@ -302,6 +302,7 @@ static void ehci_quiesce (struct ehci_hcd *ehci) | |||
| 302 | 302 | ||
| 303 | static void end_unlink_async(struct ehci_hcd *ehci); | 303 | static void end_unlink_async(struct ehci_hcd *ehci); |
| 304 | static void unlink_empty_async(struct ehci_hcd *ehci); | 304 | static void unlink_empty_async(struct ehci_hcd *ehci); |
| 305 | static void unlink_empty_async_suspended(struct ehci_hcd *ehci); | ||
| 305 | static void ehci_work(struct ehci_hcd *ehci); | 306 | static void ehci_work(struct ehci_hcd *ehci); |
| 306 | static void start_unlink_intr(struct ehci_hcd *ehci, struct ehci_qh *qh); | 307 | static void start_unlink_intr(struct ehci_hcd *ehci, struct ehci_qh *qh); |
| 307 | static void end_unlink_intr(struct ehci_hcd *ehci, struct ehci_qh *qh); | 308 | static void end_unlink_intr(struct ehci_hcd *ehci, struct ehci_qh *qh); |
| @@ -748,11 +749,9 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
| 748 | /* guard against (alleged) silicon errata */ | 749 | /* guard against (alleged) silicon errata */ |
| 749 | if (cmd & CMD_IAAD) | 750 | if (cmd & CMD_IAAD) |
| 750 | ehci_dbg(ehci, "IAA with IAAD still set?\n"); | 751 | ehci_dbg(ehci, "IAA with IAAD still set?\n"); |
| 751 | if (ehci->async_iaa) { | 752 | if (ehci->async_iaa) |
| 752 | COUNT(ehci->stats.iaa); | 753 | COUNT(ehci->stats.iaa); |
| 753 | end_unlink_async(ehci); | 754 | end_unlink_async(ehci); |
| 754 | } else | ||
| 755 | ehci_dbg(ehci, "IAA with nothing unlinked?\n"); | ||
| 756 | } | 755 | } |
| 757 | 756 | ||
| 758 | /* remote wakeup [4.3.1] */ | 757 | /* remote wakeup [4.3.1] */ |
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 4d3b294f203e..7d06e77f6c4f 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
| @@ -328,7 +328,7 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
| 328 | ehci->rh_state = EHCI_RH_SUSPENDED; | 328 | ehci->rh_state = EHCI_RH_SUSPENDED; |
| 329 | 329 | ||
| 330 | end_unlink_async(ehci); | 330 | end_unlink_async(ehci); |
| 331 | unlink_empty_async(ehci); | 331 | unlink_empty_async_suspended(ehci); |
| 332 | ehci_handle_intr_unlinks(ehci); | 332 | ehci_handle_intr_unlinks(ehci); |
| 333 | end_free_itds(ehci); | 333 | end_free_itds(ehci); |
| 334 | 334 | ||
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index fd252f0cfb3a..23d136904285 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
| @@ -135,7 +135,7 @@ qh_refresh (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 135 | * qtd is updated in qh_completions(). Update the QH | 135 | * qtd is updated in qh_completions(). Update the QH |
| 136 | * overlay here. | 136 | * overlay here. |
| 137 | */ | 137 | */ |
| 138 | if (cpu_to_hc32(ehci, qtd->qtd_dma) == qh->hw->hw_current) { | 138 | if (qh->hw->hw_token & ACTIVE_BIT(ehci)) { |
| 139 | qh->hw->hw_qtd_next = qtd->hw_next; | 139 | qh->hw->hw_qtd_next = qtd->hw_next; |
| 140 | qtd = NULL; | 140 | qtd = NULL; |
| 141 | } | 141 | } |
| @@ -449,11 +449,19 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 449 | else if (last_status == -EINPROGRESS && !urb->unlinked) | 449 | else if (last_status == -EINPROGRESS && !urb->unlinked) |
| 450 | continue; | 450 | continue; |
| 451 | 451 | ||
| 452 | /* qh unlinked; token in overlay may be most current */ | 452 | /* |
| 453 | if (state == QH_STATE_IDLE | 453 | * If this was the active qtd when the qh was unlinked |
| 454 | && cpu_to_hc32(ehci, qtd->qtd_dma) | 454 | * and the overlay's token is active, then the overlay |
| 455 | == hw->hw_current) { | 455 | * hasn't been written back to the qtd yet so use its |
| 456 | * token instead of the qtd's. After the qtd is | ||
| 457 | * processed and removed, the overlay won't be valid | ||
| 458 | * any more. | ||
| 459 | */ | ||
| 460 | if (state == QH_STATE_IDLE && | ||
| 461 | qh->qtd_list.next == &qtd->qtd_list && | ||
| 462 | (hw->hw_token & ACTIVE_BIT(ehci))) { | ||
| 456 | token = hc32_to_cpu(ehci, hw->hw_token); | 463 | token = hc32_to_cpu(ehci, hw->hw_token); |
| 464 | hw->hw_token &= ~ACTIVE_BIT(ehci); | ||
| 457 | 465 | ||
| 458 | /* An unlink may leave an incomplete | 466 | /* An unlink may leave an incomplete |
| 459 | * async transaction in the TT buffer. | 467 | * async transaction in the TT buffer. |
| @@ -1170,7 +1178,7 @@ static void single_unlink_async(struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 1170 | struct ehci_qh *prev; | 1178 | struct ehci_qh *prev; |
| 1171 | 1179 | ||
| 1172 | /* Add to the end of the list of QHs waiting for the next IAAD */ | 1180 | /* Add to the end of the list of QHs waiting for the next IAAD */ |
| 1173 | qh->qh_state = QH_STATE_UNLINK; | 1181 | qh->qh_state = QH_STATE_UNLINK_WAIT; |
| 1174 | if (ehci->async_unlink) | 1182 | if (ehci->async_unlink) |
| 1175 | ehci->async_unlink_last->unlink_next = qh; | 1183 | ehci->async_unlink_last->unlink_next = qh; |
| 1176 | else | 1184 | else |
| @@ -1213,9 +1221,19 @@ static void start_iaa_cycle(struct ehci_hcd *ehci, bool nested) | |||
| 1213 | 1221 | ||
| 1214 | /* Do only the first waiting QH (nVidia bug?) */ | 1222 | /* Do only the first waiting QH (nVidia bug?) */ |
| 1215 | qh = ehci->async_unlink; | 1223 | qh = ehci->async_unlink; |
| 1216 | ehci->async_iaa = qh; | 1224 | |
| 1217 | ehci->async_unlink = qh->unlink_next; | 1225 | /* |
| 1218 | qh->unlink_next = NULL; | 1226 | * Intel (?) bug: The HC can write back the overlay region |
| 1227 | * even after the IAA interrupt occurs. In self-defense, | ||
| 1228 | * always go through two IAA cycles for each QH. | ||
| 1229 | */ | ||
| 1230 | if (qh->qh_state == QH_STATE_UNLINK_WAIT) { | ||
| 1231 | qh->qh_state = QH_STATE_UNLINK; | ||
| 1232 | } else { | ||
| 1233 | ehci->async_iaa = qh; | ||
| 1234 | ehci->async_unlink = qh->unlink_next; | ||
| 1235 | qh->unlink_next = NULL; | ||
| 1236 | } | ||
| 1219 | 1237 | ||
| 1220 | /* Make sure the unlinks are all visible to the hardware */ | 1238 | /* Make sure the unlinks are all visible to the hardware */ |
| 1221 | wmb(); | 1239 | wmb(); |
| @@ -1298,6 +1316,19 @@ static void unlink_empty_async(struct ehci_hcd *ehci) | |||
| 1298 | } | 1316 | } |
| 1299 | } | 1317 | } |
| 1300 | 1318 | ||
| 1319 | /* The root hub is suspended; unlink all the async QHs */ | ||
| 1320 | static void unlink_empty_async_suspended(struct ehci_hcd *ehci) | ||
| 1321 | { | ||
| 1322 | struct ehci_qh *qh; | ||
| 1323 | |||
| 1324 | while (ehci->async->qh_next.qh) { | ||
| 1325 | qh = ehci->async->qh_next.qh; | ||
| 1326 | WARN_ON(!list_empty(&qh->qtd_list)); | ||
| 1327 | single_unlink_async(ehci, qh); | ||
| 1328 | } | ||
| 1329 | start_iaa_cycle(ehci, false); | ||
| 1330 | } | ||
| 1331 | |||
| 1301 | /* makes sure the async qh will become idle */ | 1332 | /* makes sure the async qh will become idle */ |
| 1302 | /* caller must own ehci->lock */ | 1333 | /* caller must own ehci->lock */ |
| 1303 | 1334 | ||
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index b476daf49f6f..010f686d8881 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
| @@ -1214,6 +1214,7 @@ itd_urb_transaction ( | |||
| 1214 | 1214 | ||
| 1215 | memset (itd, 0, sizeof *itd); | 1215 | memset (itd, 0, sizeof *itd); |
| 1216 | itd->itd_dma = itd_dma; | 1216 | itd->itd_dma = itd_dma; |
| 1217 | itd->frame = 9999; /* an invalid value */ | ||
| 1217 | list_add (&itd->itd_list, &sched->td_list); | 1218 | list_add (&itd->itd_list, &sched->td_list); |
| 1218 | } | 1219 | } |
| 1219 | spin_unlock_irqrestore (&ehci->lock, flags); | 1220 | spin_unlock_irqrestore (&ehci->lock, flags); |
| @@ -1915,6 +1916,7 @@ sitd_urb_transaction ( | |||
| 1915 | 1916 | ||
| 1916 | memset (sitd, 0, sizeof *sitd); | 1917 | memset (sitd, 0, sizeof *sitd); |
| 1917 | sitd->sitd_dma = sitd_dma; | 1918 | sitd->sitd_dma = sitd_dma; |
| 1919 | sitd->frame = 9999; /* an invalid value */ | ||
| 1918 | list_add (&sitd->sitd_list, &iso_sched->td_list); | 1920 | list_add (&sitd->sitd_list, &iso_sched->td_list); |
| 1919 | } | 1921 | } |
| 1920 | 1922 | ||
diff --git a/drivers/usb/host/ehci-timer.c b/drivers/usb/host/ehci-timer.c index 20dbdcbe9b0f..c3fa1305f830 100644 --- a/drivers/usb/host/ehci-timer.c +++ b/drivers/usb/host/ehci-timer.c | |||
| @@ -304,7 +304,7 @@ static void ehci_iaa_watchdog(struct ehci_hcd *ehci) | |||
| 304 | * (a) SMP races against real IAA firing and retriggering, and | 304 | * (a) SMP races against real IAA firing and retriggering, and |
| 305 | * (b) clean HC shutdown, when IAA watchdog was pending. | 305 | * (b) clean HC shutdown, when IAA watchdog was pending. |
| 306 | */ | 306 | */ |
| 307 | if (ehci->async_iaa) { | 307 | if (1) { |
| 308 | u32 cmd, status; | 308 | u32 cmd, status; |
| 309 | 309 | ||
| 310 | /* If we get here, IAA is *REALLY* late. It's barely | 310 | /* If we get here, IAA is *REALLY* late. It's barely |
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 35616ffbe3ae..6dc238c592bc 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
| @@ -1022,44 +1022,24 @@ void xhci_copy_ep0_dequeue_into_input_ctx(struct xhci_hcd *xhci, | |||
| 1022 | * is attached to (or the roothub port its ancestor hub is attached to). All we | 1022 | * is attached to (or the roothub port its ancestor hub is attached to). All we |
| 1023 | * know is the index of that port under either the USB 2.0 or the USB 3.0 | 1023 | * know is the index of that port under either the USB 2.0 or the USB 3.0 |
| 1024 | * roothub, but that doesn't give us the real index into the HW port status | 1024 | * roothub, but that doesn't give us the real index into the HW port status |
| 1025 | * registers. Scan through the xHCI roothub port array, looking for the Nth | 1025 | * registers. Call xhci_find_raw_port_number() to get real index. |
| 1026 | * entry of the correct port speed. Return the port number of that entry. | ||
| 1027 | */ | 1026 | */ |
| 1028 | static u32 xhci_find_real_port_number(struct xhci_hcd *xhci, | 1027 | static u32 xhci_find_real_port_number(struct xhci_hcd *xhci, |
| 1029 | struct usb_device *udev) | 1028 | struct usb_device *udev) |
| 1030 | { | 1029 | { |
| 1031 | struct usb_device *top_dev; | 1030 | struct usb_device *top_dev; |
| 1032 | unsigned int num_similar_speed_ports; | 1031 | struct usb_hcd *hcd; |
| 1033 | unsigned int faked_port_num; | 1032 | |
| 1034 | int i; | 1033 | if (udev->speed == USB_SPEED_SUPER) |
| 1034 | hcd = xhci->shared_hcd; | ||
| 1035 | else | ||
| 1036 | hcd = xhci->main_hcd; | ||
| 1035 | 1037 | ||
| 1036 | for (top_dev = udev; top_dev->parent && top_dev->parent->parent; | 1038 | for (top_dev = udev; top_dev->parent && top_dev->parent->parent; |
| 1037 | top_dev = top_dev->parent) | 1039 | top_dev = top_dev->parent) |
| 1038 | /* Found device below root hub */; | 1040 | /* Found device below root hub */; |
| 1039 | faked_port_num = top_dev->portnum; | ||
| 1040 | for (i = 0, num_similar_speed_ports = 0; | ||
| 1041 | i < HCS_MAX_PORTS(xhci->hcs_params1); i++) { | ||
| 1042 | u8 port_speed = xhci->port_array[i]; | ||
| 1043 | |||
| 1044 | /* | ||
| 1045 | * Skip ports that don't have known speeds, or have duplicate | ||
| 1046 | * Extended Capabilities port speed entries. | ||
| 1047 | */ | ||
| 1048 | if (port_speed == 0 || port_speed == DUPLICATE_ENTRY) | ||
| 1049 | continue; | ||
| 1050 | 1041 | ||
| 1051 | /* | 1042 | return xhci_find_raw_port_number(hcd, top_dev->portnum); |
| 1052 | * USB 3.0 ports are always under a USB 3.0 hub. USB 2.0 and | ||
| 1053 | * 1.1 ports are under the USB 2.0 hub. If the port speed | ||
| 1054 | * matches the device speed, it's a similar speed port. | ||
| 1055 | */ | ||
| 1056 | if ((port_speed == 0x03) == (udev->speed == USB_SPEED_SUPER)) | ||
| 1057 | num_similar_speed_ports++; | ||
| 1058 | if (num_similar_speed_ports == faked_port_num) | ||
| 1059 | /* Roothub ports are numbered from 1 to N */ | ||
| 1060 | return i+1; | ||
| 1061 | } | ||
| 1062 | return 0; | ||
| 1063 | } | 1043 | } |
| 1064 | 1044 | ||
| 1065 | /* Setup an xHCI virtual device for a Set Address command */ | 1045 | /* Setup an xHCI virtual device for a Set Address command */ |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index af259e0ec172..1a30c380043c 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
| @@ -313,6 +313,7 @@ static const struct hc_driver xhci_pci_hc_driver = { | |||
| 313 | .set_usb2_hw_lpm = xhci_set_usb2_hardware_lpm, | 313 | .set_usb2_hw_lpm = xhci_set_usb2_hardware_lpm, |
| 314 | .enable_usb3_lpm_timeout = xhci_enable_usb3_lpm_timeout, | 314 | .enable_usb3_lpm_timeout = xhci_enable_usb3_lpm_timeout, |
| 315 | .disable_usb3_lpm_timeout = xhci_disable_usb3_lpm_timeout, | 315 | .disable_usb3_lpm_timeout = xhci_disable_usb3_lpm_timeout, |
| 316 | .find_raw_port_number = xhci_find_raw_port_number, | ||
| 316 | }; | 317 | }; |
| 317 | 318 | ||
| 318 | /*-------------------------------------------------------------------------*/ | 319 | /*-------------------------------------------------------------------------*/ |
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 882875465301..1969c001b3f9 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
| @@ -1599,14 +1599,20 @@ static void handle_port_status(struct xhci_hcd *xhci, | |||
| 1599 | max_ports = HCS_MAX_PORTS(xhci->hcs_params1); | 1599 | max_ports = HCS_MAX_PORTS(xhci->hcs_params1); |
| 1600 | if ((port_id <= 0) || (port_id > max_ports)) { | 1600 | if ((port_id <= 0) || (port_id > max_ports)) { |
| 1601 | xhci_warn(xhci, "Invalid port id %d\n", port_id); | 1601 | xhci_warn(xhci, "Invalid port id %d\n", port_id); |
| 1602 | bogus_port_status = true; | 1602 | inc_deq(xhci, xhci->event_ring); |
| 1603 | goto cleanup; | 1603 | return; |
| 1604 | } | 1604 | } |
| 1605 | 1605 | ||
| 1606 | /* Figure out which usb_hcd this port is attached to: | 1606 | /* Figure out which usb_hcd this port is attached to: |
| 1607 | * is it a USB 3.0 port or a USB 2.0/1.1 port? | 1607 | * is it a USB 3.0 port or a USB 2.0/1.1 port? |
| 1608 | */ | 1608 | */ |
| 1609 | major_revision = xhci->port_array[port_id - 1]; | 1609 | major_revision = xhci->port_array[port_id - 1]; |
| 1610 | |||
| 1611 | /* Find the right roothub. */ | ||
| 1612 | hcd = xhci_to_hcd(xhci); | ||
| 1613 | if ((major_revision == 0x03) != (hcd->speed == HCD_USB3)) | ||
| 1614 | hcd = xhci->shared_hcd; | ||
| 1615 | |||
| 1610 | if (major_revision == 0) { | 1616 | if (major_revision == 0) { |
| 1611 | xhci_warn(xhci, "Event for port %u not in " | 1617 | xhci_warn(xhci, "Event for port %u not in " |
| 1612 | "Extended Capabilities, ignoring.\n", | 1618 | "Extended Capabilities, ignoring.\n", |
| @@ -1629,10 +1635,6 @@ static void handle_port_status(struct xhci_hcd *xhci, | |||
| 1629 | * into the index into the ports on the correct split roothub, and the | 1635 | * into the index into the ports on the correct split roothub, and the |
| 1630 | * correct bus_state structure. | 1636 | * correct bus_state structure. |
| 1631 | */ | 1637 | */ |
| 1632 | /* Find the right roothub. */ | ||
| 1633 | hcd = xhci_to_hcd(xhci); | ||
| 1634 | if ((major_revision == 0x03) != (hcd->speed == HCD_USB3)) | ||
| 1635 | hcd = xhci->shared_hcd; | ||
| 1636 | bus_state = &xhci->bus_state[hcd_index(hcd)]; | 1638 | bus_state = &xhci->bus_state[hcd_index(hcd)]; |
| 1637 | if (hcd->speed == HCD_USB3) | 1639 | if (hcd->speed == HCD_USB3) |
| 1638 | port_array = xhci->usb3_ports; | 1640 | port_array = xhci->usb3_ports; |
| @@ -2027,8 +2029,8 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 2027 | if (event_trb != ep_ring->dequeue && | 2029 | if (event_trb != ep_ring->dequeue && |
| 2028 | event_trb != td->last_trb) | 2030 | event_trb != td->last_trb) |
| 2029 | td->urb->actual_length = | 2031 | td->urb->actual_length = |
| 2030 | td->urb->transfer_buffer_length | 2032 | td->urb->transfer_buffer_length - |
| 2031 | - TRB_LEN(le32_to_cpu(event->transfer_len)); | 2033 | EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)); |
| 2032 | else | 2034 | else |
| 2033 | td->urb->actual_length = 0; | 2035 | td->urb->actual_length = 0; |
| 2034 | 2036 | ||
| @@ -2060,7 +2062,7 @@ static int process_ctrl_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 2060 | /* Maybe the event was for the data stage? */ | 2062 | /* Maybe the event was for the data stage? */ |
| 2061 | td->urb->actual_length = | 2063 | td->urb->actual_length = |
| 2062 | td->urb->transfer_buffer_length - | 2064 | td->urb->transfer_buffer_length - |
| 2063 | TRB_LEN(le32_to_cpu(event->transfer_len)); | 2065 | EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)); |
| 2064 | xhci_dbg(xhci, "Waiting for status " | 2066 | xhci_dbg(xhci, "Waiting for status " |
| 2065 | "stage event\n"); | 2067 | "stage event\n"); |
| 2066 | return 0; | 2068 | return 0; |
| @@ -2096,7 +2098,7 @@ static int process_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 2096 | /* handle completion code */ | 2098 | /* handle completion code */ |
| 2097 | switch (trb_comp_code) { | 2099 | switch (trb_comp_code) { |
| 2098 | case COMP_SUCCESS: | 2100 | case COMP_SUCCESS: |
| 2099 | if (TRB_LEN(le32_to_cpu(event->transfer_len)) == 0) { | 2101 | if (EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)) == 0) { |
| 2100 | frame->status = 0; | 2102 | frame->status = 0; |
| 2101 | break; | 2103 | break; |
| 2102 | } | 2104 | } |
| @@ -2141,7 +2143,7 @@ static int process_isoc_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 2141 | len += TRB_LEN(le32_to_cpu(cur_trb->generic.field[2])); | 2143 | len += TRB_LEN(le32_to_cpu(cur_trb->generic.field[2])); |
| 2142 | } | 2144 | } |
| 2143 | len += TRB_LEN(le32_to_cpu(cur_trb->generic.field[2])) - | 2145 | len += TRB_LEN(le32_to_cpu(cur_trb->generic.field[2])) - |
| 2144 | TRB_LEN(le32_to_cpu(event->transfer_len)); | 2146 | EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)); |
| 2145 | 2147 | ||
| 2146 | if (trb_comp_code != COMP_STOP_INVAL) { | 2148 | if (trb_comp_code != COMP_STOP_INVAL) { |
| 2147 | frame->actual_length = len; | 2149 | frame->actual_length = len; |
| @@ -2199,7 +2201,7 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 2199 | case COMP_SUCCESS: | 2201 | case COMP_SUCCESS: |
| 2200 | /* Double check that the HW transferred everything. */ | 2202 | /* Double check that the HW transferred everything. */ |
| 2201 | if (event_trb != td->last_trb || | 2203 | if (event_trb != td->last_trb || |
| 2202 | TRB_LEN(le32_to_cpu(event->transfer_len)) != 0) { | 2204 | EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)) != 0) { |
| 2203 | xhci_warn(xhci, "WARN Successful completion " | 2205 | xhci_warn(xhci, "WARN Successful completion " |
| 2204 | "on short TX\n"); | 2206 | "on short TX\n"); |
| 2205 | if (td->urb->transfer_flags & URB_SHORT_NOT_OK) | 2207 | if (td->urb->transfer_flags & URB_SHORT_NOT_OK) |
| @@ -2227,18 +2229,18 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 2227 | "%d bytes untransferred\n", | 2229 | "%d bytes untransferred\n", |
| 2228 | td->urb->ep->desc.bEndpointAddress, | 2230 | td->urb->ep->desc.bEndpointAddress, |
| 2229 | td->urb->transfer_buffer_length, | 2231 | td->urb->transfer_buffer_length, |
| 2230 | TRB_LEN(le32_to_cpu(event->transfer_len))); | 2232 | EVENT_TRB_LEN(le32_to_cpu(event->transfer_len))); |
| 2231 | /* Fast path - was this the last TRB in the TD for this URB? */ | 2233 | /* Fast path - was this the last TRB in the TD for this URB? */ |
| 2232 | if (event_trb == td->last_trb) { | 2234 | if (event_trb == td->last_trb) { |
| 2233 | if (TRB_LEN(le32_to_cpu(event->transfer_len)) != 0) { | 2235 | if (EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)) != 0) { |
| 2234 | td->urb->actual_length = | 2236 | td->urb->actual_length = |
| 2235 | td->urb->transfer_buffer_length - | 2237 | td->urb->transfer_buffer_length - |
| 2236 | TRB_LEN(le32_to_cpu(event->transfer_len)); | 2238 | EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)); |
| 2237 | if (td->urb->transfer_buffer_length < | 2239 | if (td->urb->transfer_buffer_length < |
| 2238 | td->urb->actual_length) { | 2240 | td->urb->actual_length) { |
| 2239 | xhci_warn(xhci, "HC gave bad length " | 2241 | xhci_warn(xhci, "HC gave bad length " |
| 2240 | "of %d bytes left\n", | 2242 | "of %d bytes left\n", |
| 2241 | TRB_LEN(le32_to_cpu(event->transfer_len))); | 2243 | EVENT_TRB_LEN(le32_to_cpu(event->transfer_len))); |
| 2242 | td->urb->actual_length = 0; | 2244 | td->urb->actual_length = 0; |
| 2243 | if (td->urb->transfer_flags & URB_SHORT_NOT_OK) | 2245 | if (td->urb->transfer_flags & URB_SHORT_NOT_OK) |
| 2244 | *status = -EREMOTEIO; | 2246 | *status = -EREMOTEIO; |
| @@ -2280,7 +2282,7 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 2280 | if (trb_comp_code != COMP_STOP_INVAL) | 2282 | if (trb_comp_code != COMP_STOP_INVAL) |
| 2281 | td->urb->actual_length += | 2283 | td->urb->actual_length += |
| 2282 | TRB_LEN(le32_to_cpu(cur_trb->generic.field[2])) - | 2284 | TRB_LEN(le32_to_cpu(cur_trb->generic.field[2])) - |
| 2283 | TRB_LEN(le32_to_cpu(event->transfer_len)); | 2285 | EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)); |
| 2284 | } | 2286 | } |
| 2285 | 2287 | ||
| 2286 | return finish_td(xhci, td, event_trb, event, ep, status, false); | 2288 | return finish_td(xhci, td, event_trb, event, ep, status, false); |
| @@ -2368,7 +2370,7 @@ static int handle_tx_event(struct xhci_hcd *xhci, | |||
| 2368 | * transfer type | 2370 | * transfer type |
| 2369 | */ | 2371 | */ |
| 2370 | case COMP_SUCCESS: | 2372 | case COMP_SUCCESS: |
| 2371 | if (TRB_LEN(le32_to_cpu(event->transfer_len)) == 0) | 2373 | if (EVENT_TRB_LEN(le32_to_cpu(event->transfer_len)) == 0) |
| 2372 | break; | 2374 | break; |
| 2373 | if (xhci->quirks & XHCI_TRUST_TX_LENGTH) | 2375 | if (xhci->quirks & XHCI_TRUST_TX_LENGTH) |
| 2374 | trb_comp_code = COMP_SHORT_TX; | 2376 | trb_comp_code = COMP_SHORT_TX; |
| @@ -2461,14 +2463,21 @@ static int handle_tx_event(struct xhci_hcd *xhci, | |||
| 2461 | * TD list. | 2463 | * TD list. |
| 2462 | */ | 2464 | */ |
| 2463 | if (list_empty(&ep_ring->td_list)) { | 2465 | if (list_empty(&ep_ring->td_list)) { |
| 2464 | xhci_warn(xhci, "WARN Event TRB for slot %d ep %d " | 2466 | /* |
| 2465 | "with no TDs queued?\n", | 2467 | * A stopped endpoint may generate an extra completion |
| 2466 | TRB_TO_SLOT_ID(le32_to_cpu(event->flags)), | 2468 | * event if the device was suspended. Don't print |
| 2467 | ep_index); | 2469 | * warnings. |
| 2468 | xhci_dbg(xhci, "Event TRB with TRB type ID %u\n", | 2470 | */ |
| 2469 | (le32_to_cpu(event->flags) & | 2471 | if (!(trb_comp_code == COMP_STOP || |
| 2470 | TRB_TYPE_BITMASK)>>10); | 2472 | trb_comp_code == COMP_STOP_INVAL)) { |
| 2471 | xhci_print_trb_offsets(xhci, (union xhci_trb *) event); | 2473 | xhci_warn(xhci, "WARN Event TRB for slot %d ep %d with no TDs queued?\n", |
| 2474 | TRB_TO_SLOT_ID(le32_to_cpu(event->flags)), | ||
| 2475 | ep_index); | ||
| 2476 | xhci_dbg(xhci, "Event TRB with TRB type ID %u\n", | ||
| 2477 | (le32_to_cpu(event->flags) & | ||
| 2478 | TRB_TYPE_BITMASK)>>10); | ||
| 2479 | xhci_print_trb_offsets(xhci, (union xhci_trb *) event); | ||
| 2480 | } | ||
| 2472 | if (ep->skip) { | 2481 | if (ep->skip) { |
| 2473 | ep->skip = false; | 2482 | ep->skip = false; |
| 2474 | xhci_dbg(xhci, "td_list is empty while skip " | 2483 | xhci_dbg(xhci, "td_list is empty while skip " |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index f1f01a834ba7..53b8f89a0b1c 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -350,7 +350,7 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd) | |||
| 350 | * generate interrupts. Don't even try to enable MSI. | 350 | * generate interrupts. Don't even try to enable MSI. |
| 351 | */ | 351 | */ |
| 352 | if (xhci->quirks & XHCI_BROKEN_MSI) | 352 | if (xhci->quirks & XHCI_BROKEN_MSI) |
| 353 | return 0; | 353 | goto legacy_irq; |
| 354 | 354 | ||
| 355 | /* unregister the legacy interrupt */ | 355 | /* unregister the legacy interrupt */ |
| 356 | if (hcd->irq) | 356 | if (hcd->irq) |
| @@ -371,6 +371,7 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd) | |||
| 371 | return -EINVAL; | 371 | return -EINVAL; |
| 372 | } | 372 | } |
| 373 | 373 | ||
| 374 | legacy_irq: | ||
| 374 | /* fall back to legacy interrupt*/ | 375 | /* fall back to legacy interrupt*/ |
| 375 | ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED, | 376 | ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED, |
| 376 | hcd->irq_descr, hcd); | 377 | hcd->irq_descr, hcd); |
| @@ -3778,6 +3779,28 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 3778 | return 0; | 3779 | return 0; |
| 3779 | } | 3780 | } |
| 3780 | 3781 | ||
| 3782 | /* | ||
| 3783 | * Transfer the port index into real index in the HW port status | ||
| 3784 | * registers. Caculate offset between the port's PORTSC register | ||
| 3785 | * and port status base. Divide the number of per port register | ||
| 3786 | * to get the real index. The raw port number bases 1. | ||
| 3787 | */ | ||
| 3788 | int xhci_find_raw_port_number(struct usb_hcd *hcd, int port1) | ||
| 3789 | { | ||
| 3790 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | ||
| 3791 | __le32 __iomem *base_addr = &xhci->op_regs->port_status_base; | ||
| 3792 | __le32 __iomem *addr; | ||
| 3793 | int raw_port; | ||
| 3794 | |||
| 3795 | if (hcd->speed != HCD_USB3) | ||
| 3796 | addr = xhci->usb2_ports[port1 - 1]; | ||
| 3797 | else | ||
| 3798 | addr = xhci->usb3_ports[port1 - 1]; | ||
| 3799 | |||
| 3800 | raw_port = (addr - base_addr)/NUM_PORT_REGS + 1; | ||
| 3801 | return raw_port; | ||
| 3802 | } | ||
| 3803 | |||
| 3781 | #ifdef CONFIG_USB_SUSPEND | 3804 | #ifdef CONFIG_USB_SUSPEND |
| 3782 | 3805 | ||
| 3783 | /* BESL to HIRD Encoding array for USB2 LPM */ | 3806 | /* BESL to HIRD Encoding array for USB2 LPM */ |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index f791bd0aee6c..63582719e0fb 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
| @@ -206,8 +206,8 @@ struct xhci_op_regs { | |||
| 206 | /* bits 12:31 are reserved (and should be preserved on writes). */ | 206 | /* bits 12:31 are reserved (and should be preserved on writes). */ |
| 207 | 207 | ||
| 208 | /* IMAN - Interrupt Management Register */ | 208 | /* IMAN - Interrupt Management Register */ |
| 209 | #define IMAN_IP (1 << 1) | 209 | #define IMAN_IE (1 << 1) |
| 210 | #define IMAN_IE (1 << 0) | 210 | #define IMAN_IP (1 << 0) |
| 211 | 211 | ||
| 212 | /* USBSTS - USB status - status bitmasks */ | 212 | /* USBSTS - USB status - status bitmasks */ |
| 213 | /* HC not running - set to 1 when run/stop bit is cleared. */ | 213 | /* HC not running - set to 1 when run/stop bit is cleared. */ |
| @@ -972,6 +972,10 @@ struct xhci_transfer_event { | |||
| 972 | __le32 flags; | 972 | __le32 flags; |
| 973 | }; | 973 | }; |
| 974 | 974 | ||
| 975 | /* Transfer event TRB length bit mask */ | ||
| 976 | /* bits 0:23 */ | ||
| 977 | #define EVENT_TRB_LEN(p) ((p) & 0xffffff) | ||
| 978 | |||
| 975 | /** Transfer Event bit fields **/ | 979 | /** Transfer Event bit fields **/ |
| 976 | #define TRB_TO_EP_ID(p) (((p) >> 16) & 0x1f) | 980 | #define TRB_TO_EP_ID(p) (((p) >> 16) & 0x1f) |
| 977 | 981 | ||
| @@ -1829,6 +1833,7 @@ void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array, | |||
| 1829 | int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex, | 1833 | int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex, |
| 1830 | char *buf, u16 wLength); | 1834 | char *buf, u16 wLength); |
| 1831 | int xhci_hub_status_data(struct usb_hcd *hcd, char *buf); | 1835 | int xhci_hub_status_data(struct usb_hcd *hcd, char *buf); |
| 1836 | int xhci_find_raw_port_number(struct usb_hcd *hcd, int port1); | ||
| 1832 | 1837 | ||
| 1833 | #ifdef CONFIG_PM | 1838 | #ifdef CONFIG_PM |
| 1834 | int xhci_bus_suspend(struct usb_hcd *hcd); | 1839 | int xhci_bus_suspend(struct usb_hcd *hcd); |
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig index 45b19e2c60ba..05e51432dd2f 100644 --- a/drivers/usb/musb/Kconfig +++ b/drivers/usb/musb/Kconfig | |||
| @@ -7,11 +7,6 @@ | |||
| 7 | config USB_MUSB_HDRC | 7 | config USB_MUSB_HDRC |
| 8 | tristate 'Inventra Highspeed Dual Role Controller (TI, ADI, ...)' | 8 | tristate 'Inventra Highspeed Dual Role Controller (TI, ADI, ...)' |
| 9 | depends on USB && USB_GADGET | 9 | depends on USB && USB_GADGET |
| 10 | select NOP_USB_XCEIV if (ARCH_DAVINCI || MACH_OMAP3EVM || BLACKFIN) | ||
| 11 | select NOP_USB_XCEIV if (SOC_TI81XX || SOC_AM33XX) | ||
| 12 | select TWL4030_USB if MACH_OMAP_3430SDP | ||
| 13 | select TWL6030_USB if MACH_OMAP_4430SDP || MACH_OMAP4_PANDA | ||
| 14 | select OMAP_CONTROL_USB if MACH_OMAP_4430SDP || MACH_OMAP4_PANDA | ||
| 15 | select USB_OTG_UTILS | 10 | select USB_OTG_UTILS |
| 16 | help | 11 | help |
| 17 | Say Y here if your system has a dual role high speed USB | 12 | Say Y here if your system has a dual role high speed USB |
diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c index 7c71769d71ff..41613a2b35e8 100644 --- a/drivers/usb/musb/da8xx.c +++ b/drivers/usb/musb/da8xx.c | |||
| @@ -327,7 +327,7 @@ static irqreturn_t da8xx_musb_interrupt(int irq, void *hci) | |||
| 327 | u8 devctl = musb_readb(mregs, MUSB_DEVCTL); | 327 | u8 devctl = musb_readb(mregs, MUSB_DEVCTL); |
| 328 | int err; | 328 | int err; |
| 329 | 329 | ||
| 330 | err = musb->int_usb & USB_INTR_VBUSERROR; | 330 | err = musb->int_usb & MUSB_INTR_VBUSERROR; |
| 331 | if (err) { | 331 | if (err) { |
| 332 | /* | 332 | /* |
| 333 | * The Mentor core doesn't debounce VBUS as needed | 333 | * The Mentor core doesn't debounce VBUS as needed |
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 60b41cc28da4..daec6e0f7e38 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
| @@ -1624,8 +1624,6 @@ EXPORT_SYMBOL_GPL(musb_dma_completion); | |||
| 1624 | 1624 | ||
| 1625 | /*-------------------------------------------------------------------------*/ | 1625 | /*-------------------------------------------------------------------------*/ |
| 1626 | 1626 | ||
| 1627 | #ifdef CONFIG_SYSFS | ||
| 1628 | |||
| 1629 | static ssize_t | 1627 | static ssize_t |
| 1630 | musb_mode_show(struct device *dev, struct device_attribute *attr, char *buf) | 1628 | musb_mode_show(struct device *dev, struct device_attribute *attr, char *buf) |
| 1631 | { | 1629 | { |
| @@ -1742,8 +1740,6 @@ static const struct attribute_group musb_attr_group = { | |||
| 1742 | .attrs = musb_attributes, | 1740 | .attrs = musb_attributes, |
| 1743 | }; | 1741 | }; |
| 1744 | 1742 | ||
| 1745 | #endif /* sysfs */ | ||
| 1746 | |||
| 1747 | /* Only used to provide driver mode change events */ | 1743 | /* Only used to provide driver mode change events */ |
| 1748 | static void musb_irq_work(struct work_struct *data) | 1744 | static void musb_irq_work(struct work_struct *data) |
| 1749 | { | 1745 | { |
| @@ -1968,11 +1964,9 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) | |||
| 1968 | if (status < 0) | 1964 | if (status < 0) |
| 1969 | goto fail4; | 1965 | goto fail4; |
| 1970 | 1966 | ||
| 1971 | #ifdef CONFIG_SYSFS | ||
| 1972 | status = sysfs_create_group(&musb->controller->kobj, &musb_attr_group); | 1967 | status = sysfs_create_group(&musb->controller->kobj, &musb_attr_group); |
| 1973 | if (status) | 1968 | if (status) |
| 1974 | goto fail5; | 1969 | goto fail5; |
| 1975 | #endif | ||
| 1976 | 1970 | ||
| 1977 | pm_runtime_put(musb->controller); | 1971 | pm_runtime_put(musb->controller); |
| 1978 | 1972 | ||
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index be18537c5f14..83eddedcd9be 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
| @@ -141,7 +141,9 @@ static inline void map_dma_buffer(struct musb_request *request, | |||
| 141 | static inline void unmap_dma_buffer(struct musb_request *request, | 141 | static inline void unmap_dma_buffer(struct musb_request *request, |
| 142 | struct musb *musb) | 142 | struct musb *musb) |
| 143 | { | 143 | { |
| 144 | if (!is_buffer_mapped(request)) | 144 | struct musb_ep *musb_ep = request->ep; |
| 145 | |||
| 146 | if (!is_buffer_mapped(request) || !musb_ep->dma) | ||
| 145 | return; | 147 | return; |
| 146 | 148 | ||
| 147 | if (request->request.dma == DMA_ADDR_INVALID) { | 149 | if (request->request.dma == DMA_ADDR_INVALID) { |
| @@ -195,7 +197,10 @@ __acquires(ep->musb->lock) | |||
| 195 | 197 | ||
| 196 | ep->busy = 1; | 198 | ep->busy = 1; |
| 197 | spin_unlock(&musb->lock); | 199 | spin_unlock(&musb->lock); |
| 198 | unmap_dma_buffer(req, musb); | 200 | |
| 201 | if (!dma_mapping_error(&musb->g.dev, request->dma)) | ||
| 202 | unmap_dma_buffer(req, musb); | ||
| 203 | |||
| 199 | if (request->status == 0) | 204 | if (request->status == 0) |
| 200 | dev_dbg(musb->controller, "%s done request %p, %d/%d\n", | 205 | dev_dbg(musb->controller, "%s done request %p, %d/%d\n", |
| 201 | ep->end_point.name, request, | 206 | ep->end_point.name, request, |
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index 1762354fe793..1a42a458f2c4 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c | |||
| @@ -51,7 +51,7 @@ struct omap2430_glue { | |||
| 51 | }; | 51 | }; |
| 52 | #define glue_to_musb(g) platform_get_drvdata(g->musb) | 52 | #define glue_to_musb(g) platform_get_drvdata(g->musb) |
| 53 | 53 | ||
| 54 | struct omap2430_glue *_glue; | 54 | static struct omap2430_glue *_glue; |
| 55 | 55 | ||
| 56 | static struct timer_list musb_idle_timer; | 56 | static struct timer_list musb_idle_timer; |
| 57 | 57 | ||
| @@ -237,9 +237,13 @@ void omap_musb_mailbox(enum omap_musb_vbus_id_status status) | |||
| 237 | { | 237 | { |
| 238 | struct omap2430_glue *glue = _glue; | 238 | struct omap2430_glue *glue = _glue; |
| 239 | 239 | ||
| 240 | if (glue && glue_to_musb(glue)) { | 240 | if (!glue) { |
| 241 | glue->status = status; | 241 | pr_err("%s: musb core is not yet initialized\n", __func__); |
| 242 | } else { | 242 | return; |
| 243 | } | ||
| 244 | glue->status = status; | ||
| 245 | |||
| 246 | if (!glue_to_musb(glue)) { | ||
| 243 | pr_err("%s: musb core is not yet ready\n", __func__); | 247 | pr_err("%s: musb core is not yet ready\n", __func__); |
| 244 | return; | 248 | return; |
| 245 | } | 249 | } |
diff --git a/drivers/usb/otg/otg.c b/drivers/usb/otg/otg.c index e1814397ca3a..2bd03d261a50 100644 --- a/drivers/usb/otg/otg.c +++ b/drivers/usb/otg/otg.c | |||
| @@ -130,7 +130,7 @@ struct usb_phy *usb_get_phy(enum usb_phy_type type) | |||
| 130 | spin_lock_irqsave(&phy_lock, flags); | 130 | spin_lock_irqsave(&phy_lock, flags); |
| 131 | 131 | ||
| 132 | phy = __usb_find_phy(&phy_list, type); | 132 | phy = __usb_find_phy(&phy_list, type); |
| 133 | if (IS_ERR(phy)) { | 133 | if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) { |
| 134 | pr_err("unable to find transceiver of type %s\n", | 134 | pr_err("unable to find transceiver of type %s\n", |
| 135 | usb_phy_type_string(type)); | 135 | usb_phy_type_string(type)); |
| 136 | goto err0; | 136 | goto err0; |
| @@ -228,7 +228,7 @@ struct usb_phy *usb_get_phy_dev(struct device *dev, u8 index) | |||
| 228 | spin_lock_irqsave(&phy_lock, flags); | 228 | spin_lock_irqsave(&phy_lock, flags); |
| 229 | 229 | ||
| 230 | phy = __usb_find_phy_dev(dev, &phy_bind_list, index); | 230 | phy = __usb_find_phy_dev(dev, &phy_bind_list, index); |
| 231 | if (IS_ERR(phy)) { | 231 | if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) { |
| 232 | pr_err("unable to find transceiver\n"); | 232 | pr_err("unable to find transceiver\n"); |
| 233 | goto err0; | 233 | goto err0; |
| 234 | } | 234 | } |
| @@ -301,8 +301,12 @@ EXPORT_SYMBOL(devm_usb_put_phy); | |||
| 301 | */ | 301 | */ |
| 302 | void usb_put_phy(struct usb_phy *x) | 302 | void usb_put_phy(struct usb_phy *x) |
| 303 | { | 303 | { |
| 304 | if (x) | 304 | if (x) { |
| 305 | struct module *owner = x->dev->driver->owner; | ||
| 306 | |||
| 305 | put_device(x->dev); | 307 | put_device(x->dev); |
| 308 | module_put(owner); | ||
| 309 | } | ||
| 306 | } | 310 | } |
| 307 | EXPORT_SYMBOL(usb_put_phy); | 311 | EXPORT_SYMBOL(usb_put_phy); |
| 308 | 312 | ||
diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig index 65217a590068..90549382eba5 100644 --- a/drivers/usb/phy/Kconfig +++ b/drivers/usb/phy/Kconfig | |||
| @@ -38,6 +38,7 @@ config USB_ISP1301 | |||
| 38 | tristate "NXP ISP1301 USB transceiver support" | 38 | tristate "NXP ISP1301 USB transceiver support" |
| 39 | depends on USB || USB_GADGET | 39 | depends on USB || USB_GADGET |
| 40 | depends on I2C | 40 | depends on I2C |
| 41 | select USB_OTG_UTILS | ||
| 41 | help | 42 | help |
| 42 | Say Y here to add support for the NXP ISP1301 USB transceiver driver. | 43 | Say Y here to add support for the NXP ISP1301 USB transceiver driver. |
| 43 | This chip is typically used as USB transceiver for USB host, gadget | 44 | This chip is typically used as USB transceiver for USB host, gadget |
diff --git a/drivers/usb/phy/omap-control-usb.c b/drivers/usb/phy/omap-control-usb.c index 5323b71c3521..1419ceda9759 100644 --- a/drivers/usb/phy/omap-control-usb.c +++ b/drivers/usb/phy/omap-control-usb.c | |||
| @@ -219,32 +219,26 @@ static int omap_control_usb_probe(struct platform_device *pdev) | |||
| 219 | 219 | ||
| 220 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, | 220 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, |
| 221 | "control_dev_conf"); | 221 | "control_dev_conf"); |
| 222 | control_usb->dev_conf = devm_request_and_ioremap(&pdev->dev, res); | 222 | control_usb->dev_conf = devm_ioremap_resource(&pdev->dev, res); |
| 223 | if (!control_usb->dev_conf) { | 223 | if (IS_ERR(control_usb->dev_conf)) |
| 224 | dev_err(&pdev->dev, "Failed to obtain io memory\n"); | 224 | return PTR_ERR(control_usb->dev_conf); |
| 225 | return -EADDRNOTAVAIL; | ||
| 226 | } | ||
| 227 | 225 | ||
| 228 | if (control_usb->type == OMAP_CTRL_DEV_TYPE1) { | 226 | if (control_usb->type == OMAP_CTRL_DEV_TYPE1) { |
| 229 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, | 227 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, |
| 230 | "otghs_control"); | 228 | "otghs_control"); |
| 231 | control_usb->otghs_control = devm_request_and_ioremap( | 229 | control_usb->otghs_control = devm_ioremap_resource( |
| 232 | &pdev->dev, res); | 230 | &pdev->dev, res); |
| 233 | if (!control_usb->otghs_control) { | 231 | if (IS_ERR(control_usb->otghs_control)) |
| 234 | dev_err(&pdev->dev, "Failed to obtain io memory\n"); | 232 | return PTR_ERR(control_usb->otghs_control); |
| 235 | return -EADDRNOTAVAIL; | ||
| 236 | } | ||
| 237 | } | 233 | } |
| 238 | 234 | ||
| 239 | if (control_usb->type == OMAP_CTRL_DEV_TYPE2) { | 235 | if (control_usb->type == OMAP_CTRL_DEV_TYPE2) { |
| 240 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, | 236 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, |
| 241 | "phy_power_usb"); | 237 | "phy_power_usb"); |
| 242 | control_usb->phy_power = devm_request_and_ioremap( | 238 | control_usb->phy_power = devm_ioremap_resource( |
| 243 | &pdev->dev, res); | 239 | &pdev->dev, res); |
| 244 | if (!control_usb->phy_power) { | 240 | if (IS_ERR(control_usb->phy_power)) |
| 245 | dev_dbg(&pdev->dev, "Failed to obtain io memory\n"); | 241 | return PTR_ERR(control_usb->phy_power); |
| 246 | return -EADDRNOTAVAIL; | ||
| 247 | } | ||
| 248 | 242 | ||
| 249 | control_usb->sys_clk = devm_clk_get(control_usb->dev, | 243 | control_usb->sys_clk = devm_clk_get(control_usb->dev, |
| 250 | "sys_clkin"); | 244 | "sys_clkin"); |
diff --git a/drivers/usb/phy/omap-usb3.c b/drivers/usb/phy/omap-usb3.c index fadc0c2b65bb..a6e60b1e102e 100644 --- a/drivers/usb/phy/omap-usb3.c +++ b/drivers/usb/phy/omap-usb3.c | |||
| @@ -212,11 +212,9 @@ static int omap_usb3_probe(struct platform_device *pdev) | |||
| 212 | } | 212 | } |
| 213 | 213 | ||
| 214 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pll_ctrl"); | 214 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pll_ctrl"); |
| 215 | phy->pll_ctrl_base = devm_request_and_ioremap(&pdev->dev, res); | 215 | phy->pll_ctrl_base = devm_ioremap_resource(&pdev->dev, res); |
| 216 | if (!phy->pll_ctrl_base) { | 216 | if (IS_ERR(phy->pll_ctrl_base)) |
| 217 | dev_err(&pdev->dev, "ioremap of pll_ctrl failed\n"); | 217 | return PTR_ERR(phy->pll_ctrl_base); |
| 218 | return -ENOMEM; | ||
| 219 | } | ||
| 220 | 218 | ||
| 221 | phy->dev = &pdev->dev; | 219 | phy->dev = &pdev->dev; |
| 222 | 220 | ||
diff --git a/drivers/usb/phy/samsung-usbphy.c b/drivers/usb/phy/samsung-usbphy.c index 6ea553733832..967101ec15fd 100644 --- a/drivers/usb/phy/samsung-usbphy.c +++ b/drivers/usb/phy/samsung-usbphy.c | |||
| @@ -787,11 +787,9 @@ static int samsung_usbphy_probe(struct platform_device *pdev) | |||
| 787 | return -ENODEV; | 787 | return -ENODEV; |
| 788 | } | 788 | } |
| 789 | 789 | ||
| 790 | phy_base = devm_request_and_ioremap(dev, phy_mem); | 790 | phy_base = devm_ioremap_resource(dev, phy_mem); |
| 791 | if (!phy_base) { | 791 | if (IS_ERR(phy_base)) |
| 792 | dev_err(dev, "%s: register mapping failed\n", __func__); | 792 | return PTR_ERR(phy_base); |
| 793 | return -ENXIO; | ||
| 794 | } | ||
| 795 | 793 | ||
| 796 | sphy = devm_kzalloc(dev, sizeof(*sphy), GFP_KERNEL); | 794 | sphy = devm_kzalloc(dev, sizeof(*sphy), GFP_KERNEL); |
| 797 | if (!sphy) | 795 | if (!sphy) |
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index cbd904b8fba5..4775f8209e55 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c | |||
| @@ -62,7 +62,6 @@ static int is_irda(struct usb_serial *serial) | |||
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | struct ark3116_private { | 64 | struct ark3116_private { |
| 65 | wait_queue_head_t delta_msr_wait; | ||
| 66 | struct async_icount icount; | 65 | struct async_icount icount; |
| 67 | int irda; /* 1 for irda device */ | 66 | int irda; /* 1 for irda device */ |
| 68 | 67 | ||
| @@ -146,7 +145,6 @@ static int ark3116_port_probe(struct usb_serial_port *port) | |||
| 146 | if (!priv) | 145 | if (!priv) |
| 147 | return -ENOMEM; | 146 | return -ENOMEM; |
| 148 | 147 | ||
| 149 | init_waitqueue_head(&priv->delta_msr_wait); | ||
| 150 | mutex_init(&priv->hw_lock); | 148 | mutex_init(&priv->hw_lock); |
| 151 | spin_lock_init(&priv->status_lock); | 149 | spin_lock_init(&priv->status_lock); |
| 152 | 150 | ||
| @@ -456,10 +454,14 @@ static int ark3116_ioctl(struct tty_struct *tty, | |||
| 456 | case TIOCMIWAIT: | 454 | case TIOCMIWAIT: |
| 457 | for (;;) { | 455 | for (;;) { |
| 458 | struct async_icount prev = priv->icount; | 456 | struct async_icount prev = priv->icount; |
| 459 | interruptible_sleep_on(&priv->delta_msr_wait); | 457 | interruptible_sleep_on(&port->delta_msr_wait); |
| 460 | /* see if a signal did it */ | 458 | /* see if a signal did it */ |
| 461 | if (signal_pending(current)) | 459 | if (signal_pending(current)) |
| 462 | return -ERESTARTSYS; | 460 | return -ERESTARTSYS; |
| 461 | |||
| 462 | if (port->serial->disconnected) | ||
| 463 | return -EIO; | ||
| 464 | |||
| 463 | if ((prev.rng == priv->icount.rng) && | 465 | if ((prev.rng == priv->icount.rng) && |
| 464 | (prev.dsr == priv->icount.dsr) && | 466 | (prev.dsr == priv->icount.dsr) && |
| 465 | (prev.dcd == priv->icount.dcd) && | 467 | (prev.dcd == priv->icount.dcd) && |
| @@ -580,7 +582,7 @@ static void ark3116_update_msr(struct usb_serial_port *port, __u8 msr) | |||
| 580 | priv->icount.dcd++; | 582 | priv->icount.dcd++; |
| 581 | if (msr & UART_MSR_TERI) | 583 | if (msr & UART_MSR_TERI) |
| 582 | priv->icount.rng++; | 584 | priv->icount.rng++; |
| 583 | wake_up_interruptible(&priv->delta_msr_wait); | 585 | wake_up_interruptible(&port->delta_msr_wait); |
| 584 | } | 586 | } |
| 585 | } | 587 | } |
| 586 | 588 | ||
diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c index d255f66e708e..07d4650a32ab 100644 --- a/drivers/usb/serial/ch341.c +++ b/drivers/usb/serial/ch341.c | |||
| @@ -80,7 +80,6 @@ MODULE_DEVICE_TABLE(usb, id_table); | |||
| 80 | 80 | ||
| 81 | struct ch341_private { | 81 | struct ch341_private { |
| 82 | spinlock_t lock; /* access lock */ | 82 | spinlock_t lock; /* access lock */ |
| 83 | wait_queue_head_t delta_msr_wait; /* wait queue for modem status */ | ||
| 84 | unsigned baud_rate; /* set baud rate */ | 83 | unsigned baud_rate; /* set baud rate */ |
| 85 | u8 line_control; /* set line control value RTS/DTR */ | 84 | u8 line_control; /* set line control value RTS/DTR */ |
| 86 | u8 line_status; /* active status of modem control inputs */ | 85 | u8 line_status; /* active status of modem control inputs */ |
| @@ -252,7 +251,6 @@ static int ch341_port_probe(struct usb_serial_port *port) | |||
| 252 | return -ENOMEM; | 251 | return -ENOMEM; |
| 253 | 252 | ||
| 254 | spin_lock_init(&priv->lock); | 253 | spin_lock_init(&priv->lock); |
| 255 | init_waitqueue_head(&priv->delta_msr_wait); | ||
| 256 | priv->baud_rate = DEFAULT_BAUD_RATE; | 254 | priv->baud_rate = DEFAULT_BAUD_RATE; |
| 257 | priv->line_control = CH341_BIT_RTS | CH341_BIT_DTR; | 255 | priv->line_control = CH341_BIT_RTS | CH341_BIT_DTR; |
| 258 | 256 | ||
| @@ -298,7 +296,7 @@ static void ch341_dtr_rts(struct usb_serial_port *port, int on) | |||
| 298 | priv->line_control &= ~(CH341_BIT_RTS | CH341_BIT_DTR); | 296 | priv->line_control &= ~(CH341_BIT_RTS | CH341_BIT_DTR); |
| 299 | spin_unlock_irqrestore(&priv->lock, flags); | 297 | spin_unlock_irqrestore(&priv->lock, flags); |
| 300 | ch341_set_handshake(port->serial->dev, priv->line_control); | 298 | ch341_set_handshake(port->serial->dev, priv->line_control); |
| 301 | wake_up_interruptible(&priv->delta_msr_wait); | 299 | wake_up_interruptible(&port->delta_msr_wait); |
| 302 | } | 300 | } |
| 303 | 301 | ||
| 304 | static void ch341_close(struct usb_serial_port *port) | 302 | static void ch341_close(struct usb_serial_port *port) |
| @@ -491,7 +489,7 @@ static void ch341_read_int_callback(struct urb *urb) | |||
| 491 | tty_kref_put(tty); | 489 | tty_kref_put(tty); |
| 492 | } | 490 | } |
| 493 | 491 | ||
| 494 | wake_up_interruptible(&priv->delta_msr_wait); | 492 | wake_up_interruptible(&port->delta_msr_wait); |
| 495 | } | 493 | } |
| 496 | 494 | ||
| 497 | exit: | 495 | exit: |
| @@ -517,11 +515,14 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) | |||
| 517 | spin_unlock_irqrestore(&priv->lock, flags); | 515 | spin_unlock_irqrestore(&priv->lock, flags); |
| 518 | 516 | ||
| 519 | while (!multi_change) { | 517 | while (!multi_change) { |
| 520 | interruptible_sleep_on(&priv->delta_msr_wait); | 518 | interruptible_sleep_on(&port->delta_msr_wait); |
| 521 | /* see if a signal did it */ | 519 | /* see if a signal did it */ |
| 522 | if (signal_pending(current)) | 520 | if (signal_pending(current)) |
| 523 | return -ERESTARTSYS; | 521 | return -ERESTARTSYS; |
| 524 | 522 | ||
| 523 | if (port->serial->disconnected) | ||
| 524 | return -EIO; | ||
| 525 | |||
| 525 | spin_lock_irqsave(&priv->lock, flags); | 526 | spin_lock_irqsave(&priv->lock, flags); |
| 526 | status = priv->line_status; | 527 | status = priv->line_status; |
| 527 | multi_change = priv->multi_status_change; | 528 | multi_change = priv->multi_status_change; |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index edc0f0dcad83..4747d1c328ff 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
| @@ -85,6 +85,7 @@ static const struct usb_device_id id_table[] = { | |||
| 85 | { USB_DEVICE(0x10C4, 0x813F) }, /* Tams Master Easy Control */ | 85 | { USB_DEVICE(0x10C4, 0x813F) }, /* Tams Master Easy Control */ |
| 86 | { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */ | 86 | { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */ |
| 87 | { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */ | 87 | { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */ |
| 88 | { USB_DEVICE(0x2405, 0x0003) }, /* West Mountain Radio RIGblaster Advantage */ | ||
| 88 | { USB_DEVICE(0x10C4, 0x8156) }, /* B&G H3000 link cable */ | 89 | { USB_DEVICE(0x10C4, 0x8156) }, /* B&G H3000 link cable */ |
| 89 | { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */ | 90 | { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */ |
| 90 | { USB_DEVICE(0x10C4, 0x815F) }, /* Timewave HamLinkUSB */ | 91 | { USB_DEVICE(0x10C4, 0x815F) }, /* Timewave HamLinkUSB */ |
| @@ -150,6 +151,25 @@ static const struct usb_device_id id_table[] = { | |||
| 150 | { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ | 151 | { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ |
| 151 | { USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */ | 152 | { USB_DEVICE(0x1E29, 0x0102) }, /* Festo CPX-USB */ |
| 152 | { USB_DEVICE(0x1E29, 0x0501) }, /* Festo CMSP */ | 153 | { USB_DEVICE(0x1E29, 0x0501) }, /* Festo CMSP */ |
| 154 | { USB_DEVICE(0x1FB9, 0x0100) }, /* Lake Shore Model 121 Current Source */ | ||
| 155 | { USB_DEVICE(0x1FB9, 0x0200) }, /* Lake Shore Model 218A Temperature Monitor */ | ||
| 156 | { USB_DEVICE(0x1FB9, 0x0201) }, /* Lake Shore Model 219 Temperature Monitor */ | ||
| 157 | { USB_DEVICE(0x1FB9, 0x0202) }, /* Lake Shore Model 233 Temperature Transmitter */ | ||
| 158 | { USB_DEVICE(0x1FB9, 0x0203) }, /* Lake Shore Model 235 Temperature Transmitter */ | ||
| 159 | { USB_DEVICE(0x1FB9, 0x0300) }, /* Lake Shore Model 335 Temperature Controller */ | ||
| 160 | { USB_DEVICE(0x1FB9, 0x0301) }, /* Lake Shore Model 336 Temperature Controller */ | ||
| 161 | { USB_DEVICE(0x1FB9, 0x0302) }, /* Lake Shore Model 350 Temperature Controller */ | ||
| 162 | { USB_DEVICE(0x1FB9, 0x0303) }, /* Lake Shore Model 371 AC Bridge */ | ||
| 163 | { USB_DEVICE(0x1FB9, 0x0400) }, /* Lake Shore Model 411 Handheld Gaussmeter */ | ||
| 164 | { USB_DEVICE(0x1FB9, 0x0401) }, /* Lake Shore Model 425 Gaussmeter */ | ||
| 165 | { USB_DEVICE(0x1FB9, 0x0402) }, /* Lake Shore Model 455A Gaussmeter */ | ||
| 166 | { USB_DEVICE(0x1FB9, 0x0403) }, /* Lake Shore Model 475A Gaussmeter */ | ||
| 167 | { USB_DEVICE(0x1FB9, 0x0404) }, /* Lake Shore Model 465 Three Axis Gaussmeter */ | ||
| 168 | { USB_DEVICE(0x1FB9, 0x0600) }, /* Lake Shore Model 625A Superconducting MPS */ | ||
| 169 | { USB_DEVICE(0x1FB9, 0x0601) }, /* Lake Shore Model 642A Magnet Power Supply */ | ||
| 170 | { USB_DEVICE(0x1FB9, 0x0602) }, /* Lake Shore Model 648 Magnet Power Supply */ | ||
| 171 | { USB_DEVICE(0x1FB9, 0x0700) }, /* Lake Shore Model 737 VSM Controller */ | ||
| 172 | { USB_DEVICE(0x1FB9, 0x0701) }, /* Lake Shore Model 776 Hall Matrix */ | ||
| 153 | { USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */ | 173 | { USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */ |
| 154 | { USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */ | 174 | { USB_DEVICE(0x3195, 0xF280) }, /* Link Instruments MSO-28 */ |
| 155 | { USB_DEVICE(0x3195, 0xF281) }, /* Link Instruments MSO-28 */ | 175 | { USB_DEVICE(0x3195, 0xF281) }, /* Link Instruments MSO-28 */ |
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index 8efa19d0e9fb..ba7352e4187e 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
| @@ -111,7 +111,6 @@ struct cypress_private { | |||
| 111 | int baud_rate; /* stores current baud rate in | 111 | int baud_rate; /* stores current baud rate in |
| 112 | integer form */ | 112 | integer form */ |
| 113 | int isthrottled; /* if throttled, discard reads */ | 113 | int isthrottled; /* if throttled, discard reads */ |
| 114 | wait_queue_head_t delta_msr_wait; /* used for TIOCMIWAIT */ | ||
| 115 | char prev_status, diff_status; /* used for TIOCMIWAIT */ | 114 | char prev_status, diff_status; /* used for TIOCMIWAIT */ |
| 116 | /* we pass a pointer to this as the argument sent to | 115 | /* we pass a pointer to this as the argument sent to |
| 117 | cypress_set_termios old_termios */ | 116 | cypress_set_termios old_termios */ |
| @@ -449,7 +448,6 @@ static int cypress_generic_port_probe(struct usb_serial_port *port) | |||
| 449 | kfree(priv); | 448 | kfree(priv); |
| 450 | return -ENOMEM; | 449 | return -ENOMEM; |
| 451 | } | 450 | } |
| 452 | init_waitqueue_head(&priv->delta_msr_wait); | ||
| 453 | 451 | ||
| 454 | usb_reset_configuration(serial->dev); | 452 | usb_reset_configuration(serial->dev); |
| 455 | 453 | ||
| @@ -868,12 +866,16 @@ static int cypress_ioctl(struct tty_struct *tty, | |||
| 868 | switch (cmd) { | 866 | switch (cmd) { |
| 869 | /* This code comes from drivers/char/serial.c and ftdi_sio.c */ | 867 | /* This code comes from drivers/char/serial.c and ftdi_sio.c */ |
| 870 | case TIOCMIWAIT: | 868 | case TIOCMIWAIT: |
| 871 | while (priv != NULL) { | 869 | for (;;) { |
| 872 | interruptible_sleep_on(&priv->delta_msr_wait); | 870 | interruptible_sleep_on(&port->delta_msr_wait); |
| 873 | /* see if a signal did it */ | 871 | /* see if a signal did it */ |
| 874 | if (signal_pending(current)) | 872 | if (signal_pending(current)) |
| 875 | return -ERESTARTSYS; | 873 | return -ERESTARTSYS; |
| 876 | else { | 874 | |
| 875 | if (port->serial->disconnected) | ||
| 876 | return -EIO; | ||
| 877 | |||
| 878 | { | ||
| 877 | char diff = priv->diff_status; | 879 | char diff = priv->diff_status; |
| 878 | if (diff == 0) | 880 | if (diff == 0) |
| 879 | return -EIO; /* no change => error */ | 881 | return -EIO; /* no change => error */ |
| @@ -1187,7 +1189,7 @@ static void cypress_read_int_callback(struct urb *urb) | |||
| 1187 | if (priv->current_status != priv->prev_status) { | 1189 | if (priv->current_status != priv->prev_status) { |
| 1188 | priv->diff_status |= priv->current_status ^ | 1190 | priv->diff_status |= priv->current_status ^ |
| 1189 | priv->prev_status; | 1191 | priv->prev_status; |
| 1190 | wake_up_interruptible(&priv->delta_msr_wait); | 1192 | wake_up_interruptible(&port->delta_msr_wait); |
| 1191 | priv->prev_status = priv->current_status; | 1193 | priv->prev_status = priv->current_status; |
| 1192 | } | 1194 | } |
| 1193 | spin_unlock_irqrestore(&priv->lock, flags); | 1195 | spin_unlock_irqrestore(&priv->lock, flags); |
diff --git a/drivers/usb/serial/f81232.c b/drivers/usb/serial/f81232.c index b1b2dc64b50b..a172ad5c5ce8 100644 --- a/drivers/usb/serial/f81232.c +++ b/drivers/usb/serial/f81232.c | |||
| @@ -47,7 +47,6 @@ MODULE_DEVICE_TABLE(usb, id_table); | |||
| 47 | 47 | ||
| 48 | struct f81232_private { | 48 | struct f81232_private { |
| 49 | spinlock_t lock; | 49 | spinlock_t lock; |
| 50 | wait_queue_head_t delta_msr_wait; | ||
| 51 | u8 line_control; | 50 | u8 line_control; |
| 52 | u8 line_status; | 51 | u8 line_status; |
| 53 | }; | 52 | }; |
| @@ -111,7 +110,7 @@ static void f81232_process_read_urb(struct urb *urb) | |||
| 111 | line_status = priv->line_status; | 110 | line_status = priv->line_status; |
| 112 | priv->line_status &= ~UART_STATE_TRANSIENT_MASK; | 111 | priv->line_status &= ~UART_STATE_TRANSIENT_MASK; |
| 113 | spin_unlock_irqrestore(&priv->lock, flags); | 112 | spin_unlock_irqrestore(&priv->lock, flags); |
| 114 | wake_up_interruptible(&priv->delta_msr_wait); | 113 | wake_up_interruptible(&port->delta_msr_wait); |
| 115 | 114 | ||
| 116 | if (!urb->actual_length) | 115 | if (!urb->actual_length) |
| 117 | return; | 116 | return; |
| @@ -256,11 +255,14 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) | |||
| 256 | spin_unlock_irqrestore(&priv->lock, flags); | 255 | spin_unlock_irqrestore(&priv->lock, flags); |
| 257 | 256 | ||
| 258 | while (1) { | 257 | while (1) { |
| 259 | interruptible_sleep_on(&priv->delta_msr_wait); | 258 | interruptible_sleep_on(&port->delta_msr_wait); |
| 260 | /* see if a signal did it */ | 259 | /* see if a signal did it */ |
| 261 | if (signal_pending(current)) | 260 | if (signal_pending(current)) |
| 262 | return -ERESTARTSYS; | 261 | return -ERESTARTSYS; |
| 263 | 262 | ||
| 263 | if (port->serial->disconnected) | ||
| 264 | return -EIO; | ||
| 265 | |||
| 264 | spin_lock_irqsave(&priv->lock, flags); | 266 | spin_lock_irqsave(&priv->lock, flags); |
| 265 | status = priv->line_status; | 267 | status = priv->line_status; |
| 266 | spin_unlock_irqrestore(&priv->lock, flags); | 268 | spin_unlock_irqrestore(&priv->lock, flags); |
| @@ -322,7 +324,6 @@ static int f81232_port_probe(struct usb_serial_port *port) | |||
| 322 | return -ENOMEM; | 324 | return -ENOMEM; |
| 323 | 325 | ||
| 324 | spin_lock_init(&priv->lock); | 326 | spin_lock_init(&priv->lock); |
| 325 | init_waitqueue_head(&priv->delta_msr_wait); | ||
| 326 | 327 | ||
| 327 | usb_set_serial_port_data(port, priv); | 328 | usb_set_serial_port_data(port, priv); |
| 328 | 329 | ||
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index edd162df49ca..9886180e45f1 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -69,9 +69,7 @@ struct ftdi_private { | |||
| 69 | int flags; /* some ASYNC_xxxx flags are supported */ | 69 | int flags; /* some ASYNC_xxxx flags are supported */ |
| 70 | unsigned long last_dtr_rts; /* saved modem control outputs */ | 70 | unsigned long last_dtr_rts; /* saved modem control outputs */ |
| 71 | struct async_icount icount; | 71 | struct async_icount icount; |
| 72 | wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */ | ||
| 73 | char prev_status; /* Used for TIOCMIWAIT */ | 72 | char prev_status; /* Used for TIOCMIWAIT */ |
| 74 | bool dev_gone; /* Used to abort TIOCMIWAIT */ | ||
| 75 | char transmit_empty; /* If transmitter is empty or not */ | 73 | char transmit_empty; /* If transmitter is empty or not */ |
| 76 | __u16 interface; /* FT2232C, FT2232H or FT4232H port interface | 74 | __u16 interface; /* FT2232C, FT2232H or FT4232H port interface |
| 77 | (0 for FT232/245) */ | 75 | (0 for FT232/245) */ |
| @@ -642,6 +640,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 642 | { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) }, | 640 | { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) }, |
| 643 | { USB_DEVICE(ACTON_VID, ACTON_SPECTRAPRO_PID) }, | 641 | { USB_DEVICE(ACTON_VID, ACTON_SPECTRAPRO_PID) }, |
| 644 | { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) }, | 642 | { USB_DEVICE(CONTEC_VID, CONTEC_COM1USBH_PID) }, |
| 643 | { USB_DEVICE(MITSUBISHI_VID, MITSUBISHI_FXUSB_PID) }, | ||
| 645 | { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) }, | 644 | { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) }, |
| 646 | { USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) }, | 645 | { USB_DEVICE(BANDB_VID, BANDB_USTL4_PID) }, |
| 647 | { USB_DEVICE(BANDB_VID, BANDB_USO9ML2_PID) }, | 646 | { USB_DEVICE(BANDB_VID, BANDB_USO9ML2_PID) }, |
| @@ -1691,10 +1690,8 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port) | |||
| 1691 | 1690 | ||
| 1692 | kref_init(&priv->kref); | 1691 | kref_init(&priv->kref); |
| 1693 | mutex_init(&priv->cfg_lock); | 1692 | mutex_init(&priv->cfg_lock); |
| 1694 | init_waitqueue_head(&priv->delta_msr_wait); | ||
| 1695 | 1693 | ||
| 1696 | priv->flags = ASYNC_LOW_LATENCY; | 1694 | priv->flags = ASYNC_LOW_LATENCY; |
| 1697 | priv->dev_gone = false; | ||
| 1698 | 1695 | ||
| 1699 | if (quirk && quirk->port_probe) | 1696 | if (quirk && quirk->port_probe) |
| 1700 | quirk->port_probe(priv); | 1697 | quirk->port_probe(priv); |
| @@ -1840,8 +1837,7 @@ static int ftdi_sio_port_remove(struct usb_serial_port *port) | |||
| 1840 | { | 1837 | { |
| 1841 | struct ftdi_private *priv = usb_get_serial_port_data(port); | 1838 | struct ftdi_private *priv = usb_get_serial_port_data(port); |
| 1842 | 1839 | ||
| 1843 | priv->dev_gone = true; | 1840 | wake_up_interruptible(&port->delta_msr_wait); |
| 1844 | wake_up_interruptible_all(&priv->delta_msr_wait); | ||
| 1845 | 1841 | ||
| 1846 | remove_sysfs_attrs(port); | 1842 | remove_sysfs_attrs(port); |
| 1847 | 1843 | ||
| @@ -1989,7 +1985,7 @@ static int ftdi_process_packet(struct usb_serial_port *port, | |||
| 1989 | if (diff_status & FTDI_RS0_RLSD) | 1985 | if (diff_status & FTDI_RS0_RLSD) |
| 1990 | priv->icount.dcd++; | 1986 | priv->icount.dcd++; |
| 1991 | 1987 | ||
| 1992 | wake_up_interruptible_all(&priv->delta_msr_wait); | 1988 | wake_up_interruptible(&port->delta_msr_wait); |
| 1993 | priv->prev_status = status; | 1989 | priv->prev_status = status; |
| 1994 | } | 1990 | } |
| 1995 | 1991 | ||
| @@ -2440,11 +2436,15 @@ static int ftdi_ioctl(struct tty_struct *tty, | |||
| 2440 | */ | 2436 | */ |
| 2441 | case TIOCMIWAIT: | 2437 | case TIOCMIWAIT: |
| 2442 | cprev = priv->icount; | 2438 | cprev = priv->icount; |
| 2443 | while (!priv->dev_gone) { | 2439 | for (;;) { |
| 2444 | interruptible_sleep_on(&priv->delta_msr_wait); | 2440 | interruptible_sleep_on(&port->delta_msr_wait); |
| 2445 | /* see if a signal did it */ | 2441 | /* see if a signal did it */ |
| 2446 | if (signal_pending(current)) | 2442 | if (signal_pending(current)) |
| 2447 | return -ERESTARTSYS; | 2443 | return -ERESTARTSYS; |
| 2444 | |||
| 2445 | if (port->serial->disconnected) | ||
| 2446 | return -EIO; | ||
| 2447 | |||
| 2448 | cnow = priv->icount; | 2448 | cnow = priv->icount; |
| 2449 | if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || | 2449 | if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || |
| 2450 | ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || | 2450 | ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || |
| @@ -2454,8 +2454,6 @@ static int ftdi_ioctl(struct tty_struct *tty, | |||
| 2454 | } | 2454 | } |
| 2455 | cprev = cnow; | 2455 | cprev = cnow; |
| 2456 | } | 2456 | } |
| 2457 | return -EIO; | ||
| 2458 | break; | ||
| 2459 | case TIOCSERGETLSR: | 2457 | case TIOCSERGETLSR: |
| 2460 | return get_lsr_info(port, (struct serial_struct __user *)arg); | 2458 | return get_lsr_info(port, (struct serial_struct __user *)arg); |
| 2461 | break; | 2459 | break; |
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 9d359e189a64..e79861eeed4c 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
| @@ -584,6 +584,13 @@ | |||
| 584 | #define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */ | 584 | #define CONTEC_COM1USBH_PID 0x8311 /* COM-1(USB)H */ |
| 585 | 585 | ||
| 586 | /* | 586 | /* |
| 587 | * Mitsubishi Electric Corp. (http://www.meau.com) | ||
| 588 | * Submitted by Konstantin Holoborodko | ||
| 589 | */ | ||
| 590 | #define MITSUBISHI_VID 0x06D3 | ||
| 591 | #define MITSUBISHI_FXUSB_PID 0x0284 /* USB/RS422 converters: FX-USB-AW/-BD */ | ||
| 592 | |||
| 593 | /* | ||
| 587 | * Definitions for B&B Electronics products. | 594 | * Definitions for B&B Electronics products. |
| 588 | */ | 595 | */ |
| 589 | #define BANDB_VID 0x0856 /* B&B Electronics Vendor ID */ | 596 | #define BANDB_VID 0x0856 /* B&B Electronics Vendor ID */ |
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 1a07b12ef341..81caf5623ee2 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c | |||
| @@ -956,10 +956,7 @@ static void garmin_close(struct usb_serial_port *port) | |||
| 956 | if (!serial) | 956 | if (!serial) |
| 957 | return; | 957 | return; |
| 958 | 958 | ||
| 959 | mutex_lock(&port->serial->disc_mutex); | 959 | garmin_clear(garmin_data_p); |
| 960 | |||
| 961 | if (!port->serial->disconnected) | ||
| 962 | garmin_clear(garmin_data_p); | ||
| 963 | 960 | ||
| 964 | /* shutdown our urbs */ | 961 | /* shutdown our urbs */ |
| 965 | usb_kill_urb(port->read_urb); | 962 | usb_kill_urb(port->read_urb); |
| @@ -968,8 +965,6 @@ static void garmin_close(struct usb_serial_port *port) | |||
| 968 | /* keep reset state so we know that we must start a new session */ | 965 | /* keep reset state so we know that we must start a new session */ |
| 969 | if (garmin_data_p->state != STATE_RESET) | 966 | if (garmin_data_p->state != STATE_RESET) |
| 970 | garmin_data_p->state = STATE_DISCONNECTED; | 967 | garmin_data_p->state = STATE_DISCONNECTED; |
| 971 | |||
| 972 | mutex_unlock(&port->serial->disc_mutex); | ||
| 973 | } | 968 | } |
| 974 | 969 | ||
| 975 | 970 | ||
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index b00e5cbf741f..efd8b978128c 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c | |||
| @@ -110,7 +110,6 @@ struct edgeport_port { | |||
| 110 | wait_queue_head_t wait_chase; /* for handling sleeping while waiting for chase to finish */ | 110 | wait_queue_head_t wait_chase; /* for handling sleeping while waiting for chase to finish */ |
| 111 | wait_queue_head_t wait_open; /* for handling sleeping while waiting for open to finish */ | 111 | wait_queue_head_t wait_open; /* for handling sleeping while waiting for open to finish */ |
| 112 | wait_queue_head_t wait_command; /* for handling sleeping while waiting for command to finish */ | 112 | wait_queue_head_t wait_command; /* for handling sleeping while waiting for command to finish */ |
| 113 | wait_queue_head_t delta_msr_wait; /* for handling sleeping while waiting for msr change to happen */ | ||
| 114 | 113 | ||
| 115 | struct async_icount icount; | 114 | struct async_icount icount; |
| 116 | struct usb_serial_port *port; /* loop back to the owner of this object */ | 115 | struct usb_serial_port *port; /* loop back to the owner of this object */ |
| @@ -884,7 +883,6 @@ static int edge_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
| 884 | /* initialize our wait queues */ | 883 | /* initialize our wait queues */ |
| 885 | init_waitqueue_head(&edge_port->wait_open); | 884 | init_waitqueue_head(&edge_port->wait_open); |
| 886 | init_waitqueue_head(&edge_port->wait_chase); | 885 | init_waitqueue_head(&edge_port->wait_chase); |
| 887 | init_waitqueue_head(&edge_port->delta_msr_wait); | ||
| 888 | init_waitqueue_head(&edge_port->wait_command); | 886 | init_waitqueue_head(&edge_port->wait_command); |
| 889 | 887 | ||
| 890 | /* initialize our icount structure */ | 888 | /* initialize our icount structure */ |
| @@ -1669,13 +1667,17 @@ static int edge_ioctl(struct tty_struct *tty, | |||
| 1669 | dev_dbg(&port->dev, "%s (%d) TIOCMIWAIT\n", __func__, port->number); | 1667 | dev_dbg(&port->dev, "%s (%d) TIOCMIWAIT\n", __func__, port->number); |
| 1670 | cprev = edge_port->icount; | 1668 | cprev = edge_port->icount; |
| 1671 | while (1) { | 1669 | while (1) { |
| 1672 | prepare_to_wait(&edge_port->delta_msr_wait, | 1670 | prepare_to_wait(&port->delta_msr_wait, |
| 1673 | &wait, TASK_INTERRUPTIBLE); | 1671 | &wait, TASK_INTERRUPTIBLE); |
| 1674 | schedule(); | 1672 | schedule(); |
| 1675 | finish_wait(&edge_port->delta_msr_wait, &wait); | 1673 | finish_wait(&port->delta_msr_wait, &wait); |
| 1676 | /* see if a signal did it */ | 1674 | /* see if a signal did it */ |
| 1677 | if (signal_pending(current)) | 1675 | if (signal_pending(current)) |
| 1678 | return -ERESTARTSYS; | 1676 | return -ERESTARTSYS; |
| 1677 | |||
| 1678 | if (port->serial->disconnected) | ||
| 1679 | return -EIO; | ||
| 1680 | |||
| 1679 | cnow = edge_port->icount; | 1681 | cnow = edge_port->icount; |
| 1680 | if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && | 1682 | if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && |
| 1681 | cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) | 1683 | cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) |
| @@ -2051,7 +2053,7 @@ static void handle_new_msr(struct edgeport_port *edge_port, __u8 newMsr) | |||
| 2051 | icount->dcd++; | 2053 | icount->dcd++; |
| 2052 | if (newMsr & EDGEPORT_MSR_DELTA_RI) | 2054 | if (newMsr & EDGEPORT_MSR_DELTA_RI) |
| 2053 | icount->rng++; | 2055 | icount->rng++; |
| 2054 | wake_up_interruptible(&edge_port->delta_msr_wait); | 2056 | wake_up_interruptible(&edge_port->port->delta_msr_wait); |
| 2055 | } | 2057 | } |
| 2056 | 2058 | ||
| 2057 | /* Save the new modem status */ | 2059 | /* Save the new modem status */ |
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index c23776679f70..7777172206de 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c | |||
| @@ -87,9 +87,6 @@ struct edgeport_port { | |||
| 87 | int close_pending; | 87 | int close_pending; |
| 88 | int lsr_event; | 88 | int lsr_event; |
| 89 | struct async_icount icount; | 89 | struct async_icount icount; |
| 90 | wait_queue_head_t delta_msr_wait; /* for handling sleeping while | ||
| 91 | waiting for msr change to | ||
| 92 | happen */ | ||
| 93 | struct edgeport_serial *edge_serial; | 90 | struct edgeport_serial *edge_serial; |
| 94 | struct usb_serial_port *port; | 91 | struct usb_serial_port *port; |
| 95 | __u8 bUartMode; /* Port type, 0: RS232, etc. */ | 92 | __u8 bUartMode; /* Port type, 0: RS232, etc. */ |
| @@ -1459,7 +1456,7 @@ static void handle_new_msr(struct edgeport_port *edge_port, __u8 msr) | |||
| 1459 | icount->dcd++; | 1456 | icount->dcd++; |
| 1460 | if (msr & EDGEPORT_MSR_DELTA_RI) | 1457 | if (msr & EDGEPORT_MSR_DELTA_RI) |
| 1461 | icount->rng++; | 1458 | icount->rng++; |
| 1462 | wake_up_interruptible(&edge_port->delta_msr_wait); | 1459 | wake_up_interruptible(&edge_port->port->delta_msr_wait); |
| 1463 | } | 1460 | } |
| 1464 | 1461 | ||
| 1465 | /* Save the new modem status */ | 1462 | /* Save the new modem status */ |
| @@ -1754,7 +1751,6 @@ static int edge_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
| 1754 | dev = port->serial->dev; | 1751 | dev = port->serial->dev; |
| 1755 | 1752 | ||
| 1756 | memset(&(edge_port->icount), 0x00, sizeof(edge_port->icount)); | 1753 | memset(&(edge_port->icount), 0x00, sizeof(edge_port->icount)); |
| 1757 | init_waitqueue_head(&edge_port->delta_msr_wait); | ||
| 1758 | 1754 | ||
| 1759 | /* turn off loopback */ | 1755 | /* turn off loopback */ |
| 1760 | status = ti_do_config(edge_port, UMPC_SET_CLR_LOOPBACK, 0); | 1756 | status = ti_do_config(edge_port, UMPC_SET_CLR_LOOPBACK, 0); |
| @@ -2434,10 +2430,14 @@ static int edge_ioctl(struct tty_struct *tty, | |||
| 2434 | dev_dbg(&port->dev, "%s - TIOCMIWAIT\n", __func__); | 2430 | dev_dbg(&port->dev, "%s - TIOCMIWAIT\n", __func__); |
| 2435 | cprev = edge_port->icount; | 2431 | cprev = edge_port->icount; |
| 2436 | while (1) { | 2432 | while (1) { |
| 2437 | interruptible_sleep_on(&edge_port->delta_msr_wait); | 2433 | interruptible_sleep_on(&port->delta_msr_wait); |
| 2438 | /* see if a signal did it */ | 2434 | /* see if a signal did it */ |
| 2439 | if (signal_pending(current)) | 2435 | if (signal_pending(current)) |
| 2440 | return -ERESTARTSYS; | 2436 | return -ERESTARTSYS; |
| 2437 | |||
| 2438 | if (port->serial->disconnected) | ||
| 2439 | return -EIO; | ||
| 2440 | |||
| 2441 | cnow = edge_port->icount; | 2441 | cnow = edge_port->icount; |
| 2442 | if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && | 2442 | if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && |
| 2443 | cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) | 2443 | cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) |
| @@ -2649,6 +2649,7 @@ static struct usb_serial_driver edgeport_2port_device = { | |||
| 2649 | .set_termios = edge_set_termios, | 2649 | .set_termios = edge_set_termios, |
| 2650 | .tiocmget = edge_tiocmget, | 2650 | .tiocmget = edge_tiocmget, |
| 2651 | .tiocmset = edge_tiocmset, | 2651 | .tiocmset = edge_tiocmset, |
| 2652 | .get_icount = edge_get_icount, | ||
| 2652 | .write = edge_write, | 2653 | .write = edge_write, |
| 2653 | .write_room = edge_write_room, | 2654 | .write_room = edge_write_room, |
| 2654 | .chars_in_buffer = edge_chars_in_buffer, | 2655 | .chars_in_buffer = edge_chars_in_buffer, |
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index a64d420f687b..06d5a60be2c4 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c | |||
| @@ -114,8 +114,6 @@ struct mct_u232_private { | |||
| 114 | unsigned char last_msr; /* Modem Status Register */ | 114 | unsigned char last_msr; /* Modem Status Register */ |
| 115 | unsigned int rx_flags; /* Throttling flags */ | 115 | unsigned int rx_flags; /* Throttling flags */ |
| 116 | struct async_icount icount; | 116 | struct async_icount icount; |
| 117 | wait_queue_head_t msr_wait; /* for handling sleeping while waiting | ||
| 118 | for msr change to happen */ | ||
| 119 | }; | 117 | }; |
| 120 | 118 | ||
| 121 | #define THROTTLED 0x01 | 119 | #define THROTTLED 0x01 |
| @@ -409,7 +407,6 @@ static int mct_u232_port_probe(struct usb_serial_port *port) | |||
| 409 | return -ENOMEM; | 407 | return -ENOMEM; |
| 410 | 408 | ||
| 411 | spin_lock_init(&priv->lock); | 409 | spin_lock_init(&priv->lock); |
| 412 | init_waitqueue_head(&priv->msr_wait); | ||
| 413 | 410 | ||
| 414 | usb_set_serial_port_data(port, priv); | 411 | usb_set_serial_port_data(port, priv); |
| 415 | 412 | ||
| @@ -601,7 +598,7 @@ static void mct_u232_read_int_callback(struct urb *urb) | |||
| 601 | tty_kref_put(tty); | 598 | tty_kref_put(tty); |
| 602 | } | 599 | } |
| 603 | #endif | 600 | #endif |
| 604 | wake_up_interruptible(&priv->msr_wait); | 601 | wake_up_interruptible(&port->delta_msr_wait); |
| 605 | spin_unlock_irqrestore(&priv->lock, flags); | 602 | spin_unlock_irqrestore(&priv->lock, flags); |
| 606 | exit: | 603 | exit: |
| 607 | retval = usb_submit_urb(urb, GFP_ATOMIC); | 604 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
| @@ -810,13 +807,17 @@ static int mct_u232_ioctl(struct tty_struct *tty, | |||
| 810 | cprev = mct_u232_port->icount; | 807 | cprev = mct_u232_port->icount; |
| 811 | spin_unlock_irqrestore(&mct_u232_port->lock, flags); | 808 | spin_unlock_irqrestore(&mct_u232_port->lock, flags); |
| 812 | for ( ; ; ) { | 809 | for ( ; ; ) { |
| 813 | prepare_to_wait(&mct_u232_port->msr_wait, | 810 | prepare_to_wait(&port->delta_msr_wait, |
| 814 | &wait, TASK_INTERRUPTIBLE); | 811 | &wait, TASK_INTERRUPTIBLE); |
| 815 | schedule(); | 812 | schedule(); |
| 816 | finish_wait(&mct_u232_port->msr_wait, &wait); | 813 | finish_wait(&port->delta_msr_wait, &wait); |
| 817 | /* see if a signal did it */ | 814 | /* see if a signal did it */ |
| 818 | if (signal_pending(current)) | 815 | if (signal_pending(current)) |
| 819 | return -ERESTARTSYS; | 816 | return -ERESTARTSYS; |
| 817 | |||
| 818 | if (port->serial->disconnected) | ||
| 819 | return -EIO; | ||
| 820 | |||
| 820 | spin_lock_irqsave(&mct_u232_port->lock, flags); | 821 | spin_lock_irqsave(&mct_u232_port->lock, flags); |
| 821 | cnow = mct_u232_port->icount; | 822 | cnow = mct_u232_port->icount; |
| 822 | spin_unlock_irqrestore(&mct_u232_port->lock, flags); | 823 | spin_unlock_irqrestore(&mct_u232_port->lock, flags); |
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 809fb329eca5..b8051fa61911 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c | |||
| @@ -219,7 +219,6 @@ struct moschip_port { | |||
| 219 | char open; | 219 | char open; |
| 220 | char open_ports; | 220 | char open_ports; |
| 221 | wait_queue_head_t wait_chase; /* for handling sleeping while waiting for chase to finish */ | 221 | wait_queue_head_t wait_chase; /* for handling sleeping while waiting for chase to finish */ |
| 222 | wait_queue_head_t delta_msr_wait; /* for handling sleeping while waiting for msr change to happen */ | ||
| 223 | int delta_msr_cond; | 222 | int delta_msr_cond; |
| 224 | struct async_icount icount; | 223 | struct async_icount icount; |
| 225 | struct usb_serial_port *port; /* loop back to the owner of this object */ | 224 | struct usb_serial_port *port; /* loop back to the owner of this object */ |
| @@ -423,6 +422,9 @@ static void mos7840_handle_new_msr(struct moschip_port *port, __u8 new_msr) | |||
| 423 | icount->rng++; | 422 | icount->rng++; |
| 424 | smp_wmb(); | 423 | smp_wmb(); |
| 425 | } | 424 | } |
| 425 | |||
| 426 | mos7840_port->delta_msr_cond = 1; | ||
| 427 | wake_up_interruptible(&port->port->delta_msr_wait); | ||
| 426 | } | 428 | } |
| 427 | } | 429 | } |
| 428 | 430 | ||
| @@ -1127,7 +1129,6 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
| 1127 | 1129 | ||
| 1128 | /* initialize our wait queues */ | 1130 | /* initialize our wait queues */ |
| 1129 | init_waitqueue_head(&mos7840_port->wait_chase); | 1131 | init_waitqueue_head(&mos7840_port->wait_chase); |
| 1130 | init_waitqueue_head(&mos7840_port->delta_msr_wait); | ||
| 1131 | 1132 | ||
| 1132 | /* initialize our icount structure */ | 1133 | /* initialize our icount structure */ |
| 1133 | memset(&(mos7840_port->icount), 0x00, sizeof(mos7840_port->icount)); | 1134 | memset(&(mos7840_port->icount), 0x00, sizeof(mos7840_port->icount)); |
| @@ -2017,8 +2018,6 @@ static void mos7840_change_port_settings(struct tty_struct *tty, | |||
| 2017 | mos7840_port->read_urb_busy = false; | 2018 | mos7840_port->read_urb_busy = false; |
| 2018 | } | 2019 | } |
| 2019 | } | 2020 | } |
| 2020 | wake_up(&mos7840_port->delta_msr_wait); | ||
| 2021 | mos7840_port->delta_msr_cond = 1; | ||
| 2022 | dev_dbg(&port->dev, "%s - mos7840_port->shadowLCR is End %x\n", __func__, | 2021 | dev_dbg(&port->dev, "%s - mos7840_port->shadowLCR is End %x\n", __func__, |
| 2023 | mos7840_port->shadowLCR); | 2022 | mos7840_port->shadowLCR); |
| 2024 | } | 2023 | } |
| @@ -2219,13 +2218,18 @@ static int mos7840_ioctl(struct tty_struct *tty, | |||
| 2219 | while (1) { | 2218 | while (1) { |
| 2220 | /* interruptible_sleep_on(&mos7840_port->delta_msr_wait); */ | 2219 | /* interruptible_sleep_on(&mos7840_port->delta_msr_wait); */ |
| 2221 | mos7840_port->delta_msr_cond = 0; | 2220 | mos7840_port->delta_msr_cond = 0; |
| 2222 | wait_event_interruptible(mos7840_port->delta_msr_wait, | 2221 | wait_event_interruptible(port->delta_msr_wait, |
| 2223 | (mos7840_port-> | 2222 | (port->serial->disconnected || |
| 2223 | mos7840_port-> | ||
| 2224 | delta_msr_cond == 1)); | 2224 | delta_msr_cond == 1)); |
| 2225 | 2225 | ||
| 2226 | /* see if a signal did it */ | 2226 | /* see if a signal did it */ |
| 2227 | if (signal_pending(current)) | 2227 | if (signal_pending(current)) |
| 2228 | return -ERESTARTSYS; | 2228 | return -ERESTARTSYS; |
| 2229 | |||
| 2230 | if (port->serial->disconnected) | ||
| 2231 | return -EIO; | ||
| 2232 | |||
| 2229 | cnow = mos7840_port->icount; | 2233 | cnow = mos7840_port->icount; |
| 2230 | smp_rmb(); | 2234 | smp_rmb(); |
| 2231 | if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && | 2235 | if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index f7d339d8187b..558adfc05007 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -341,6 +341,8 @@ static void option_instat_callback(struct urb *urb); | |||
| 341 | #define CINTERION_PRODUCT_EU3_E 0x0051 | 341 | #define CINTERION_PRODUCT_EU3_E 0x0051 |
| 342 | #define CINTERION_PRODUCT_EU3_P 0x0052 | 342 | #define CINTERION_PRODUCT_EU3_P 0x0052 |
| 343 | #define CINTERION_PRODUCT_PH8 0x0053 | 343 | #define CINTERION_PRODUCT_PH8 0x0053 |
| 344 | #define CINTERION_PRODUCT_AH6 0x0055 | ||
| 345 | #define CINTERION_PRODUCT_PLS8 0x0060 | ||
| 344 | 346 | ||
| 345 | /* Olivetti products */ | 347 | /* Olivetti products */ |
| 346 | #define OLIVETTI_VENDOR_ID 0x0b3c | 348 | #define OLIVETTI_VENDOR_ID 0x0b3c |
| @@ -579,6 +581,7 @@ static const struct usb_device_id option_ids[] = { | |||
| 579 | { USB_DEVICE(QUANTA_VENDOR_ID, 0xea42), | 581 | { USB_DEVICE(QUANTA_VENDOR_ID, 0xea42), |
| 580 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 582 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
| 581 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c05, USB_CLASS_COMM, 0x02, 0xff) }, | 583 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c05, USB_CLASS_COMM, 0x02, 0xff) }, |
| 584 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c1f, USB_CLASS_COMM, 0x02, 0xff) }, | ||
| 582 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c23, USB_CLASS_COMM, 0x02, 0xff) }, | 585 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c23, USB_CLASS_COMM, 0x02, 0xff) }, |
| 583 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173, 0xff, 0xff, 0xff), | 586 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173, 0xff, 0xff, 0xff), |
| 584 | .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, | 587 | .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, |
| @@ -1260,6 +1263,8 @@ static const struct usb_device_id option_ids[] = { | |||
| 1260 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) }, | 1263 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_E) }, |
| 1261 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) }, | 1264 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) }, |
| 1262 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8) }, | 1265 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8) }, |
| 1266 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AH6) }, | ||
| 1267 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLS8) }, | ||
| 1263 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) }, | 1268 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) }, |
| 1264 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) }, | 1269 | { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDMNET) }, |
| 1265 | { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDM) }, | 1270 | { USB_DEVICE(SIEMENS_VENDOR_ID, CINTERION_PRODUCT_HC25_MDM) }, |
diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c index a958fd41b5b3..87c71ccfee87 100644 --- a/drivers/usb/serial/oti6858.c +++ b/drivers/usb/serial/oti6858.c | |||
| @@ -188,7 +188,6 @@ struct oti6858_private { | |||
| 188 | u8 setup_done; | 188 | u8 setup_done; |
| 189 | struct delayed_work delayed_setup_work; | 189 | struct delayed_work delayed_setup_work; |
| 190 | 190 | ||
| 191 | wait_queue_head_t intr_wait; | ||
| 192 | struct usb_serial_port *port; /* USB port with which associated */ | 191 | struct usb_serial_port *port; /* USB port with which associated */ |
| 193 | }; | 192 | }; |
| 194 | 193 | ||
| @@ -339,7 +338,6 @@ static int oti6858_port_probe(struct usb_serial_port *port) | |||
| 339 | return -ENOMEM; | 338 | return -ENOMEM; |
| 340 | 339 | ||
| 341 | spin_lock_init(&priv->lock); | 340 | spin_lock_init(&priv->lock); |
| 342 | init_waitqueue_head(&priv->intr_wait); | ||
| 343 | priv->port = port; | 341 | priv->port = port; |
| 344 | INIT_DELAYED_WORK(&priv->delayed_setup_work, setup_line); | 342 | INIT_DELAYED_WORK(&priv->delayed_setup_work, setup_line); |
| 345 | INIT_DELAYED_WORK(&priv->delayed_write_work, send_data); | 343 | INIT_DELAYED_WORK(&priv->delayed_write_work, send_data); |
| @@ -664,11 +662,15 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) | |||
| 664 | spin_unlock_irqrestore(&priv->lock, flags); | 662 | spin_unlock_irqrestore(&priv->lock, flags); |
| 665 | 663 | ||
| 666 | while (1) { | 664 | while (1) { |
| 667 | wait_event_interruptible(priv->intr_wait, | 665 | wait_event_interruptible(port->delta_msr_wait, |
| 666 | port->serial->disconnected || | ||
| 668 | priv->status.pin_state != prev); | 667 | priv->status.pin_state != prev); |
| 669 | if (signal_pending(current)) | 668 | if (signal_pending(current)) |
| 670 | return -ERESTARTSYS; | 669 | return -ERESTARTSYS; |
| 671 | 670 | ||
| 671 | if (port->serial->disconnected) | ||
| 672 | return -EIO; | ||
| 673 | |||
| 672 | spin_lock_irqsave(&priv->lock, flags); | 674 | spin_lock_irqsave(&priv->lock, flags); |
| 673 | status = priv->status.pin_state & PIN_MASK; | 675 | status = priv->status.pin_state & PIN_MASK; |
| 674 | spin_unlock_irqrestore(&priv->lock, flags); | 676 | spin_unlock_irqrestore(&priv->lock, flags); |
| @@ -763,7 +765,7 @@ static void oti6858_read_int_callback(struct urb *urb) | |||
| 763 | 765 | ||
| 764 | if (!priv->transient) { | 766 | if (!priv->transient) { |
| 765 | if (xs->pin_state != priv->status.pin_state) | 767 | if (xs->pin_state != priv->status.pin_state) |
| 766 | wake_up_interruptible(&priv->intr_wait); | 768 | wake_up_interruptible(&port->delta_msr_wait); |
| 767 | memcpy(&priv->status, xs, OTI6858_CTRL_PKT_SIZE); | 769 | memcpy(&priv->status, xs, OTI6858_CTRL_PKT_SIZE); |
| 768 | } | 770 | } |
| 769 | 771 | ||
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 54adc9125e5c..3b10018d89a3 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
| @@ -139,7 +139,6 @@ struct pl2303_serial_private { | |||
| 139 | 139 | ||
| 140 | struct pl2303_private { | 140 | struct pl2303_private { |
| 141 | spinlock_t lock; | 141 | spinlock_t lock; |
| 142 | wait_queue_head_t delta_msr_wait; | ||
| 143 | u8 line_control; | 142 | u8 line_control; |
| 144 | u8 line_status; | 143 | u8 line_status; |
| 145 | }; | 144 | }; |
| @@ -233,7 +232,6 @@ static int pl2303_port_probe(struct usb_serial_port *port) | |||
| 233 | return -ENOMEM; | 232 | return -ENOMEM; |
| 234 | 233 | ||
| 235 | spin_lock_init(&priv->lock); | 234 | spin_lock_init(&priv->lock); |
| 236 | init_waitqueue_head(&priv->delta_msr_wait); | ||
| 237 | 235 | ||
| 238 | usb_set_serial_port_data(port, priv); | 236 | usb_set_serial_port_data(port, priv); |
| 239 | 237 | ||
| @@ -607,11 +605,14 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) | |||
| 607 | spin_unlock_irqrestore(&priv->lock, flags); | 605 | spin_unlock_irqrestore(&priv->lock, flags); |
| 608 | 606 | ||
| 609 | while (1) { | 607 | while (1) { |
| 610 | interruptible_sleep_on(&priv->delta_msr_wait); | 608 | interruptible_sleep_on(&port->delta_msr_wait); |
| 611 | /* see if a signal did it */ | 609 | /* see if a signal did it */ |
| 612 | if (signal_pending(current)) | 610 | if (signal_pending(current)) |
| 613 | return -ERESTARTSYS; | 611 | return -ERESTARTSYS; |
| 614 | 612 | ||
| 613 | if (port->serial->disconnected) | ||
| 614 | return -EIO; | ||
| 615 | |||
| 615 | spin_lock_irqsave(&priv->lock, flags); | 616 | spin_lock_irqsave(&priv->lock, flags); |
| 616 | status = priv->line_status; | 617 | status = priv->line_status; |
| 617 | spin_unlock_irqrestore(&priv->lock, flags); | 618 | spin_unlock_irqrestore(&priv->lock, flags); |
| @@ -719,7 +720,7 @@ static void pl2303_update_line_status(struct usb_serial_port *port, | |||
| 719 | spin_unlock_irqrestore(&priv->lock, flags); | 720 | spin_unlock_irqrestore(&priv->lock, flags); |
| 720 | if (priv->line_status & UART_BREAK_ERROR) | 721 | if (priv->line_status & UART_BREAK_ERROR) |
| 721 | usb_serial_handle_break(port); | 722 | usb_serial_handle_break(port); |
| 722 | wake_up_interruptible(&priv->delta_msr_wait); | 723 | wake_up_interruptible(&port->delta_msr_wait); |
| 723 | 724 | ||
| 724 | tty = tty_port_tty_get(&port->port); | 725 | tty = tty_port_tty_get(&port->port); |
| 725 | if (!tty) | 726 | if (!tty) |
| @@ -783,7 +784,7 @@ static void pl2303_process_read_urb(struct urb *urb) | |||
| 783 | line_status = priv->line_status; | 784 | line_status = priv->line_status; |
| 784 | priv->line_status &= ~UART_STATE_TRANSIENT_MASK; | 785 | priv->line_status &= ~UART_STATE_TRANSIENT_MASK; |
| 785 | spin_unlock_irqrestore(&priv->lock, flags); | 786 | spin_unlock_irqrestore(&priv->lock, flags); |
| 786 | wake_up_interruptible(&priv->delta_msr_wait); | 787 | wake_up_interruptible(&port->delta_msr_wait); |
| 787 | 788 | ||
| 788 | if (!urb->actual_length) | 789 | if (!urb->actual_length) |
| 789 | return; | 790 | return; |
diff --git a/drivers/usb/serial/qcaux.c b/drivers/usb/serial/qcaux.c index 9b1b96f2d095..31f81c3c15eb 100644 --- a/drivers/usb/serial/qcaux.c +++ b/drivers/usb/serial/qcaux.c | |||
| @@ -69,6 +69,7 @@ static struct usb_device_id id_table[] = { | |||
| 69 | { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xfd, 0xff) }, /* NMEA */ | 69 | { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xfd, 0xff) }, /* NMEA */ |
| 70 | { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xfe, 0xff) }, /* WMC */ | 70 | { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xfe, 0xff) }, /* WMC */ |
| 71 | { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xff, 0xff) }, /* DIAG */ | 71 | { USB_VENDOR_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, 0xff, 0xff, 0xff) }, /* DIAG */ |
| 72 | { USB_DEVICE_AND_INTERFACE_INFO(0x1fac, 0x0151, 0xff, 0xff, 0xff) }, | ||
| 72 | { }, | 73 | { }, |
| 73 | }; | 74 | }; |
| 74 | MODULE_DEVICE_TABLE(usb, id_table); | 75 | MODULE_DEVICE_TABLE(usb, id_table); |
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index 24662547dc5b..59b32b782126 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c | |||
| @@ -197,12 +197,15 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id) | |||
| 197 | 197 | ||
| 198 | if (is_gobi1k) { | 198 | if (is_gobi1k) { |
| 199 | /* Gobi 1K USB layout: | 199 | /* Gobi 1K USB layout: |
| 200 | * 0: serial port (doesn't respond) | 200 | * 0: DM/DIAG (use libqcdm from ModemManager for communication) |
| 201 | * 1: serial port (doesn't respond) | 201 | * 1: serial port (doesn't respond) |
| 202 | * 2: AT-capable modem port | 202 | * 2: AT-capable modem port |
| 203 | * 3: QMI/net | 203 | * 3: QMI/net |
| 204 | */ | 204 | */ |
| 205 | if (ifnum == 2) | 205 | if (ifnum == 0) { |
| 206 | dev_dbg(dev, "Gobi 1K DM/DIAG interface found\n"); | ||
| 207 | altsetting = 1; | ||
| 208 | } else if (ifnum == 2) | ||
| 206 | dev_dbg(dev, "Modem port found\n"); | 209 | dev_dbg(dev, "Modem port found\n"); |
| 207 | else | 210 | else |
| 208 | altsetting = -1; | 211 | altsetting = -1; |
diff --git a/drivers/usb/serial/quatech2.c b/drivers/usb/serial/quatech2.c index 00e6c9bac8a3..75f125ddb0c9 100644 --- a/drivers/usb/serial/quatech2.c +++ b/drivers/usb/serial/quatech2.c | |||
| @@ -128,7 +128,6 @@ struct qt2_port_private { | |||
| 128 | u8 shadowLSR; | 128 | u8 shadowLSR; |
| 129 | u8 shadowMSR; | 129 | u8 shadowMSR; |
| 130 | 130 | ||
| 131 | wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */ | ||
| 132 | struct async_icount icount; | 131 | struct async_icount icount; |
| 133 | 132 | ||
| 134 | struct usb_serial_port *port; | 133 | struct usb_serial_port *port; |
| @@ -506,8 +505,9 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) | |||
| 506 | spin_unlock_irqrestore(&priv->lock, flags); | 505 | spin_unlock_irqrestore(&priv->lock, flags); |
| 507 | 506 | ||
| 508 | while (1) { | 507 | while (1) { |
| 509 | wait_event_interruptible(priv->delta_msr_wait, | 508 | wait_event_interruptible(port->delta_msr_wait, |
| 510 | ((priv->icount.rng != prev.rng) || | 509 | (port->serial->disconnected || |
| 510 | (priv->icount.rng != prev.rng) || | ||
| 511 | (priv->icount.dsr != prev.dsr) || | 511 | (priv->icount.dsr != prev.dsr) || |
| 512 | (priv->icount.dcd != prev.dcd) || | 512 | (priv->icount.dcd != prev.dcd) || |
| 513 | (priv->icount.cts != prev.cts))); | 513 | (priv->icount.cts != prev.cts))); |
| @@ -515,6 +515,9 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) | |||
| 515 | if (signal_pending(current)) | 515 | if (signal_pending(current)) |
| 516 | return -ERESTARTSYS; | 516 | return -ERESTARTSYS; |
| 517 | 517 | ||
| 518 | if (port->serial->disconnected) | ||
| 519 | return -EIO; | ||
| 520 | |||
| 518 | spin_lock_irqsave(&priv->lock, flags); | 521 | spin_lock_irqsave(&priv->lock, flags); |
| 519 | cur = priv->icount; | 522 | cur = priv->icount; |
| 520 | spin_unlock_irqrestore(&priv->lock, flags); | 523 | spin_unlock_irqrestore(&priv->lock, flags); |
| @@ -661,7 +664,9 @@ void qt2_process_read_urb(struct urb *urb) | |||
| 661 | __func__); | 664 | __func__); |
| 662 | break; | 665 | break; |
| 663 | } | 666 | } |
| 664 | tty_flip_buffer_push(&port->port); | 667 | |
| 668 | if (port_priv->is_open) | ||
| 669 | tty_flip_buffer_push(&port->port); | ||
| 665 | 670 | ||
| 666 | newport = *(ch + 3); | 671 | newport = *(ch + 3); |
| 667 | 672 | ||
| @@ -704,7 +709,8 @@ void qt2_process_read_urb(struct urb *urb) | |||
| 704 | tty_insert_flip_string(&port->port, ch, 1); | 709 | tty_insert_flip_string(&port->port, ch, 1); |
| 705 | } | 710 | } |
| 706 | 711 | ||
| 707 | tty_flip_buffer_push(&port->port); | 712 | if (port_priv->is_open) |
| 713 | tty_flip_buffer_push(&port->port); | ||
| 708 | } | 714 | } |
| 709 | 715 | ||
| 710 | static void qt2_write_bulk_callback(struct urb *urb) | 716 | static void qt2_write_bulk_callback(struct urb *urb) |
| @@ -824,7 +830,6 @@ static int qt2_port_probe(struct usb_serial_port *port) | |||
| 824 | 830 | ||
| 825 | spin_lock_init(&port_priv->lock); | 831 | spin_lock_init(&port_priv->lock); |
| 826 | spin_lock_init(&port_priv->urb_lock); | 832 | spin_lock_init(&port_priv->urb_lock); |
| 827 | init_waitqueue_head(&port_priv->delta_msr_wait); | ||
| 828 | port_priv->port = port; | 833 | port_priv->port = port; |
| 829 | 834 | ||
| 830 | port_priv->write_urb = usb_alloc_urb(0, GFP_KERNEL); | 835 | port_priv->write_urb = usb_alloc_urb(0, GFP_KERNEL); |
| @@ -967,7 +972,7 @@ static void qt2_update_msr(struct usb_serial_port *port, unsigned char *ch) | |||
| 967 | if (newMSR & UART_MSR_TERI) | 972 | if (newMSR & UART_MSR_TERI) |
| 968 | port_priv->icount.rng++; | 973 | port_priv->icount.rng++; |
| 969 | 974 | ||
| 970 | wake_up_interruptible(&port_priv->delta_msr_wait); | 975 | wake_up_interruptible(&port->delta_msr_wait); |
| 971 | } | 976 | } |
| 972 | } | 977 | } |
| 973 | 978 | ||
diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c index 91ff8e3bddbd..549ef68ff5fa 100644 --- a/drivers/usb/serial/spcp8x5.c +++ b/drivers/usb/serial/spcp8x5.c | |||
| @@ -149,7 +149,6 @@ enum spcp8x5_type { | |||
| 149 | struct spcp8x5_private { | 149 | struct spcp8x5_private { |
| 150 | spinlock_t lock; | 150 | spinlock_t lock; |
| 151 | enum spcp8x5_type type; | 151 | enum spcp8x5_type type; |
| 152 | wait_queue_head_t delta_msr_wait; | ||
| 153 | u8 line_control; | 152 | u8 line_control; |
| 154 | u8 line_status; | 153 | u8 line_status; |
| 155 | }; | 154 | }; |
| @@ -179,7 +178,6 @@ static int spcp8x5_port_probe(struct usb_serial_port *port) | |||
| 179 | return -ENOMEM; | 178 | return -ENOMEM; |
| 180 | 179 | ||
| 181 | spin_lock_init(&priv->lock); | 180 | spin_lock_init(&priv->lock); |
| 182 | init_waitqueue_head(&priv->delta_msr_wait); | ||
| 183 | priv->type = type; | 181 | priv->type = type; |
| 184 | 182 | ||
| 185 | usb_set_serial_port_data(port , priv); | 183 | usb_set_serial_port_data(port , priv); |
| @@ -475,7 +473,7 @@ static void spcp8x5_process_read_urb(struct urb *urb) | |||
| 475 | priv->line_status &= ~UART_STATE_TRANSIENT_MASK; | 473 | priv->line_status &= ~UART_STATE_TRANSIENT_MASK; |
| 476 | spin_unlock_irqrestore(&priv->lock, flags); | 474 | spin_unlock_irqrestore(&priv->lock, flags); |
| 477 | /* wake up the wait for termios */ | 475 | /* wake up the wait for termios */ |
| 478 | wake_up_interruptible(&priv->delta_msr_wait); | 476 | wake_up_interruptible(&port->delta_msr_wait); |
| 479 | 477 | ||
| 480 | if (!urb->actual_length) | 478 | if (!urb->actual_length) |
| 481 | return; | 479 | return; |
| @@ -526,12 +524,15 @@ static int spcp8x5_wait_modem_info(struct usb_serial_port *port, | |||
| 526 | 524 | ||
| 527 | while (1) { | 525 | while (1) { |
| 528 | /* wake up in bulk read */ | 526 | /* wake up in bulk read */ |
| 529 | interruptible_sleep_on(&priv->delta_msr_wait); | 527 | interruptible_sleep_on(&port->delta_msr_wait); |
| 530 | 528 | ||
| 531 | /* see if a signal did it */ | 529 | /* see if a signal did it */ |
| 532 | if (signal_pending(current)) | 530 | if (signal_pending(current)) |
| 533 | return -ERESTARTSYS; | 531 | return -ERESTARTSYS; |
| 534 | 532 | ||
| 533 | if (port->serial->disconnected) | ||
| 534 | return -EIO; | ||
| 535 | |||
| 535 | spin_lock_irqsave(&priv->lock, flags); | 536 | spin_lock_irqsave(&priv->lock, flags); |
| 536 | status = priv->line_status; | 537 | status = priv->line_status; |
| 537 | spin_unlock_irqrestore(&priv->lock, flags); | 538 | spin_unlock_irqrestore(&priv->lock, flags); |
diff --git a/drivers/usb/serial/ssu100.c b/drivers/usb/serial/ssu100.c index b57cf841c5b6..4b2a19757b4d 100644 --- a/drivers/usb/serial/ssu100.c +++ b/drivers/usb/serial/ssu100.c | |||
| @@ -61,7 +61,6 @@ struct ssu100_port_private { | |||
| 61 | spinlock_t status_lock; | 61 | spinlock_t status_lock; |
| 62 | u8 shadowLSR; | 62 | u8 shadowLSR; |
| 63 | u8 shadowMSR; | 63 | u8 shadowMSR; |
| 64 | wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */ | ||
| 65 | struct async_icount icount; | 64 | struct async_icount icount; |
| 66 | }; | 65 | }; |
| 67 | 66 | ||
| @@ -355,8 +354,9 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) | |||
| 355 | spin_unlock_irqrestore(&priv->status_lock, flags); | 354 | spin_unlock_irqrestore(&priv->status_lock, flags); |
| 356 | 355 | ||
| 357 | while (1) { | 356 | while (1) { |
| 358 | wait_event_interruptible(priv->delta_msr_wait, | 357 | wait_event_interruptible(port->delta_msr_wait, |
| 359 | ((priv->icount.rng != prev.rng) || | 358 | (port->serial->disconnected || |
| 359 | (priv->icount.rng != prev.rng) || | ||
| 360 | (priv->icount.dsr != prev.dsr) || | 360 | (priv->icount.dsr != prev.dsr) || |
| 361 | (priv->icount.dcd != prev.dcd) || | 361 | (priv->icount.dcd != prev.dcd) || |
| 362 | (priv->icount.cts != prev.cts))); | 362 | (priv->icount.cts != prev.cts))); |
| @@ -364,6 +364,9 @@ static int wait_modem_info(struct usb_serial_port *port, unsigned int arg) | |||
| 364 | if (signal_pending(current)) | 364 | if (signal_pending(current)) |
| 365 | return -ERESTARTSYS; | 365 | return -ERESTARTSYS; |
| 366 | 366 | ||
| 367 | if (port->serial->disconnected) | ||
| 368 | return -EIO; | ||
| 369 | |||
| 367 | spin_lock_irqsave(&priv->status_lock, flags); | 370 | spin_lock_irqsave(&priv->status_lock, flags); |
| 368 | cur = priv->icount; | 371 | cur = priv->icount; |
| 369 | spin_unlock_irqrestore(&priv->status_lock, flags); | 372 | spin_unlock_irqrestore(&priv->status_lock, flags); |
| @@ -445,7 +448,6 @@ static int ssu100_port_probe(struct usb_serial_port *port) | |||
| 445 | return -ENOMEM; | 448 | return -ENOMEM; |
| 446 | 449 | ||
| 447 | spin_lock_init(&priv->status_lock); | 450 | spin_lock_init(&priv->status_lock); |
| 448 | init_waitqueue_head(&priv->delta_msr_wait); | ||
| 449 | 451 | ||
| 450 | usb_set_serial_port_data(port, priv); | 452 | usb_set_serial_port_data(port, priv); |
| 451 | 453 | ||
| @@ -537,7 +539,7 @@ static void ssu100_update_msr(struct usb_serial_port *port, u8 msr) | |||
| 537 | priv->icount.dcd++; | 539 | priv->icount.dcd++; |
| 538 | if (msr & UART_MSR_TERI) | 540 | if (msr & UART_MSR_TERI) |
| 539 | priv->icount.rng++; | 541 | priv->icount.rng++; |
| 540 | wake_up_interruptible(&priv->delta_msr_wait); | 542 | wake_up_interruptible(&port->delta_msr_wait); |
| 541 | } | 543 | } |
| 542 | } | 544 | } |
| 543 | 545 | ||
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index 39cb9b807c3c..73deb029fc05 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
| @@ -74,7 +74,6 @@ struct ti_port { | |||
| 74 | int tp_flags; | 74 | int tp_flags; |
| 75 | int tp_closing_wait;/* in .01 secs */ | 75 | int tp_closing_wait;/* in .01 secs */ |
| 76 | struct async_icount tp_icount; | 76 | struct async_icount tp_icount; |
| 77 | wait_queue_head_t tp_msr_wait; /* wait for msr change */ | ||
| 78 | wait_queue_head_t tp_write_wait; | 77 | wait_queue_head_t tp_write_wait; |
| 79 | struct ti_device *tp_tdev; | 78 | struct ti_device *tp_tdev; |
| 80 | struct usb_serial_port *tp_port; | 79 | struct usb_serial_port *tp_port; |
| @@ -432,7 +431,6 @@ static int ti_port_probe(struct usb_serial_port *port) | |||
| 432 | else | 431 | else |
| 433 | tport->tp_uart_base_addr = TI_UART2_BASE_ADDR; | 432 | tport->tp_uart_base_addr = TI_UART2_BASE_ADDR; |
| 434 | tport->tp_closing_wait = closing_wait; | 433 | tport->tp_closing_wait = closing_wait; |
| 435 | init_waitqueue_head(&tport->tp_msr_wait); | ||
| 436 | init_waitqueue_head(&tport->tp_write_wait); | 434 | init_waitqueue_head(&tport->tp_write_wait); |
| 437 | if (kfifo_alloc(&tport->write_fifo, TI_WRITE_BUF_SIZE, GFP_KERNEL)) { | 435 | if (kfifo_alloc(&tport->write_fifo, TI_WRITE_BUF_SIZE, GFP_KERNEL)) { |
| 438 | kfree(tport); | 436 | kfree(tport); |
| @@ -784,9 +782,13 @@ static int ti_ioctl(struct tty_struct *tty, | |||
| 784 | dev_dbg(&port->dev, "%s - TIOCMIWAIT\n", __func__); | 782 | dev_dbg(&port->dev, "%s - TIOCMIWAIT\n", __func__); |
| 785 | cprev = tport->tp_icount; | 783 | cprev = tport->tp_icount; |
| 786 | while (1) { | 784 | while (1) { |
| 787 | interruptible_sleep_on(&tport->tp_msr_wait); | 785 | interruptible_sleep_on(&port->delta_msr_wait); |
| 788 | if (signal_pending(current)) | 786 | if (signal_pending(current)) |
| 789 | return -ERESTARTSYS; | 787 | return -ERESTARTSYS; |
| 788 | |||
| 789 | if (port->serial->disconnected) | ||
| 790 | return -EIO; | ||
| 791 | |||
| 790 | cnow = tport->tp_icount; | 792 | cnow = tport->tp_icount; |
| 791 | if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && | 793 | if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && |
| 792 | cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) | 794 | cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) |
| @@ -1392,7 +1394,7 @@ static void ti_handle_new_msr(struct ti_port *tport, __u8 msr) | |||
| 1392 | icount->dcd++; | 1394 | icount->dcd++; |
| 1393 | if (msr & TI_MSR_DELTA_RI) | 1395 | if (msr & TI_MSR_DELTA_RI) |
| 1394 | icount->rng++; | 1396 | icount->rng++; |
| 1395 | wake_up_interruptible(&tport->tp_msr_wait); | 1397 | wake_up_interruptible(&tport->tp_port->delta_msr_wait); |
| 1396 | spin_unlock_irqrestore(&tport->tp_lock, flags); | 1398 | spin_unlock_irqrestore(&tport->tp_lock, flags); |
| 1397 | } | 1399 | } |
| 1398 | 1400 | ||
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index a19ed74d770d..5d9b178484fd 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
| @@ -151,6 +151,7 @@ static void destroy_serial(struct kref *kref) | |||
| 151 | } | 151 | } |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | usb_put_intf(serial->interface); | ||
| 154 | usb_put_dev(serial->dev); | 155 | usb_put_dev(serial->dev); |
| 155 | kfree(serial); | 156 | kfree(serial); |
| 156 | } | 157 | } |
| @@ -620,7 +621,7 @@ static struct usb_serial *create_serial(struct usb_device *dev, | |||
| 620 | } | 621 | } |
| 621 | serial->dev = usb_get_dev(dev); | 622 | serial->dev = usb_get_dev(dev); |
| 622 | serial->type = driver; | 623 | serial->type = driver; |
| 623 | serial->interface = interface; | 624 | serial->interface = usb_get_intf(interface); |
| 624 | kref_init(&serial->kref); | 625 | kref_init(&serial->kref); |
| 625 | mutex_init(&serial->disc_mutex); | 626 | mutex_init(&serial->disc_mutex); |
| 626 | serial->minor = SERIAL_TTY_NO_MINOR; | 627 | serial->minor = SERIAL_TTY_NO_MINOR; |
| @@ -902,6 +903,7 @@ static int usb_serial_probe(struct usb_interface *interface, | |||
| 902 | port->port.ops = &serial_port_ops; | 903 | port->port.ops = &serial_port_ops; |
| 903 | port->serial = serial; | 904 | port->serial = serial; |
| 904 | spin_lock_init(&port->lock); | 905 | spin_lock_init(&port->lock); |
| 906 | init_waitqueue_head(&port->delta_msr_wait); | ||
| 905 | /* Keep this for private driver use for the moment but | 907 | /* Keep this for private driver use for the moment but |
| 906 | should probably go away */ | 908 | should probably go away */ |
| 907 | INIT_WORK(&port->work, usb_serial_port_work); | 909 | INIT_WORK(&port->work, usb_serial_port_work); |
diff --git a/drivers/usb/storage/initializers.c b/drivers/usb/storage/initializers.c index 7ab9046ae0ec..105d900150c1 100644 --- a/drivers/usb/storage/initializers.c +++ b/drivers/usb/storage/initializers.c | |||
| @@ -92,8 +92,8 @@ int usb_stor_ucr61s2b_init(struct us_data *us) | |||
| 92 | return 0; | 92 | return 0; |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | /* This places the HUAWEI usb dongles in multi-port mode */ | 95 | /* This places the HUAWEI E220 devices in multi-port mode */ |
| 96 | static int usb_stor_huawei_feature_init(struct us_data *us) | 96 | int usb_stor_huawei_e220_init(struct us_data *us) |
| 97 | { | 97 | { |
| 98 | int result; | 98 | int result; |
| 99 | 99 | ||
| @@ -104,75 +104,3 @@ static int usb_stor_huawei_feature_init(struct us_data *us) | |||
| 104 | US_DEBUGP("Huawei mode set result is %d\n", result); | 104 | US_DEBUGP("Huawei mode set result is %d\n", result); |
| 105 | return 0; | 105 | return 0; |
| 106 | } | 106 | } |
| 107 | |||
| 108 | /* | ||
| 109 | * It will send a scsi switch command called rewind' to huawei dongle. | ||
| 110 | * When the dongle receives this command at the first time, | ||
| 111 | * it will reboot immediately. After rebooted, it will ignore this command. | ||
| 112 | * So it is unnecessary to read its response. | ||
| 113 | */ | ||
| 114 | static int usb_stor_huawei_scsi_init(struct us_data *us) | ||
| 115 | { | ||
| 116 | int result = 0; | ||
| 117 | int act_len = 0; | ||
| 118 | struct bulk_cb_wrap *bcbw = (struct bulk_cb_wrap *) us->iobuf; | ||
| 119 | char rewind_cmd[] = {0x11, 0x06, 0x20, 0x00, 0x00, 0x01, 0x01, 0x00, | ||
| 120 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; | ||
| 121 | |||
| 122 | bcbw->Signature = cpu_to_le32(US_BULK_CB_SIGN); | ||
| 123 | bcbw->Tag = 0; | ||
| 124 | bcbw->DataTransferLength = 0; | ||
| 125 | bcbw->Flags = bcbw->Lun = 0; | ||
| 126 | bcbw->Length = sizeof(rewind_cmd); | ||
| 127 | memset(bcbw->CDB, 0, sizeof(bcbw->CDB)); | ||
| 128 | memcpy(bcbw->CDB, rewind_cmd, sizeof(rewind_cmd)); | ||
| 129 | |||
| 130 | result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe, bcbw, | ||
| 131 | US_BULK_CB_WRAP_LEN, &act_len); | ||
| 132 | US_DEBUGP("transfer actual length=%d, result=%d\n", act_len, result); | ||
| 133 | return result; | ||
| 134 | } | ||
| 135 | |||
| 136 | /* | ||
| 137 | * It tries to find the supported Huawei USB dongles. | ||
| 138 | * In Huawei, they assign the following product IDs | ||
| 139 | * for all of their mobile broadband dongles, | ||
| 140 | * including the new dongles in the future. | ||
| 141 | * So if the product ID is not included in this list, | ||
| 142 | * it means it is not Huawei's mobile broadband dongles. | ||
| 143 | */ | ||
| 144 | static int usb_stor_huawei_dongles_pid(struct us_data *us) | ||
| 145 | { | ||
| 146 | struct usb_interface_descriptor *idesc; | ||
| 147 | int idProduct; | ||
| 148 | |||
| 149 | idesc = &us->pusb_intf->cur_altsetting->desc; | ||
| 150 | idProduct = le16_to_cpu(us->pusb_dev->descriptor.idProduct); | ||
| 151 | /* The first port is CDROM, | ||
| 152 | * means the dongle in the single port mode, | ||
| 153 | * and a switch command is required to be sent. */ | ||
| 154 | if (idesc && idesc->bInterfaceNumber == 0) { | ||
| 155 | if ((idProduct == 0x1001) | ||
| 156 | || (idProduct == 0x1003) | ||
| 157 | || (idProduct == 0x1004) | ||
| 158 | || (idProduct >= 0x1401 && idProduct <= 0x1500) | ||
| 159 | || (idProduct >= 0x1505 && idProduct <= 0x1600) | ||
| 160 | || (idProduct >= 0x1c02 && idProduct <= 0x2202)) { | ||
| 161 | return 1; | ||
| 162 | } | ||
| 163 | } | ||
| 164 | return 0; | ||
| 165 | } | ||
| 166 | |||
| 167 | int usb_stor_huawei_init(struct us_data *us) | ||
| 168 | { | ||
| 169 | int result = 0; | ||
| 170 | |||
| 171 | if (usb_stor_huawei_dongles_pid(us)) { | ||
| 172 | if (le16_to_cpu(us->pusb_dev->descriptor.idProduct) >= 0x1446) | ||
| 173 | result = usb_stor_huawei_scsi_init(us); | ||
| 174 | else | ||
| 175 | result = usb_stor_huawei_feature_init(us); | ||
| 176 | } | ||
| 177 | return result; | ||
| 178 | } | ||
diff --git a/drivers/usb/storage/initializers.h b/drivers/usb/storage/initializers.h index 5376d4fc76f0..529327fbb06b 100644 --- a/drivers/usb/storage/initializers.h +++ b/drivers/usb/storage/initializers.h | |||
| @@ -46,5 +46,5 @@ int usb_stor_euscsi_init(struct us_data *us); | |||
| 46 | * flash reader */ | 46 | * flash reader */ |
| 47 | int usb_stor_ucr61s2b_init(struct us_data *us); | 47 | int usb_stor_ucr61s2b_init(struct us_data *us); |
| 48 | 48 | ||
| 49 | /* This places the HUAWEI usb dongles in multi-port mode */ | 49 | /* This places the HUAWEI E220 devices in multi-port mode */ |
| 50 | int usb_stor_huawei_init(struct us_data *us); | 50 | int usb_stor_huawei_e220_init(struct us_data *us); |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 72923b56bbf6..1799335288bd 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -53,6 +53,14 @@ | |||
| 53 | * as opposed to devices that do something strangely or wrongly. | 53 | * as opposed to devices that do something strangely or wrongly. |
| 54 | */ | 54 | */ |
| 55 | 55 | ||
| 56 | /* In-kernel mode switching is deprecated. Do not add new devices to | ||
| 57 | * this list for the sole purpose of switching them to a different | ||
| 58 | * mode. Existing userspace solutions are superior. | ||
| 59 | * | ||
| 60 | * New mode switching devices should instead be added to the database | ||
| 61 | * maintained at http://www.draisberghof.de/usb_modeswitch/ | ||
| 62 | */ | ||
| 63 | |||
| 56 | #if !defined(CONFIG_USB_STORAGE_SDDR09) && \ | 64 | #if !defined(CONFIG_USB_STORAGE_SDDR09) && \ |
| 57 | !defined(CONFIG_USB_STORAGE_SDDR09_MODULE) | 65 | !defined(CONFIG_USB_STORAGE_SDDR09_MODULE) |
| 58 | #define NO_SDDR09 | 66 | #define NO_SDDR09 |
| @@ -488,6 +496,13 @@ UNUSUAL_DEV( 0x04e8, 0x5122, 0x0000, 0x9999, | |||
| 488 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 496 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
| 489 | US_FL_MAX_SECTORS_64 | US_FL_BULK_IGNORE_TAG), | 497 | US_FL_MAX_SECTORS_64 | US_FL_BULK_IGNORE_TAG), |
| 490 | 498 | ||
| 499 | /* Added by Dmitry Artamonow <mad_soft@inbox.ru> */ | ||
| 500 | UNUSUAL_DEV( 0x04e8, 0x5136, 0x0000, 0x9999, | ||
| 501 | "Samsung", | ||
| 502 | "YP-Z3", | ||
| 503 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
| 504 | US_FL_MAX_SECTORS_64), | ||
| 505 | |||
| 491 | /* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>. | 506 | /* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>. |
| 492 | * Device uses standards-violating 32-byte Bulk Command Block Wrappers and | 507 | * Device uses standards-violating 32-byte Bulk Command Block Wrappers and |
| 493 | * reports itself as "Proprietary SCSI Bulk." Cf. device entry 0x084d:0x0011. | 508 | * reports itself as "Proprietary SCSI Bulk." Cf. device entry 0x084d:0x0011. |
| @@ -1527,10 +1542,335 @@ UNUSUAL_DEV( 0x1210, 0x0003, 0x0100, 0x0100, | |||
| 1527 | /* Reported by fangxiaozhi <huananhu@huawei.com> | 1542 | /* Reported by fangxiaozhi <huananhu@huawei.com> |
| 1528 | * This brings the HUAWEI data card devices into multi-port mode | 1543 | * This brings the HUAWEI data card devices into multi-port mode |
| 1529 | */ | 1544 | */ |
| 1530 | UNUSUAL_VENDOR_INTF(0x12d1, 0x08, 0x06, 0x50, | 1545 | UNUSUAL_DEV( 0x12d1, 0x1001, 0x0000, 0x0000, |
| 1546 | "HUAWEI MOBILE", | ||
| 1547 | "Mass Storage", | ||
| 1548 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1549 | 0), | ||
| 1550 | UNUSUAL_DEV( 0x12d1, 0x1003, 0x0000, 0x0000, | ||
| 1551 | "HUAWEI MOBILE", | ||
| 1552 | "Mass Storage", | ||
| 1553 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1554 | 0), | ||
| 1555 | UNUSUAL_DEV( 0x12d1, 0x1004, 0x0000, 0x0000, | ||
| 1556 | "HUAWEI MOBILE", | ||
| 1557 | "Mass Storage", | ||
| 1558 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1559 | 0), | ||
| 1560 | UNUSUAL_DEV( 0x12d1, 0x1401, 0x0000, 0x0000, | ||
| 1561 | "HUAWEI MOBILE", | ||
| 1562 | "Mass Storage", | ||
| 1563 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1564 | 0), | ||
| 1565 | UNUSUAL_DEV( 0x12d1, 0x1402, 0x0000, 0x0000, | ||
| 1566 | "HUAWEI MOBILE", | ||
| 1567 | "Mass Storage", | ||
| 1568 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1569 | 0), | ||
| 1570 | UNUSUAL_DEV( 0x12d1, 0x1403, 0x0000, 0x0000, | ||
| 1571 | "HUAWEI MOBILE", | ||
| 1572 | "Mass Storage", | ||
| 1573 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1574 | 0), | ||
| 1575 | UNUSUAL_DEV( 0x12d1, 0x1404, 0x0000, 0x0000, | ||
| 1576 | "HUAWEI MOBILE", | ||
| 1577 | "Mass Storage", | ||
| 1578 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1579 | 0), | ||
| 1580 | UNUSUAL_DEV( 0x12d1, 0x1405, 0x0000, 0x0000, | ||
| 1581 | "HUAWEI MOBILE", | ||
| 1582 | "Mass Storage", | ||
| 1583 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1584 | 0), | ||
| 1585 | UNUSUAL_DEV( 0x12d1, 0x1406, 0x0000, 0x0000, | ||
| 1586 | "HUAWEI MOBILE", | ||
| 1587 | "Mass Storage", | ||
| 1588 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1589 | 0), | ||
| 1590 | UNUSUAL_DEV( 0x12d1, 0x1407, 0x0000, 0x0000, | ||
| 1591 | "HUAWEI MOBILE", | ||
| 1592 | "Mass Storage", | ||
| 1593 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1594 | 0), | ||
| 1595 | UNUSUAL_DEV( 0x12d1, 0x1408, 0x0000, 0x0000, | ||
| 1596 | "HUAWEI MOBILE", | ||
| 1597 | "Mass Storage", | ||
| 1598 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1599 | 0), | ||
| 1600 | UNUSUAL_DEV( 0x12d1, 0x1409, 0x0000, 0x0000, | ||
| 1601 | "HUAWEI MOBILE", | ||
| 1602 | "Mass Storage", | ||
| 1603 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1604 | 0), | ||
| 1605 | UNUSUAL_DEV( 0x12d1, 0x140A, 0x0000, 0x0000, | ||
| 1606 | "HUAWEI MOBILE", | ||
| 1607 | "Mass Storage", | ||
| 1608 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1609 | 0), | ||
| 1610 | UNUSUAL_DEV( 0x12d1, 0x140B, 0x0000, 0x0000, | ||
| 1611 | "HUAWEI MOBILE", | ||
| 1612 | "Mass Storage", | ||
| 1613 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1614 | 0), | ||
| 1615 | UNUSUAL_DEV( 0x12d1, 0x140C, 0x0000, 0x0000, | ||
| 1616 | "HUAWEI MOBILE", | ||
| 1617 | "Mass Storage", | ||
| 1618 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1619 | 0), | ||
| 1620 | UNUSUAL_DEV( 0x12d1, 0x140D, 0x0000, 0x0000, | ||
| 1621 | "HUAWEI MOBILE", | ||
| 1622 | "Mass Storage", | ||
| 1623 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1624 | 0), | ||
| 1625 | UNUSUAL_DEV( 0x12d1, 0x140E, 0x0000, 0x0000, | ||
| 1626 | "HUAWEI MOBILE", | ||
| 1627 | "Mass Storage", | ||
| 1628 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1629 | 0), | ||
| 1630 | UNUSUAL_DEV( 0x12d1, 0x140F, 0x0000, 0x0000, | ||
| 1631 | "HUAWEI MOBILE", | ||
| 1632 | "Mass Storage", | ||
| 1633 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1634 | 0), | ||
| 1635 | UNUSUAL_DEV( 0x12d1, 0x1410, 0x0000, 0x0000, | ||
| 1636 | "HUAWEI MOBILE", | ||
| 1637 | "Mass Storage", | ||
| 1638 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1639 | 0), | ||
| 1640 | UNUSUAL_DEV( 0x12d1, 0x1411, 0x0000, 0x0000, | ||
| 1641 | "HUAWEI MOBILE", | ||
| 1642 | "Mass Storage", | ||
| 1643 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1644 | 0), | ||
| 1645 | UNUSUAL_DEV( 0x12d1, 0x1412, 0x0000, 0x0000, | ||
| 1646 | "HUAWEI MOBILE", | ||
| 1647 | "Mass Storage", | ||
| 1648 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1649 | 0), | ||
| 1650 | UNUSUAL_DEV( 0x12d1, 0x1413, 0x0000, 0x0000, | ||
| 1651 | "HUAWEI MOBILE", | ||
| 1652 | "Mass Storage", | ||
| 1653 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1654 | 0), | ||
| 1655 | UNUSUAL_DEV( 0x12d1, 0x1414, 0x0000, 0x0000, | ||
| 1656 | "HUAWEI MOBILE", | ||
| 1657 | "Mass Storage", | ||
| 1658 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1659 | 0), | ||
| 1660 | UNUSUAL_DEV( 0x12d1, 0x1415, 0x0000, 0x0000, | ||
| 1661 | "HUAWEI MOBILE", | ||
| 1662 | "Mass Storage", | ||
| 1663 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1664 | 0), | ||
| 1665 | UNUSUAL_DEV( 0x12d1, 0x1416, 0x0000, 0x0000, | ||
| 1666 | "HUAWEI MOBILE", | ||
| 1667 | "Mass Storage", | ||
| 1668 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1669 | 0), | ||
| 1670 | UNUSUAL_DEV( 0x12d1, 0x1417, 0x0000, 0x0000, | ||
| 1671 | "HUAWEI MOBILE", | ||
| 1672 | "Mass Storage", | ||
| 1673 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1674 | 0), | ||
| 1675 | UNUSUAL_DEV( 0x12d1, 0x1418, 0x0000, 0x0000, | ||
| 1676 | "HUAWEI MOBILE", | ||
| 1677 | "Mass Storage", | ||
| 1678 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1679 | 0), | ||
| 1680 | UNUSUAL_DEV( 0x12d1, 0x1419, 0x0000, 0x0000, | ||
| 1681 | "HUAWEI MOBILE", | ||
| 1682 | "Mass Storage", | ||
| 1683 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1684 | 0), | ||
| 1685 | UNUSUAL_DEV( 0x12d1, 0x141A, 0x0000, 0x0000, | ||
| 1686 | "HUAWEI MOBILE", | ||
| 1687 | "Mass Storage", | ||
| 1688 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1689 | 0), | ||
| 1690 | UNUSUAL_DEV( 0x12d1, 0x141B, 0x0000, 0x0000, | ||
| 1691 | "HUAWEI MOBILE", | ||
| 1692 | "Mass Storage", | ||
| 1693 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1694 | 0), | ||
| 1695 | UNUSUAL_DEV( 0x12d1, 0x141C, 0x0000, 0x0000, | ||
| 1696 | "HUAWEI MOBILE", | ||
| 1697 | "Mass Storage", | ||
| 1698 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1699 | 0), | ||
| 1700 | UNUSUAL_DEV( 0x12d1, 0x141D, 0x0000, 0x0000, | ||
| 1701 | "HUAWEI MOBILE", | ||
| 1702 | "Mass Storage", | ||
| 1703 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1704 | 0), | ||
| 1705 | UNUSUAL_DEV( 0x12d1, 0x141E, 0x0000, 0x0000, | ||
| 1706 | "HUAWEI MOBILE", | ||
| 1707 | "Mass Storage", | ||
| 1708 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1709 | 0), | ||
| 1710 | UNUSUAL_DEV( 0x12d1, 0x141F, 0x0000, 0x0000, | ||
| 1711 | "HUAWEI MOBILE", | ||
| 1712 | "Mass Storage", | ||
| 1713 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1714 | 0), | ||
| 1715 | UNUSUAL_DEV( 0x12d1, 0x1420, 0x0000, 0x0000, | ||
| 1716 | "HUAWEI MOBILE", | ||
| 1717 | "Mass Storage", | ||
| 1718 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1719 | 0), | ||
| 1720 | UNUSUAL_DEV( 0x12d1, 0x1421, 0x0000, 0x0000, | ||
| 1721 | "HUAWEI MOBILE", | ||
| 1722 | "Mass Storage", | ||
| 1723 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1724 | 0), | ||
| 1725 | UNUSUAL_DEV( 0x12d1, 0x1422, 0x0000, 0x0000, | ||
| 1726 | "HUAWEI MOBILE", | ||
| 1727 | "Mass Storage", | ||
| 1728 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1729 | 0), | ||
| 1730 | UNUSUAL_DEV( 0x12d1, 0x1423, 0x0000, 0x0000, | ||
| 1731 | "HUAWEI MOBILE", | ||
| 1732 | "Mass Storage", | ||
| 1733 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1734 | 0), | ||
| 1735 | UNUSUAL_DEV( 0x12d1, 0x1424, 0x0000, 0x0000, | ||
| 1736 | "HUAWEI MOBILE", | ||
| 1737 | "Mass Storage", | ||
| 1738 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1739 | 0), | ||
| 1740 | UNUSUAL_DEV( 0x12d1, 0x1425, 0x0000, 0x0000, | ||
| 1741 | "HUAWEI MOBILE", | ||
| 1742 | "Mass Storage", | ||
| 1743 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1744 | 0), | ||
| 1745 | UNUSUAL_DEV( 0x12d1, 0x1426, 0x0000, 0x0000, | ||
| 1746 | "HUAWEI MOBILE", | ||
| 1747 | "Mass Storage", | ||
| 1748 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1749 | 0), | ||
| 1750 | UNUSUAL_DEV( 0x12d1, 0x1427, 0x0000, 0x0000, | ||
| 1751 | "HUAWEI MOBILE", | ||
| 1752 | "Mass Storage", | ||
| 1753 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1754 | 0), | ||
| 1755 | UNUSUAL_DEV( 0x12d1, 0x1428, 0x0000, 0x0000, | ||
| 1756 | "HUAWEI MOBILE", | ||
| 1757 | "Mass Storage", | ||
| 1758 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1759 | 0), | ||
| 1760 | UNUSUAL_DEV( 0x12d1, 0x1429, 0x0000, 0x0000, | ||
| 1761 | "HUAWEI MOBILE", | ||
| 1762 | "Mass Storage", | ||
| 1763 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1764 | 0), | ||
| 1765 | UNUSUAL_DEV( 0x12d1, 0x142A, 0x0000, 0x0000, | ||
| 1766 | "HUAWEI MOBILE", | ||
| 1767 | "Mass Storage", | ||
| 1768 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1769 | 0), | ||
| 1770 | UNUSUAL_DEV( 0x12d1, 0x142B, 0x0000, 0x0000, | ||
| 1771 | "HUAWEI MOBILE", | ||
| 1772 | "Mass Storage", | ||
| 1773 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1774 | 0), | ||
| 1775 | UNUSUAL_DEV( 0x12d1, 0x142C, 0x0000, 0x0000, | ||
| 1776 | "HUAWEI MOBILE", | ||
| 1777 | "Mass Storage", | ||
| 1778 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1779 | 0), | ||
| 1780 | UNUSUAL_DEV( 0x12d1, 0x142D, 0x0000, 0x0000, | ||
| 1781 | "HUAWEI MOBILE", | ||
| 1782 | "Mass Storage", | ||
| 1783 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1784 | 0), | ||
| 1785 | UNUSUAL_DEV( 0x12d1, 0x142E, 0x0000, 0x0000, | ||
| 1786 | "HUAWEI MOBILE", | ||
| 1787 | "Mass Storage", | ||
| 1788 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1789 | 0), | ||
| 1790 | UNUSUAL_DEV( 0x12d1, 0x142F, 0x0000, 0x0000, | ||
| 1791 | "HUAWEI MOBILE", | ||
| 1792 | "Mass Storage", | ||
| 1793 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1794 | 0), | ||
| 1795 | UNUSUAL_DEV( 0x12d1, 0x1430, 0x0000, 0x0000, | ||
| 1796 | "HUAWEI MOBILE", | ||
| 1797 | "Mass Storage", | ||
| 1798 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1799 | 0), | ||
| 1800 | UNUSUAL_DEV( 0x12d1, 0x1431, 0x0000, 0x0000, | ||
| 1801 | "HUAWEI MOBILE", | ||
| 1802 | "Mass Storage", | ||
| 1803 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1804 | 0), | ||
| 1805 | UNUSUAL_DEV( 0x12d1, 0x1432, 0x0000, 0x0000, | ||
| 1806 | "HUAWEI MOBILE", | ||
| 1807 | "Mass Storage", | ||
| 1808 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1809 | 0), | ||
| 1810 | UNUSUAL_DEV( 0x12d1, 0x1433, 0x0000, 0x0000, | ||
| 1811 | "HUAWEI MOBILE", | ||
| 1812 | "Mass Storage", | ||
| 1813 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1814 | 0), | ||
| 1815 | UNUSUAL_DEV( 0x12d1, 0x1434, 0x0000, 0x0000, | ||
| 1816 | "HUAWEI MOBILE", | ||
| 1817 | "Mass Storage", | ||
| 1818 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1819 | 0), | ||
| 1820 | UNUSUAL_DEV( 0x12d1, 0x1435, 0x0000, 0x0000, | ||
| 1821 | "HUAWEI MOBILE", | ||
| 1822 | "Mass Storage", | ||
| 1823 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1824 | 0), | ||
| 1825 | UNUSUAL_DEV( 0x12d1, 0x1436, 0x0000, 0x0000, | ||
| 1826 | "HUAWEI MOBILE", | ||
| 1827 | "Mass Storage", | ||
| 1828 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1829 | 0), | ||
| 1830 | UNUSUAL_DEV( 0x12d1, 0x1437, 0x0000, 0x0000, | ||
| 1831 | "HUAWEI MOBILE", | ||
| 1832 | "Mass Storage", | ||
| 1833 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1834 | 0), | ||
| 1835 | UNUSUAL_DEV( 0x12d1, 0x1438, 0x0000, 0x0000, | ||
| 1836 | "HUAWEI MOBILE", | ||
| 1837 | "Mass Storage", | ||
| 1838 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1839 | 0), | ||
| 1840 | UNUSUAL_DEV( 0x12d1, 0x1439, 0x0000, 0x0000, | ||
| 1841 | "HUAWEI MOBILE", | ||
| 1842 | "Mass Storage", | ||
| 1843 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1844 | 0), | ||
| 1845 | UNUSUAL_DEV( 0x12d1, 0x143A, 0x0000, 0x0000, | ||
| 1846 | "HUAWEI MOBILE", | ||
| 1847 | "Mass Storage", | ||
| 1848 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1849 | 0), | ||
| 1850 | UNUSUAL_DEV( 0x12d1, 0x143B, 0x0000, 0x0000, | ||
| 1851 | "HUAWEI MOBILE", | ||
| 1852 | "Mass Storage", | ||
| 1853 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1854 | 0), | ||
| 1855 | UNUSUAL_DEV( 0x12d1, 0x143C, 0x0000, 0x0000, | ||
| 1856 | "HUAWEI MOBILE", | ||
| 1857 | "Mass Storage", | ||
| 1858 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1859 | 0), | ||
| 1860 | UNUSUAL_DEV( 0x12d1, 0x143D, 0x0000, 0x0000, | ||
| 1861 | "HUAWEI MOBILE", | ||
| 1862 | "Mass Storage", | ||
| 1863 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1864 | 0), | ||
| 1865 | UNUSUAL_DEV( 0x12d1, 0x143E, 0x0000, 0x0000, | ||
| 1866 | "HUAWEI MOBILE", | ||
| 1867 | "Mass Storage", | ||
| 1868 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1869 | 0), | ||
| 1870 | UNUSUAL_DEV( 0x12d1, 0x143F, 0x0000, 0x0000, | ||
| 1531 | "HUAWEI MOBILE", | 1871 | "HUAWEI MOBILE", |
| 1532 | "Mass Storage", | 1872 | "Mass Storage", |
| 1533 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_init, | 1873 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, |
| 1534 | 0), | 1874 | 0), |
| 1535 | 1875 | ||
| 1536 | /* Reported by Vilius Bilinkevicius <vilisas AT xxx DOT lt) */ | 1876 | /* Reported by Vilius Bilinkevicius <vilisas AT xxx DOT lt) */ |
