Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=c87d6a4f67657f4f1b992eea43796c7e7c09fb17
Commit:     c87d6a4f67657f4f1b992eea43796c7e7c09fb17
Parent:     9a6b1efa6fd1ee022fdf42c91a9868c589cc95b7
Author:     Aristeu Rozanski <[EMAIL PROTECTED]>
AuthorDate: Tue Nov 13 17:22:07 2007 -0500
Committer:  Greg Kroah-Hartman <[EMAIL PROTECTED]>
CommitDate: Fri Feb 1 14:34:50 2008 -0800

    USB: usb_serial_console: allocate fake tty and termios before calling 
driver open() method
    
    The usb serial method set_termios() is called for the first time from
    open() method in order to set up the termios structure with the default
    device's settings, ignoring the current settings. Once it's initialized,
    the next set_termios() calls will update the device with the
    tty->termios settings.
    Currently USB serial console code calls the driver open() method without
    a tty and after that will allocate a fake tty and termios so the command
    line arguments can be applied to the device
    (console=ttyUSB0,115200,...). This makes the driver overwrite the
    termios with the default settings and not applying the command line
    options.
    
    This patch changes usb_console_setup() to allocate the fake tty and
    termios before the open() method is called.
    
    Tested successfully with a pl2303
    
    Signed-off-by: Aristeu Rozanski <[EMAIL PROTECTED]>
    Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
 drivers/usb/serial/console.c |   82 ++++++++++++++++++++++++-----------------
 1 files changed, 48 insertions(+), 34 deletions(-)

diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c
index 04007c3..66ce30c 100644
--- a/drivers/usb/serial/console.c
+++ b/drivers/usb/serial/console.c
@@ -64,8 +64,8 @@ static int usb_console_setup(struct console *co, char 
*options)
        struct usb_serial *serial;
        struct usb_serial_port *port;
        int retval = 0;
-       struct tty_struct *tty;
-       struct ktermios *termios;
+       struct tty_struct *tty = NULL;
+       struct ktermios *termios = NULL, dummy;
 
        dbg ("%s", __FUNCTION__);
 
@@ -151,50 +151,64 @@ static int usb_console_setup(struct console *co, char 
*options)
         
        ++port->open_count;
        if (port->open_count == 1) {
+               if (serial->type->set_termios) {
+                       /*
+                        * allocate a fake tty so the driver can initialize
+                        * the termios structure, then later call set_termios to
+                        * configure according to command line arguments
+                        */
+                       tty = kzalloc(sizeof(*tty), GFP_KERNEL);
+                       if (!tty) {
+                               retval = -ENOMEM;
+                               err("no more memory");
+                               goto reset_open_count;
+                       }
+                       termios = kzalloc(sizeof(*termios), GFP_KERNEL);
+                       if (!termios) {
+                               retval = -ENOMEM;
+                               err("no more memory");
+                               goto free_tty;
+                       }
+                       memset(&dummy, 0, sizeof(struct ktermios));
+                       tty->termios = termios;
+                       port->tty = tty;
+               }
+
                /* only call the device specific open if this 
                 * is the first time the port is opened */
                if (serial->type->open)
                        retval = serial->type->open(port, NULL);
                else
                        retval = usb_serial_generic_open(port, NULL);
-               if (retval)
-                       port->open_count = 0;
-       }
 
-       if (retval) {
-               err ("could not open USB console port");
-               return retval;
-       }
-
-       if (serial->type->set_termios) {
-               struct ktermios dummy;
-               /* build up a fake tty structure so that the open call has 
something
-                * to look at to get the cflag value */
-               tty = kzalloc(sizeof(*tty), GFP_KERNEL);
-               if (!tty) {
-                       err ("no more memory");
-                       return -ENOMEM;
+               if (retval) {
+                       err("could not open USB console port");
+                       goto free_termios;
                }
-               termios = kzalloc(sizeof(*termios), GFP_KERNEL);
-               if (!termios) {
-                       err ("no more memory");
-                       kfree (tty);
-                       return -ENOMEM;
-               }
-               memset(&dummy, 0, sizeof(struct ktermios));
-               termios->c_cflag = cflag;
-               tty->termios = termios;
-               port->tty = tty;
 
-               /* set up the initial termios settings */
-               serial->type->set_termios(port, &dummy);
-               port->tty = NULL;
-               kfree (termios);
-               kfree (tty);
+               if (serial->type->set_termios) {
+                       termios->c_cflag = cflag;
+                       serial->type->set_termios(port, &dummy);
+
+                       port->tty = NULL;
+                       kfree(termios);
+                       kfree(tty);
+               }
        }
+
        port->console = 1;
+       retval = 0;
 
-       return 0;
+out:
+       return retval;
+free_termios:
+       kfree(termios);
+       port->tty = NULL;
+free_tty:
+       kfree(tty);
+reset_open_count:
+       port->open_count = 0;
+goto out;
 }
 
 static void usb_console_write(struct console *co, const char *buf, unsigned 
count)
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to