|
@@ -539,7 +539,6 @@ static void acm_port_down(struct acm *acm)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
|
- mutex_lock(&open_mutex);
|
|
|
if (acm->dev) {
|
|
|
usb_autopm_get_interface(acm->control);
|
|
|
acm_set_control(acm, acm->ctrlout = 0);
|
|
@@ -551,14 +550,15 @@ static void acm_port_down(struct acm *acm)
|
|
|
acm->control->needs_remote_wakeup = 0;
|
|
|
usb_autopm_put_interface(acm->control);
|
|
|
}
|
|
|
- mutex_unlock(&open_mutex);
|
|
|
}
|
|
|
|
|
|
static void acm_tty_hangup(struct tty_struct *tty)
|
|
|
{
|
|
|
struct acm *acm = tty->driver_data;
|
|
|
tty_port_hangup(&acm->port);
|
|
|
+ mutex_lock(&open_mutex);
|
|
|
acm_port_down(acm);
|
|
|
+ mutex_unlock(&open_mutex);
|
|
|
}
|
|
|
|
|
|
static void acm_tty_close(struct tty_struct *tty, struct file *filp)
|
|
@@ -569,8 +569,9 @@ static void acm_tty_close(struct tty_struct *tty, struct file *filp)
|
|
|
shutdown */
|
|
|
if (!acm)
|
|
|
return;
|
|
|
+
|
|
|
+ mutex_lock(&open_mutex);
|
|
|
if (tty_port_close_start(&acm->port, tty, filp) == 0) {
|
|
|
- mutex_lock(&open_mutex);
|
|
|
if (!acm->dev) {
|
|
|
tty_port_tty_set(&acm->port, NULL);
|
|
|
acm_tty_unregister(acm);
|
|
@@ -582,6 +583,7 @@ static void acm_tty_close(struct tty_struct *tty, struct file *filp)
|
|
|
acm_port_down(acm);
|
|
|
tty_port_close_end(&acm->port, tty);
|
|
|
tty_port_tty_set(&acm->port, NULL);
|
|
|
+ mutex_unlock(&open_mutex);
|
|
|
}
|
|
|
|
|
|
static int acm_tty_write(struct tty_struct *tty,
|