aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/class/cdc-acm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/class/cdc-acm.c')
-rw-r--r--drivers/usb/class/cdc-acm.c12
1 files changed, 3 insertions, 9 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 89d260d6b031..1833b3a71515 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -636,19 +636,13 @@ static void acm_tty_unregister(struct acm *acm)
636 636
637static int acm_tty_chars_in_buffer(struct tty_struct *tty); 637static int acm_tty_chars_in_buffer(struct tty_struct *tty);
638 638
639static void acm_port_down(struct acm *acm, int drain) 639static void acm_port_down(struct acm *acm)
640{ 640{
641 int i, nr = acm->rx_buflimit; 641 int i, nr = acm->rx_buflimit;
642 mutex_lock(&open_mutex); 642 mutex_lock(&open_mutex);
643 if (acm->dev) { 643 if (acm->dev) {
644 usb_autopm_get_interface(acm->control); 644 usb_autopm_get_interface(acm->control);
645 acm_set_control(acm, acm->ctrlout = 0); 645 acm_set_control(acm, acm->ctrlout = 0);
646 /* try letting the last writes drain naturally */
647 if (drain) {
648 wait_event_interruptible_timeout(acm->drain_wait,
649 (ACM_NW == acm_wb_is_avail(acm)) || !acm->dev,
650 ACM_CLOSE_TIMEOUT * HZ);
651 }
652 usb_kill_urb(acm->ctrlurb); 646 usb_kill_urb(acm->ctrlurb);
653 for (i = 0; i < ACM_NW; i++) 647 for (i = 0; i < ACM_NW; i++)
654 usb_kill_urb(acm->wb[i].urb); 648 usb_kill_urb(acm->wb[i].urb);
@@ -664,7 +658,7 @@ static void acm_tty_hangup(struct tty_struct *tty)
664{ 658{
665 struct acm *acm = tty->driver_data; 659 struct acm *acm = tty->driver_data;
666 tty_port_hangup(&acm->port); 660 tty_port_hangup(&acm->port);
667 acm_port_down(acm, 0); 661 acm_port_down(acm);
668} 662}
669 663
670static void acm_tty_close(struct tty_struct *tty, struct file *filp) 664static void acm_tty_close(struct tty_struct *tty, struct file *filp)
@@ -685,7 +679,7 @@ static void acm_tty_close(struct tty_struct *tty, struct file *filp)
685 mutex_unlock(&open_mutex); 679 mutex_unlock(&open_mutex);
686 return; 680 return;
687 } 681 }
688 acm_port_down(acm, 0); 682 acm_port_down(acm);
689 tty_port_close_end(&acm->port, tty); 683 tty_port_close_end(&acm->port, tty);
690 tty_port_tty_set(&acm->port, NULL); 684 tty_port_tty_set(&acm->port, NULL);
691} 685}