#include "init.h"
#include "irq_user.h"
#include "mconsole_kern.h"
+#include "2_5compat.h"
static int ssl_version = 1;
static struct line_driver driver = {
.name = "UML serial line",
- .device_name = "ttyS",
+ .device_name = "ttS",
.devfs_name = "tts/",
.major = TTY_MAJOR,
.minor_start = 64,
int ssl_open(struct tty_struct *tty, struct file *filp)
{
- return line_open(serial_lines, tty, &opts);
+ 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,
+ const unsigned char *buf, int count)
+{
+ return(line_write(serial_lines, tty, buf, count));
+}
+
+static void ssl_put_char(struct tty_struct *tty, unsigned char ch)
+{
+ line_write(serial_lines, tty, &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);
}
-#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");
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 = {
.open = ssl_open,
- .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,
-#if 0
+ .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,
.stop = ssl_stop,
.start = ssl_start,
.hangup = ssl_hangup,
-#endif
+ .write_room = line_write_room,
};
/* Changed by ssl_init and referenced by ssl_exit, which are both serialized
unsigned len)
{
struct line *line = &serial_lines[c->index];
- unsigned long flags;
-
- spin_lock_irqsave(&line->lock, flags);
+ if(ssl_init_done)
+ down(&line->sem);
console_write_chan(&line->chan_list, string, len);
- spin_unlock_irqrestore(&line->lock, flags);
+ if(ssl_init_done)
+ up(&line->sem);
}
static struct tty_driver *ssl_console_device(struct console *c, int *index)
static int ssl_console_setup(struct console *co, char *options)
{
- struct line *line = &serial_lines[co->index];
-
- return console_open_chan(line,co,&opts);
+ return(0);
}
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)
printk(KERN_INFO "Initializing software serial port version %d\n",
ssl_version);
+
ssl_driver = line_register_devfs(&lines, &driver, &ssl_ops,
- serial_lines, ARRAY_SIZE(serial_lines));
+ serial_lines, sizeof(serial_lines)/sizeof(serial_lines[0]));
lines_init(serial_lines, sizeof(serial_lines)/sizeof(serial_lines[0]));
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;
- ssl_init_done = 1;
register_console(&ssl_cons);
+ ssl_init_done = 1;
return(0);
}
-late_initcall(ssl_init);
-static void ssl_exit(void)
-{
- if (!ssl_init_done)
- return;
- close_lines(serial_lines,
- sizeof(serial_lines)/sizeof(serial_lines[0]));
-}
-__uml_exitcall(ssl_exit);
+late_initcall(ssl_init);
static int ssl_chan_setup(char *str)
{
__setup("ssl", ssl_chan_setup);
__channel_help(ssl_chan_setup, "ssl");
+
+static void ssl_exit(void)
+{
+ if(!ssl_init_done) return;
+ close_lines(serial_lines,
+ sizeof(serial_lines)/sizeof(serial_lines[0]));
+}
+
+__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:
+ */