diff options
Diffstat (limited to 'drivers/usb/class/cdc-acm.c')
| -rw-r--r-- | drivers/usb/class/cdc-acm.c | 15 | 
1 files changed, 13 insertions, 2 deletions
| diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 8bbd8e29e60d..7b2e2420ecae 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -340,6 +340,9 @@ static void acm_process_notification(struct acm *acm, unsigned char *buf)  			acm->iocount.overrun++;  		spin_unlock_irqrestore(&acm->read_lock, flags); +		if (newctrl & ACM_CTRL_BRK) +			tty_flip_buffer_push(&acm->port); +  		if (difference)  			wake_up_all(&acm->wioctl); @@ -475,11 +478,16 @@ static int acm_submit_read_urbs(struct acm *acm, gfp_t mem_flags)  static void acm_process_read_urb(struct acm *acm, struct urb *urb)  { +	unsigned long flags; +  	if (!urb->actual_length)  		return; +	spin_lock_irqsave(&acm->read_lock, flags);  	tty_insert_flip_string(&acm->port, urb->transfer_buffer,  			urb->actual_length); +	spin_unlock_irqrestore(&acm->read_lock, flags); +  	tty_flip_buffer_push(&acm->port);  } @@ -726,7 +734,8 @@ static void acm_port_destruct(struct tty_port *port)  {  	struct acm *acm = container_of(port, struct acm, port); -	acm_release_minor(acm); +	if (acm->minor != ACM_MINOR_INVALID) +		acm_release_minor(acm);  	usb_put_intf(acm->control);  	kfree(acm->country_codes);  	kfree(acm); @@ -1323,8 +1332,10 @@ made_compressed_probe:  	usb_get_intf(acm->control); /* undone in destruct() */  	minor = acm_alloc_minor(acm); -	if (minor < 0) +	if (minor < 0) { +		acm->minor = ACM_MINOR_INVALID;  		goto err_put_port; +	}  	acm->minor = minor;  	acm->dev = usb_dev; |