From 78bd271f5ced5811eec2e8b2e8ebb7351b9d9df8 Mon Sep 17 00:00:00 2001 From: Alan Stern Date: Tue, 1 Sep 2009 11:39:51 -0400 Subject: [PATCH] --- yaml --- r: 163875 b: refs/heads/master c: ff8324df1187b7280e507c976777df76c73a1ef1 h: refs/heads/master i: 163873: c79627f5c0b9f3912a61beeacbe5679b3f47c76a 163871: 89c2d07ba3e8ae509ee581fe47611d29b8b2c0db v: v3 --- [refs] | 2 +- trunk/drivers/usb/serial/usb-serial.c | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 8008ec8bf150..3f82cea9b9b0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 74556123e034c8337b69a3ebac2f3a5fc0a97032 +refs/heads/master: ff8324df1187b7280e507c976777df76c73a1ef1 diff --git a/trunk/drivers/usb/serial/usb-serial.c b/trunk/drivers/usb/serial/usb-serial.c index 28125de7d902..9a3258046c8c 100644 --- a/trunk/drivers/usb/serial/usb-serial.c +++ b/trunk/drivers/usb/serial/usb-serial.c @@ -200,6 +200,8 @@ static int serial_install(struct tty_driver *driver, struct tty_struct *tty) struct usb_serial_port *port; int retval = -ENODEV; + dbg("%s", __func__); + serial = usb_serial_get_by_index(idx); if (!serial) return retval; @@ -250,11 +252,11 @@ static int serial_open (struct tty_struct *tty, struct file *filp) int retval = 0; int first = 0; - dbg("%s", __func__); - port = tty->driver_data; serial = port->serial; + dbg("%s - port %d", __func__, port->number); + if (mutex_lock_interruptible(&port->mutex)) return -ERESTARTSYS; @@ -315,6 +317,12 @@ static void serial_down(struct usb_serial_port *port) if (port->console) return; + /* Don't call the close method if the hardware hasn't been + * initialized. + */ + if (!test_and_clear_bit(ASYNCB_INITIALIZED, &port->port.flags)) + return; + mutex_lock(&port->mutex); serial = port->serial; owner = serial->type->driver.owner; @@ -328,10 +336,11 @@ static void serial_down(struct usb_serial_port *port) static void serial_hangup(struct tty_struct *tty) { struct usb_serial_port *port = tty->driver_data; + + dbg("%s - port %d", __func__, port->number); + serial_down(port); tty_port_hangup(&port->port); - /* We must not free port yet - the USB serial layer depends on it's - continued existence */ } static void serial_close(struct tty_struct *tty, struct file *filp) @@ -340,6 +349,8 @@ static void serial_close(struct tty_struct *tty, struct file *filp) dbg("%s - port %d", __func__, port->number); + if (tty_hung_up_p(filp)) + return; if (tty_port_close_start(&port->port, tty, filp) == 0) return; serial_down(port); @@ -368,6 +379,8 @@ static void serial_release(struct tty_struct *tty) if (port->console) return; + dbg("%s - port %d", __func__, port->number); + /* Standard shutdown processing */ tty_shutdown(tty);