aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDhiren Parmar <dparmar@nvidia.com>2015-01-19 10:06:47 -0800
committerDhiren Parmar <dparmar@nvidia.com>2015-01-20 00:37:40 -0800
commita4e6b7c9af0db63e7b7bc45f75cb07e51df0558f (patch)
tree656045eb50775cb812979359b6c575f1cbc60900
parent14f7ad1b1befe178caa36cb0ed920bdad7030663 (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.c23
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