diff options
| author | Dhiren Parmar <dparmar@nvidia.com> | 2015-01-19 10:06:47 -0800 |
|---|---|---|
| committer | Dhiren Parmar <dparmar@nvidia.com> | 2015-01-20 00:37:40 -0800 |
| commit | a4e6b7c9af0db63e7b7bc45f75cb07e51df0558f (patch) | |
| tree | 656045eb50775cb812979359b6c575f1cbc60900 | |
| parent | 14f7ad1b1befe178caa36cb0ed920bdad7030663 (diff) | |
Revert "Modem : Remove local fixes as fixed in upstream"
seems to have caused Encryption Failure.
This reverts commit 4c9fde8676cfc2f6f524caf342c2e4cb042ad6e1.
Change-Id: I4d13f8d4cf39148fc1da4ad1178341a32cb159c9
Signed-off-by: Dhiren Parmar <dparmar@nvidia.com>
Reviewed-on: http://git-master/r/673727
| -rw-r--r-- | drivers/usb/class/cdc-acm.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index b842635dde5..dc7ed4c6a02 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -220,6 +220,9 @@ static int acm_write_start(struct acm *acm, int wbn) unsigned long flags; struct acm_wb *wb = &acm->wb[wbn]; int rc; +#ifdef CONFIG_PM + struct urb *res; +#endif spin_lock_irqsave(&acm->write_lock, flags); if (!acm->dev) { @@ -249,6 +252,20 @@ static int acm_write_start(struct acm *acm, int wbn) return 0; /* A white lie */ } usb_mark_last_busy(acm->dev); +#ifdef CONFIG_PM + while ((res = usb_get_from_anchor(&acm->deferred))) { + /* decrement ref count*/ + usb_put_urb(res); + rc = usb_submit_urb(res, GFP_ATOMIC); + if (rc < 0) { + dev_dbg(&acm->data->dev, + "usb_submit_urb(pending request) failed: %d", + rc); + usb_unanchor_urb(res); + acm_write_done(acm, res->context); + } + } +#endif rc = acm_start_wb(acm, wb); spin_unlock_irqrestore(&acm->write_lock, flags); @@ -1247,6 +1264,7 @@ made_compressed_probe: INIT_LIST_HEAD(&acm->rb_head); acm->rx_buflimit = num_rx_buf; INIT_WORK(&acm->work, acm_softint); + init_usb_anchor(&acm->deferred); spin_lock_init(&acm->write_lock); spin_lock_init(&acm->read_lock); mutex_init(&acm->mutex); @@ -1454,6 +1472,7 @@ static void acm_disconnect(struct usb_interface *intf) struct acm *acm = usb_get_intfdata(intf); struct usb_device *usb_dev = interface_to_usbdev(intf); struct tty_struct *tty; + struct urb *res; int i; dev_dbg(&intf->dev, "%s\n", __func__); @@ -1485,6 +1504,9 @@ static void acm_disconnect(struct usb_interface *intf) tty_unregister_device(acm_tty_driver, acm->minor); + /* decrement ref count of anchored urbs */ + while ((res = usb_get_from_anchor(&acm->deferred))) + usb_put_urb(res); usb_free_urb(acm->ctrlurb); for (i = 0; i < ACM_NW; i++) usb_free_urb(acm->wb[i].urb); @@ -1592,6 +1614,7 @@ static int acm_resume(struct usb_interface *intf) } else { spin_unlock_irq(&acm->write_lock); } +#endif /* * delayed error checking because we must |
