|
@@ -216,38 +216,6 @@ static int acm_start_wb(struct acm *acm, struct acm_wb *wb)
|
|
|
return rc;
|
|
|
}
|
|
|
|
|
|
-static int acm_write_start(struct acm *acm, int wbn)
|
|
|
-{
|
|
|
- unsigned long flags;
|
|
|
- struct acm_wb *wb = &acm->wb[wbn];
|
|
|
- int rc;
|
|
|
-
|
|
|
- spin_lock_irqsave(&acm->write_lock, flags);
|
|
|
- if (!acm->dev) {
|
|
|
- wb->use = 0;
|
|
|
- spin_unlock_irqrestore(&acm->write_lock, flags);
|
|
|
- return -ENODEV;
|
|
|
- }
|
|
|
-
|
|
|
- dev_vdbg(&acm->data->dev, "%s - susp_count %d\n", __func__,
|
|
|
- acm->susp_count);
|
|
|
- usb_autopm_get_interface_async(acm->control);
|
|
|
- if (acm->susp_count) {
|
|
|
- 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; /* A white lie */
|
|
|
- }
|
|
|
- usb_mark_last_busy(acm->dev);
|
|
|
-
|
|
|
- rc = acm_start_wb(acm, wb);
|
|
|
- spin_unlock_irqrestore(&acm->write_lock, flags);
|
|
|
-
|
|
|
- return rc;
|
|
|
-
|
|
|
-}
|
|
|
/*
|
|
|
* attributes exported through sysfs
|
|
|
*/
|
|
@@ -653,13 +621,31 @@ static int acm_tty_write(struct tty_struct *tty,
|
|
|
}
|
|
|
wb = &acm->wb[wbn];
|
|
|
|
|
|
+ if (!acm->dev) {
|
|
|
+ wb->use = 0;
|
|
|
+ spin_unlock_irqrestore(&acm->write_lock, flags);
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+
|
|
|
count = (count > acm->writesize) ? acm->writesize : count;
|
|
|
dev_vdbg(&acm->data->dev, "%s - write %d\n", __func__, count);
|
|
|
memcpy(wb->buf, buf, count);
|
|
|
wb->len = count;
|
|
|
+
|
|
|
+ usb_autopm_get_interface_async(acm->control);
|
|
|
+ if (acm->susp_count) {
|
|
|
+ if (!acm->delayed_wb)
|
|
|
+ acm->delayed_wb = wb;
|
|
|
+ else
|
|
|
+ usb_autopm_put_interface_async(acm->control);
|
|
|
+ spin_unlock_irqrestore(&acm->write_lock, flags);
|
|
|
+ return count; /* A white lie */
|
|
|
+ }
|
|
|
+ usb_mark_last_busy(acm->dev);
|
|
|
+
|
|
|
+ stat = acm_start_wb(acm, wb);
|
|
|
spin_unlock_irqrestore(&acm->write_lock, flags);
|
|
|
|
|
|
- stat = acm_write_start(acm, wbn);
|
|
|
if (stat < 0)
|
|
|
return stat;
|
|
|
return count;
|