Revert "USB: cdc-acm: fix broken runtime suspend"
This reverts commit 21ffba35838100b5d332a75b418f9de43080d406.
Causing no boot issue with Touchpad
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index d7f23a5..1f701a3 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -262,9 +262,12 @@
acm->susp_count);
usb_autopm_get_interface_async(acm->control);
if (acm->susp_count) {
- usb_anchor_urb(wb->urb, &acm->delayed);
+ if (!acm->delayed_wb)
+ acm->delayed_wb = wb;
+ else
+ usb_autopm_put_interface_async(acm->control);
spin_unlock_irqrestore(&acm->write_lock, flags);
- return 0;
+ return 0; /* A white lie */
}
usb_mark_last_busy(acm->dev);
@@ -711,8 +714,6 @@
static void acm_port_shutdown(struct tty_port *port)
{
struct acm *acm = container_of(port, struct acm, port);
- struct urb *urb;
- struct acm_wb *wb;
int i;
int pm_err;
@@ -722,16 +723,6 @@
if (!acm->disconnected) {
pm_err = usb_autopm_get_interface(acm->control);
acm_set_control(acm, acm->ctrlout = 0);
-
- for (;;) {
- urb = usb_get_from_anchor(&acm->delayed);
- if (!urb)
- break;
- wb = urb->context;
- wb->use = 0;
- usb_autopm_put_interface_async(acm->control);
- }
-
usb_kill_urb(acm->ctrlurb);
for (i = 0; i < ACM_NW; i++)
usb_kill_urb(acm->wb[i].urb);
@@ -1662,7 +1653,7 @@
static int acm_resume(struct usb_interface *intf)
{
struct acm *acm = usb_get_intfdata(intf);
- struct urb *urb;
+ struct acm_wb *wb;
int rv = 0;
spin_lock_irq(&acm->read_lock);
@@ -1683,12 +1674,10 @@
rv = usb_submit_urb(acm->ctrlurb, GFP_ATOMIC);
#endif
- for (;;) {
- urb = usb_get_from_anchor(&acm->delayed);
- if (!urb)
- break;
-
- acm_start_wb(acm, urb->context);
+ if (acm->delayed_wb) {
+ wb = acm->delayed_wb;
+ acm->delayed_wb = NULL;
+ acm_start_wb(acm, wb);
}
/*