diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2010-08-11 03:36:51 -0400 |
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2010-08-11 03:36:51 -0400 |
| commit | 6396fc3b3ff3f6b942992b653a62df11dcef9bea (patch) | |
| tree | db3c7cbe833b43c653adc99f70941431c5ff7c4e /drivers/usb/class/cdc-acm.c | |
| parent | 4785879e4d340e24e54f6de2ccfc42728b912808 (diff) | |
| parent | 3d30701b58970425e1d45994d6cb82f828924fdd (diff) | |
Merge branch 'master' into for-next
Conflicts:
fs/exofs/inode.c
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 | } |
