aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/console.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/serial/console.c')
-rw-r--r--drivers/usb/serial/console.c82
1 files changed, 48 insertions, 34 deletions
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c
index 04007c31d88d..66ce30c1b75b 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)
64 struct usb_serial *serial; 64 struct usb_serial *serial;
65 struct usb_serial_port *port; 65 struct usb_serial_port *port;
66 int retval = 0; 66 int retval = 0;
67 struct tty_struct *tty; 67 struct tty_struct *tty = NULL;
68 struct ktermios *termios; 68 struct ktermios *termios = NULL, dummy;
69 69
70 dbg ("%s", __FUNCTION__); 70 dbg ("%s", __FUNCTION__);
71 71
@@ -151,50 +151,64 @@ static int usb_console_setup(struct console *co, char *options)
151 151
152 ++port->open_count; 152 ++port->open_count;
153 if (port->open_count == 1) { 153 if (port->open_count == 1) {
154 if (serial->type->set_termios) {
155 /*
156 * allocate a fake tty so the driver can initialize
157 * the termios structure, then later call set_termios to
158 * configure according to command line arguments
159 */
160 tty = kzalloc(sizeof(*tty), GFP_KERNEL);
161 if (!tty) {
162 retval = -ENOMEM;
163 err("no more memory");
164 goto reset_open_count;
165 }
166 termios = kzalloc(sizeof(*termios), GFP_KERNEL);
167 if (!termios) {
168 retval = -ENOMEM;
169 err("no more memory");
170 goto free_tty;
171 }
172 memset(&dummy, 0, sizeof(struct ktermios));
173 tty->termios = termios;
174 port->tty = tty;
175 }
176
154 /* only call the device specific open if this 177 /* only call the device specific open if this
155 * is the first time the port is opened */ 178 * is the first time the port is opened */
156 if (serial->type->open) 179 if (serial->type->open)
157 retval = serial->type->open(port, NULL); 180 retval = serial->type->open(port, NULL);
158 else 181 else
159 retval = usb_serial_generic_open(port, NULL); 182 retval = usb_serial_generic_open(port, NULL);
160 if (retval)
161 port->open_count = 0;
162 }
163 183
164 if (retval) { 184 if (retval) {
165 err ("could not open USB console port"); 185 err("could not open USB console port");
166 return retval; 186 goto free_termios;
167 }
168
169 if (serial->type->set_termios) {
170 struct ktermios dummy;
171 /* build up a fake tty structure so that the open call has something
172 * to look at to get the cflag value */
173 tty = kzalloc(sizeof(*tty), GFP_KERNEL);
174 if (!tty) {
175 err ("no more memory");
176 return -ENOMEM;
177 } 187 }
178 termios = kzalloc(sizeof(*termios), GFP_KERNEL);
179 if (!termios) {
180 err ("no more memory");
181 kfree (tty);
182 return -ENOMEM;
183 }
184 memset(&dummy, 0, sizeof(struct ktermios));
185 termios->c_cflag = cflag;
186 tty->termios = termios;
187 port->tty = tty;
188 188
189 /* set up the initial termios settings */ 189 if (serial->type->set_termios) {
190 serial->type->set_termios(port, &dummy); 190 termios->c_cflag = cflag;
191 port->tty = NULL; 191 serial->type->set_termios(port, &dummy);
192 kfree (termios); 192
193 kfree (tty); 193 port->tty = NULL;
194 kfree(termios);
195 kfree(tty);
196 }
194 } 197 }
198
195 port->console = 1; 199 port->console = 1;
200 retval = 0;
196 201
197 return 0; 202out:
203 return retval;
204free_termios:
205 kfree(termios);
206 port->tty = NULL;
207free_tty:
208 kfree(tty);
209reset_open_count:
210 port->open_count = 0;
211goto out;
198} 212}
199 213
200static void usb_console_write(struct console *co, const char *buf, unsigned count) 214static void usb_console_write(struct console *co, const char *buf, unsigned count)