diff options
author | Amit Shah <amit.shah@redhat.com> | 2010-01-18 19:15:10 +0530 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2010-02-24 14:22:48 +1030 |
commit | cfa6d3792550c9eac51887181358954e6515da6b (patch) | |
tree | 2ee0ee37ad3289f57c082a3cba496898089ff1c2 /drivers/char | |
parent | 4f23c573c0dbebfd193cfb90b003d67929c58b31 (diff) | |
download | op-kernel-dev-cfa6d3792550c9eac51887181358954e6515da6b.zip op-kernel-dev-cfa6d3792550c9eac51887181358954e6515da6b.tar.gz |
virtio: console: Separate out console init into a new function
Console ports could be hot-added. Also, with the new multiport support,
a port is identified as a console port only if the host sends a control
message.
Move the console port init into a separate function so it can be invoked
from other places.
Signed-off-by: Amit Shah <amit.shah@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/virtio_console.c | 61 |
1 files changed, 39 insertions, 22 deletions
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index c6c6f52..11e5faf 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c @@ -346,6 +346,43 @@ int __init virtio_cons_early_init(int (*put_chars)(u32, const char *, int)) return hvc_instantiate(0, 0, &hv_ops); } +int __devinit init_port_console(struct port *port) +{ + int ret; + + /* + * The Host's telling us this port is a console port. Hook it + * up with an hvc console. + * + * To set up and manage our virtual console, we call + * hvc_alloc(). + * + * The first argument of hvc_alloc() is the virtual console + * number. The second argument is the parameter for the + * notification mechanism (like irq number). We currently + * leave this as zero, virtqueues have implicit notifications. + * + * The third argument is a "struct hv_ops" containing the + * put_chars() get_chars(), notifier_add() and notifier_del() + * pointers. The final argument is the output buffer size: we + * can do any size, so we put PAGE_SIZE here. + */ + port->cons.vtermno = pdrvdata.next_vtermno; + + port->cons.hvc = hvc_alloc(port->cons.vtermno, 0, &hv_ops, PAGE_SIZE); + if (IS_ERR(port->cons.hvc)) { + ret = PTR_ERR(port->cons.hvc); + port->cons.hvc = NULL; + return ret; + } + spin_lock_irq(&pdrvdata_lock); + pdrvdata.next_vtermno++; + list_add_tail(&port->cons.list, &pdrvdata.consoles); + spin_unlock_irq(&pdrvdata_lock); + + return 0; +} + static int __devinit add_port(struct ports_device *portdev) { struct port *port; @@ -367,29 +404,9 @@ static int __devinit add_port(struct ports_device *portdev) goto free_port; } - /* - * The first argument of hvc_alloc() is the virtual console - * number. The second argument is the parameter for the - * notification mechanism (like irq number). We currently - * leave this as zero, virtqueues have implicit notifications. - * - * The third argument is a "struct hv_ops" containing the - * put_chars(), get_chars(), notifier_add() and notifier_del() - * pointers. The final argument is the output buffer size: we - * can do any size, so we put PAGE_SIZE here. - */ - port->cons.vtermno = pdrvdata.next_vtermno; - port->cons.hvc = hvc_alloc(port->cons.vtermno, 0, &hv_ops, PAGE_SIZE); - if (IS_ERR(port->cons.hvc)) { - err = PTR_ERR(port->cons.hvc); + err = init_port_console(port); + if (err) goto free_inbuf; - } - - /* Add to vtermno list. */ - spin_lock_irq(&pdrvdata_lock); - pdrvdata.next_vtermno++; - list_add(&port->cons.list, &pdrvdata.consoles); - spin_unlock_irq(&pdrvdata_lock); /* Register the input buffer the first time. */ add_inbuf(port->in_vq, port->inbuf); |