diff options
Diffstat (limited to 'drivers/usb/class/cdc-acm.c')
| -rw-r--r-- | drivers/usb/class/cdc-acm.c | 52 | 
1 files changed, 19 insertions, 33 deletions
| diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 9b1cbcf8fb7f..9f49bfe4c6f4 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -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; |