* changed if other ttyUSB have been registered before.
*/
static int mdm6600_attached_ports;
+static int mdm6600_suspended_ports;
static void mdm6600_read_bulk_work(struct work_struct *work);
static void mdm6600_read_bulk_cb(struct urb *urb);
pr_err("request_irq failed; err=%d", status);
return -ENXIO;
}
+ enable_irq_wake(mdm6600_wake_irq);
disable_irq(mdm6600_wake_irq);
}
dbg("%s: port %d", __func__, modem->number);
- if (modem->number == MODEM_INTERFACE_NUM)
+ if (modem->number == MODEM_INTERFACE_NUM) {
+ disable_irq_wake(mdm6600_wake_irq);
free_irq(mdm6600_wake_irq, modem);
+ }
mdm6600_kill_urbs(modem);
modem->tiocm_status = 0;
- if (modem->number == MODEM_INTERFACE_NUM) {
- enable_irq(mdm6600_wake_irq);
- enable_irq_wake(mdm6600_wake_irq);
- }
-
spin_lock_irqsave(&modem->susp_lock, flags);
modem->opened = 1;
if (modem->susp_count) {
dbg("%s: port %d", __func__, modem->number);
- if (modem->number == MODEM_INTERFACE_NUM) {
- disable_irq_wake(mdm6600_wake_irq);
- disable_irq(mdm6600_wake_irq);
- }
-
modem->opened = 0;
mdm6600_kill_urbs(modem);
spin_lock_irq(&modem->susp_lock);
- if (modem->susp_count++ == 0 && modem->opened) {
+ if (!modem->susp_count++ && modem->opened) {
+ if (!mdm6600_suspended_ports++)
+ enable_irq(mdm6600_wake_irq);
+
spin_unlock_irq(&modem->susp_lock);
dbg("%s: kill urbs", __func__);
mdm6600_kill_urbs(modem);
spin_lock_irq(&modem->susp_lock);
- if (--modem->susp_count == 0 && modem->opened) {
+ if (!--modem->susp_count && modem->opened) {
+ if (!--mdm6600_suspended_ports)
+ disable_irq(mdm6600_wake_irq);
+
dbg("%s: submit urbs", __func__);
spin_unlock_irq(&modem->susp_lock);
if (rc < 0) {
usb_unanchor_urb(u);
usb_scuttle_anchored_urbs(&modem->write.delayed);
- spin_unlock_irq(&modem->susp_lock);
pr_err("%s: submit bulk urb failed %d\n", __func__, rc);
return rc;
}