|
@@ -1541,27 +1541,20 @@ static int acm_resume(struct usb_interface *intf)
|
|
|
struct acm *acm = usb_get_intfdata(intf);
|
|
|
struct acm_wb *wb;
|
|
|
int rv = 0;
|
|
|
- int cnt;
|
|
|
|
|
|
spin_lock_irq(&acm->read_lock);
|
|
|
- acm->susp_count -= 1;
|
|
|
- cnt = acm->susp_count;
|
|
|
- spin_unlock_irq(&acm->read_lock);
|
|
|
+ spin_lock(&acm->write_lock);
|
|
|
|
|
|
- if (cnt)
|
|
|
- return 0;
|
|
|
+ if (--acm->susp_count)
|
|
|
+ goto out;
|
|
|
|
|
|
if (test_bit(ASYNCB_INITIALIZED, &acm->port.flags)) {
|
|
|
- rv = usb_submit_urb(acm->ctrlurb, GFP_NOIO);
|
|
|
+ rv = usb_submit_urb(acm->ctrlurb, GFP_ATOMIC);
|
|
|
|
|
|
- spin_lock_irq(&acm->write_lock);
|
|
|
if (acm->delayed_wb) {
|
|
|
wb = acm->delayed_wb;
|
|
|
acm->delayed_wb = NULL;
|
|
|
- spin_unlock_irq(&acm->write_lock);
|
|
|
acm_start_wb(acm, wb);
|
|
|
- } else {
|
|
|
- spin_unlock_irq(&acm->write_lock);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -1569,12 +1562,14 @@ static int acm_resume(struct usb_interface *intf)
|
|
|
* do the write path at all cost
|
|
|
*/
|
|
|
if (rv < 0)
|
|
|
- goto err_out;
|
|
|
+ goto out;
|
|
|
|
|
|
- rv = acm_submit_read_urbs(acm, GFP_NOIO);
|
|
|
+ rv = acm_submit_read_urbs(acm, GFP_ATOMIC);
|
|
|
}
|
|
|
+out:
|
|
|
+ spin_unlock(&acm->write_lock);
|
|
|
+ spin_unlock_irq(&acm->read_lock);
|
|
|
|
|
|
-err_out:
|
|
|
return rv;
|
|
|
}
|
|
|
|