diff options
Diffstat (limited to 'drivers/usb/class/cdc-acm.c')
-rw-r--r-- | drivers/usb/class/cdc-acm.c | 12 |
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 | ||
637 | static int acm_tty_chars_in_buffer(struct tty_struct *tty); | 637 | static int acm_tty_chars_in_buffer(struct tty_struct *tty); |
638 | 638 | ||
639 | static void acm_port_down(struct acm *acm, int drain) | 639 | static 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 | ||
670 | static void acm_tty_close(struct tty_struct *tty, struct file *filp) | 664 | static 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 | } |