* Licensed under the GPL
*/
-#include "linux/config.h"
#include "linux/fs.h"
#include "linux/tty.h"
#include "linux/tty_driver.h"
#include "init.h"
#include "irq_user.h"
#include "mconsole_kern.h"
-#include "2_5compat.h"
-static int ssl_version = 1;
+static const int ssl_version = 1;
/* Referenced only by tty_driver below - presumably it's locked correctly
* by the tty driver.
#define NR_PORTS 64
-void ssl_announce(char *dev_name, int dev)
+static void ssl_announce(char *dev_name, int dev)
{
printk(KERN_INFO "Serial line %d assigned device '%s'\n", dev,
dev_name);
static int ssl_config(char *str);
static int ssl_get_config(char *dev, char *str, int size, char **error_out);
-static int ssl_remove(char *str);
+static int ssl_remove(int n);
static struct line_driver driver = {
.name = "UML serial line",
- .device_name = "ttS",
- .devfs_name = "tts/",
+ .device_name = "ttyS",
.major = TTY_MAJOR,
.minor_start = 64,
.type = TTY_DRIVER_TYPE_SERIAL,
.name = "ssl",
.config = ssl_config,
.get_config = ssl_get_config,
+ .id = line_id,
.remove = ssl_remove,
},
};
static int ssl_config(char *str)
{
- return(line_config(serial_lines,
- sizeof(serial_lines)/sizeof(serial_lines[0]), str));
+ return line_config(serial_lines, ARRAY_SIZE(serial_lines), str, &opts);
}
static int ssl_get_config(char *dev, char *str, int size, char **error_out)
{
- return(line_get_config(dev, serial_lines,
- sizeof(serial_lines)/sizeof(serial_lines[0]),
- str, size, error_out));
+ return line_get_config(dev, serial_lines, ARRAY_SIZE(serial_lines), str,
+ size, error_out);
}
-static int ssl_remove(char *str)
+static int ssl_remove(int n)
{
- return(line_remove(serial_lines,
- sizeof(serial_lines)/sizeof(serial_lines[0]), str));
+ return line_remove(serial_lines, ARRAY_SIZE(serial_lines), n);
}
-int ssl_open(struct tty_struct *tty, struct file *filp)
+static int ssl_open(struct tty_struct *tty, struct file *filp)
{
- return(line_open(serial_lines, tty, &opts));
-}
-
-static void ssl_close(struct tty_struct *tty, struct file * filp)
-{
- line_close(serial_lines, tty);
-}
-
-static int ssl_write(struct tty_struct * tty, int from_user,
- const unsigned char *buf, int count)
-{
- return(line_write(serial_lines, tty, from_user, buf, count));
-}
-
-static void ssl_put_char(struct tty_struct *tty, unsigned char ch)
-{
- line_write(serial_lines, tty, 0, &ch, sizeof(ch));
-}
-
-static void ssl_flush_chars(struct tty_struct *tty)
-{
- return;
-}
-
-static int ssl_chars_in_buffer(struct tty_struct *tty)
-{
- return(0);
+ return line_open(serial_lines, tty);
}
+#if 0
static void ssl_flush_buffer(struct tty_struct *tty)
{
return;
}
-static int ssl_ioctl(struct tty_struct *tty, struct file * file,
- unsigned int cmd, unsigned long arg)
-{
- int ret;
-
- ret = 0;
- switch(cmd){
- case TCGETS:
- case TCSETS:
- case TCFLSH:
- case TCSETSF:
- case TCSETSW:
- case TCGETA:
- case TIOCMGET:
- case TCSBRK:
- case TCSBRKP:
- case TIOCMSET:
- ret = -ENOIOCTLCMD;
- break;
- default:
- printk(KERN_ERR
- "Unimplemented ioctl in ssl_ioctl : 0x%x\n", cmd);
- ret = -ENOIOCTLCMD;
- break;
- }
- return(ret);
-}
-
-static void ssl_throttle(struct tty_struct * tty)
-{
- printk(KERN_ERR "Someone should implement ssl_throttle\n");
-}
-
-static void ssl_unthrottle(struct tty_struct * tty)
-{
- printk(KERN_ERR "Someone should implement ssl_unthrottle\n");
-}
-
-static void ssl_set_termios(struct tty_struct *tty,
- struct termios *old_termios)
-{
-}
-
static void ssl_stop(struct tty_struct *tty)
{
printk(KERN_ERR "Someone should implement ssl_stop\n");
void ssl_hangup(struct tty_struct *tty)
{
}
+#endif
-static struct tty_operations ssl_ops = {
+static const struct tty_operations ssl_ops = {
.open = ssl_open,
- .close = ssl_close,
- .write = ssl_write,
- .put_char = ssl_put_char,
- .flush_chars = ssl_flush_chars,
- .chars_in_buffer = ssl_chars_in_buffer,
- .flush_buffer = ssl_flush_buffer,
- .ioctl = ssl_ioctl,
- .throttle = ssl_throttle,
- .unthrottle = ssl_unthrottle,
- .set_termios = ssl_set_termios,
+ .close = line_close,
+ .write = line_write,
+ .put_char = line_put_char,
+ .write_room = line_write_room,
+ .chars_in_buffer = line_chars_in_buffer,
+ .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,
- .write_room = line_write_room,
+#endif
};
/* Changed by ssl_init and referenced by ssl_exit, which are both serialized
*/
static int ssl_init_done = 0;
-static void ssl_console_write(struct console *c, const char *string,
+static void ssl_console_write(struct console *c, const char *string,
unsigned len)
{
struct line *line = &serial_lines[c->index];
- if(ssl_init_done)
- down(&line->sem);
+ unsigned long flags;
+
+ spin_lock_irqsave(&line->lock, flags);
console_write_chan(&line->chan_list, string, len);
- if(ssl_init_done)
- up(&line->sem);
+ spin_unlock_irqrestore(&line->lock, flags);
}
static struct tty_driver *ssl_console_device(struct console *c, int *index)
static int ssl_console_setup(struct console *co, char *options)
{
- return(0);
+ struct line *line = &serial_lines[co->index];
+
+ return console_open_chan(line, co, &opts);
}
static struct console ssl_cons = {
- name: "ttyS",
- write: ssl_console_write,
- device: ssl_console_device,
- setup: ssl_console_setup,
- flags: CON_PRINTBUFFER,
- index: -1,
+ .name = "ttyS",
+ .write = ssl_console_write,
+ .device = ssl_console_device,
+ .setup = ssl_console_setup,
+ .flags = CON_PRINTBUFFER,
+ .index = -1,
};
-int ssl_init(void)
+static int ssl_init(void)
{
char *new_title;
- printk(KERN_INFO "Initializing software serial port version %d\n",
+ printk(KERN_INFO "Initializing software serial port version %d\n",
ssl_version);
-
ssl_driver = line_register_devfs(&lines, &driver, &ssl_ops,
- serial_lines, sizeof(serial_lines)/sizeof(serial_lines[0]));
+ serial_lines,
+ ARRAY_SIZE(serial_lines));
- lines_init(serial_lines, sizeof(serial_lines)/sizeof(serial_lines[0]));
+ lines_init(serial_lines, ARRAY_SIZE(serial_lines), &opts);
new_title = add_xterm_umid(opts.xterm_title);
- if(new_title != NULL) opts.xterm_title = new_title;
+ if (new_title != NULL)
+ opts.xterm_title = new_title;
- register_console(&ssl_cons);
ssl_init_done = 1;
- return(0);
+ register_console(&ssl_cons);
+ return 0;
}
-
late_initcall(ssl_init);
-static int ssl_chan_setup(char *str)
+static void ssl_exit(void)
{
- return(line_setup(serial_lines,
- sizeof(serial_lines)/sizeof(serial_lines[0]),
- str, 1));
+ if (!ssl_init_done)
+ return;
+ close_lines(serial_lines, ARRAY_SIZE(serial_lines));
}
+__uml_exitcall(ssl_exit);
-__setup("ssl", ssl_chan_setup);
-__channel_help(ssl_chan_setup, "ssl");
-
-static void ssl_exit(void)
+static int ssl_chan_setup(char *str)
{
- if(!ssl_init_done) return;
- close_lines(serial_lines,
- sizeof(serial_lines)/sizeof(serial_lines[0]));
+ return line_setup(serial_lines, ARRAY_SIZE(serial_lines), str);
}
-__uml_exitcall(ssl_exit);
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only. This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */
+__setup("ssl", ssl_chan_setup);
+__channel_help(ssl_chan_setup, "ssl");