diff options
Diffstat (limited to 'drivers/usb/class/cdc-acm.c')
| -rw-r--r-- | drivers/usb/class/cdc-acm.c | 9 | 
1 files changed, 6 insertions, 3 deletions
| diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 06b3b54a0e68..7b366a6c0b49 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -174,6 +174,7 @@ static int acm_wb_alloc(struct acm *acm)  		wb = &acm->wb[wbn];  		if (!wb->use) {  			wb->use = 1; +			wb->len = 0;  			return wbn;  		}  		wbn = (wbn + 1) % ACM_NW; @@ -805,16 +806,18 @@ static int acm_tty_write(struct tty_struct *tty,  static void acm_tty_flush_chars(struct tty_struct *tty)  {  	struct acm *acm = tty->driver_data; -	struct acm_wb *cur = acm->putbuffer; +	struct acm_wb *cur;  	int err;  	unsigned long flags; +	spin_lock_irqsave(&acm->write_lock, flags); + +	cur = acm->putbuffer;  	if (!cur) /* nothing to do */ -		return; +		goto out;  	acm->putbuffer = NULL;  	err = usb_autopm_get_interface_async(acm->control); -	spin_lock_irqsave(&acm->write_lock, flags);  	if (err < 0) {  		cur->use = 0;  		acm->putbuffer = cur; | 
