usb_scuttle_anchored_urbs(&modem->read.in_flight);
usb_kill_urb(modem->port->interrupt_in_urb);
+
+ if (!usb_wait_anchor_empty_timeout(&modem->read.pending, 1000))
+ usb_scuttle_anchored_urbs(&modem->read.pending);
}
static void mdm6600_disconnect(struct usb_serial *serial)
dbg("%s: port %d", __func__, modem->number);
+ modem->opened = 0;
+
if (modem->number == MODEM_INTERFACE_NUM) {
disable_irq_wake(mdm6600_wake_irq);
free_irq(mdm6600_wake_irq, modem);
/* cancel read bottom half */
cancel_work_sync(&modem->read.work);
- /* drop pending reads */
- usb_scuttle_anchored_urbs(&modem->read.pending);
-
modem->tiocm_status = 0;
wake_lock_destroy(&modem->readlock);
dbg("%s: port %d", __func__, modem->number);
+ usb_autopm_get_interface(modem->serial->interface);
+
modem->opened = 0;
mdm6600_kill_urbs(modem);
/* cancel read bottom half */
cancel_work_sync(&modem->read.work);
- /* drop pending reads */
- usb_scuttle_anchored_urbs(&modem->read.pending);
-
modem->tiocm_status = 0;
}
next:
usb_unanchor_urb(u);
- if (modem->susp_count) {
+ spin_lock_irqsave(&modem->susp_lock, flags);
+ if (modem->susp_count || !modem->opened) {
+ spin_unlock_irqrestore(&modem->susp_lock, flags);
usb_put_urb(u);
continue;
}
+ spin_unlock_irqrestore(&modem->susp_lock, flags);
usb_anchor_urb(u, &modem->read.in_flight);
usb_put_urb(u);
spin_unlock_irq(&modem->susp_lock);
dbg("%s: kill urbs", __func__);
mdm6600_kill_urbs(modem);
- if (!usb_wait_anchor_empty_timeout(&modem->read.pending, 1000))
- usb_scuttle_anchored_urbs(&modem->read.pending);
return 0;
}