diff options
Diffstat (limited to 'drivers/usb/class')
| -rw-r--r-- | drivers/usb/class/cdc-acm.c | 15 | ||||
| -rw-r--r-- | drivers/usb/class/cdc-acm.h | 2 | ||||
| -rw-r--r-- | drivers/usb/class/cdc-wdm.c | 6 | 
3 files changed, 18 insertions, 5 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; diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h index 8aef5eb769a0..3aa7f0a3ad71 100644 --- a/drivers/usb/class/cdc-acm.h +++ b/drivers/usb/class/cdc-acm.h @@ -22,6 +22,8 @@  #define ACM_TTY_MAJOR		166  #define ACM_TTY_MINORS		256 +#define ACM_MINOR_INVALID	ACM_TTY_MINORS +  /*   * Requests.   */ diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 35d5908b5478..fdf79bcf7eb0 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c @@ -824,7 +824,7 @@ static struct usb_class_driver wdm_class = {  };  /* --- WWAN framework integration --- */ -#ifdef CONFIG_WWAN_CORE +#ifdef CONFIG_WWAN  static int wdm_wwan_port_start(struct wwan_port *port)  {  	struct wdm_device *desc = wwan_port_get_drvdata(port); @@ -963,11 +963,11 @@ static void wdm_wwan_rx(struct wdm_device *desc, int length)  	/* inbuf has been copied, it is safe to check for outstanding data */  	schedule_work(&desc->service_outs_intr);  } -#else /* CONFIG_WWAN_CORE */ +#else /* CONFIG_WWAN */  static void wdm_wwan_init(struct wdm_device *desc) {}  static void wdm_wwan_deinit(struct wdm_device *desc) {}  static void wdm_wwan_rx(struct wdm_device *desc, int length) {} -#endif /* CONFIG_WWAN_CORE */ +#endif /* CONFIG_WWAN */  /* --- error handling --- */  static void wdm_rxwork(struct work_struct *work) |