diff options
Diffstat (limited to 'arch/um/drivers/ssl.c')
| -rw-r--r-- | arch/um/drivers/ssl.c | 108 | 
1 files changed, 38 insertions, 70 deletions
diff --git a/arch/um/drivers/ssl.c b/arch/um/drivers/ssl.c index f1786e64607..b8d14fa5205 100644 --- a/arch/um/drivers/ssl.c +++ b/arch/um/drivers/ssl.c @@ -3,31 +3,23 @@   * Licensed under the GPL   */ -#include "linux/fs.h" -#include "linux/tty.h" -#include "linux/tty_driver.h" -#include "linux/major.h" -#include "linux/mm.h" -#include "linux/init.h" -#include "linux/console.h" -#include "asm/termbits.h" -#include "asm/irq.h" -#include "line.h" +#include <linux/fs.h> +#include <linux/tty.h> +#include <linux/tty_driver.h> +#include <linux/major.h> +#include <linux/mm.h> +#include <linux/init.h> +#include <linux/console.h> +#include <asm/termbits.h> +#include <asm/irq.h>  #include "ssl.h" -#include "chan_kern.h" -#include "kern.h" -#include "init.h" -#include "irq_user.h" +#include "chan.h" +#include <init.h> +#include <irq_user.h>  #include "mconsole_kern.h"  static const int ssl_version = 1; -/* Referenced only by tty_driver below - presumably it's locked correctly - * by the tty driver. - */ - -static struct tty_driver *ssl_driver; -  #define NR_PORTS 64  static void ssl_announce(char *dev_name, int dev) @@ -73,8 +65,9 @@ static struct line_driver driver = {  /* The array is initialized by line_init, at initcall time.  The   * elements are locked individually as needed.   */ -static struct line serial_lines[NR_PORTS] = -	{ [0 ... NR_PORTS - 1] = LINE_INIT(CONFIG_SSL_CHAN, &driver) }; +static char *conf[NR_PORTS]; +static char *def_conf = CONFIG_SSL_CHAN; +static struct line serial_lines[NR_PORTS];  static int ssl_config(char *str, char **error_out)  { @@ -94,40 +87,13 @@ static int ssl_remove(int n, char **error_out)  			   error_out);  } -static int ssl_open(struct tty_struct *tty, struct file *filp) -{ -	int err = line_open(serial_lines, tty); - -	if (err) -		printk(KERN_ERR "Failed to open serial line %d, err = %d\n", -		       tty->index, err); - -	return err; -} - -#if 0 -static void ssl_flush_buffer(struct tty_struct *tty) -{ -	return; -} - -static void ssl_stop(struct tty_struct *tty) -{ -	printk(KERN_ERR "Someone should implement ssl_stop\n"); -} - -static void ssl_start(struct tty_struct *tty) +static int ssl_install(struct tty_driver *driver, struct tty_struct *tty)  { -	printk(KERN_ERR "Someone should implement ssl_start\n"); +	return line_install(driver, tty, &serial_lines[tty->index]);  } -void ssl_hangup(struct tty_struct *tty) -{ -} -#endif -  static const struct tty_operations ssl_ops = { -	.open 	 		= ssl_open, +	.open 	 		= line_open,  	.close 	 		= line_close,  	.write 	 		= line_write,  	.put_char 		= line_put_char, @@ -136,14 +102,10 @@ static const struct tty_operations ssl_ops = {  	.flush_buffer 		= line_flush_buffer,  	.flush_chars 		= line_flush_chars,  	.set_termios 		= line_set_termios, -	.ioctl 	 		= line_ioctl,  	.throttle 		= line_throttle,  	.unthrottle 		= line_unthrottle, -#if 0 -	.stop 	 		= ssl_stop, -	.start 	 		= ssl_start, -	.hangup 	 	= ssl_hangup, -#endif +	.install		= ssl_install, +	.hangup			= line_hangup,  };  /* Changed by ssl_init and referenced by ssl_exit, which are both serialized @@ -158,14 +120,14 @@ static void ssl_console_write(struct console *c, const char *string,  	unsigned long flags;  	spin_lock_irqsave(&line->lock, flags); -	console_write_chan(&line->chan_list, string, len); +	console_write_chan(line->chan_out, string, len);  	spin_unlock_irqrestore(&line->lock, flags);  }  static struct tty_driver *ssl_console_device(struct console *c, int *index)  {  	*index = c->index; -	return ssl_driver; +	return driver.driver;  }  static int ssl_console_setup(struct console *co, char *options) @@ -188,17 +150,30 @@ static struct console ssl_cons = {  static int ssl_init(void)  {  	char *new_title; +	int err; +	int i;  	printk(KERN_INFO "Initializing software serial port version %d\n",  	       ssl_version); -	ssl_driver = register_lines(&driver, &ssl_ops, serial_lines, + +	err = register_lines(&driver, &ssl_ops, serial_lines,  				    ARRAY_SIZE(serial_lines)); +	if (err) +		return err;  	new_title = add_xterm_umid(opts.xterm_title);  	if (new_title != NULL)  		opts.xterm_title = new_title; -	lines_init(serial_lines, ARRAY_SIZE(serial_lines), &opts); +	for (i = 0; i < NR_PORTS; i++) { +		char *error; +		char *s = conf[i]; +		if (!s) +			s = def_conf; +		if (setup_one_line(serial_lines, i, s, &opts, &error)) +			printk(KERN_ERR "setup_one_line failed for " +			       "device %d : %s\n", i, error); +	}  	ssl_init_done = 1;  	register_console(&ssl_cons); @@ -216,14 +191,7 @@ __uml_exitcall(ssl_exit);  static int ssl_chan_setup(char *str)  { -	char *error; -	int ret; - -	ret = line_setup(serial_lines, ARRAY_SIZE(serial_lines), str, &error); -	if(ret < 0) -		printk(KERN_ERR "Failed to set up serial line with " -		       "configuration string \"%s\" : %s\n", str, error); - +	line_setup(conf, NR_PORTS, &def_conf, str, "serial line");  	return 1;  }  | 
