tty_port,usb-console: Fix usb serial console open/close regression

Commit e1108a63e10d344284011cccc06328b2cd3e5da3 ("usb_serial: Use the
shutdown() operation") breaks the ability to use a usb console
starting in 2.6.33. This was observed when using
console=ttyUSB0,115200 as a boot argument with an FTDI device. The
error is:

ftdi_sio ttyUSB0: ftdi_submit_read_urb - failed submitting read urb, error -22

The handling of the ASYNCB_INITIALIZED changed in 2.6.32 such that in
tty_port_shutdown() it always clears the flag if it is set. The fix
is to add a variable to the tty_port struct to indicate when the tty
port is a console.

CC: Alan Cox <alan@linux.intel.com>
CC: Alan Stern <stern@rowland.harvard.edu>
CC: Oliver Neukum <oliver@neukum.org>
CC: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by Jason Wessel and committed by Greg Kroah-Hartman 336cee42 23144366

+3 -1
+1 -1
drivers/char/tty_port.c
··· 119 119 static void tty_port_shutdown(struct tty_port *port) 120 120 { 121 121 mutex_lock(&port->mutex); 122 - if (port->ops->shutdown && 122 + if (port->ops->shutdown && !port->console && 123 123 test_and_clear_bit(ASYNCB_INITIALIZED, &port->flags)) 124 124 port->ops->shutdown(port); 125 125 mutex_unlock(&port->mutex);
+1
drivers/usb/serial/console.c
··· 181 181 /* The console is special in terms of closing the device so 182 182 * indicate this port is now acting as a system console. */ 183 183 port->console = 1; 184 + port->port.console = 1; 184 185 185 186 mutex_unlock(&serial->disc_mutex); 186 187 return retval;
+1
include/linux/tty.h
··· 224 224 wait_queue_head_t close_wait; /* Close waiters */ 225 225 wait_queue_head_t delta_msr_wait; /* Modem status change */ 226 226 unsigned long flags; /* TTY flags ASY_*/ 227 + unsigned char console:1; /* port is a console */ 227 228 struct mutex mutex; /* Locking */ 228 229 struct mutex buf_mutex; /* Buffer alloc lock */ 229 230 unsigned char *xmit_buf; /* Optional buffer */