summaryrefslogtreecommitdiff
path: root/drivers/char
diff options
context:
space:
mode:
authorAmit Shah <amit.shah@redhat.com>2010-01-18 16:45:09 +0300
committerRusty Russell <rusty@rustcorp.com.au>2010-02-24 06:52:47 +0300
commit4f23c573c0dbebfd193cfb90b003d67929c58b31 (patch)
treee7ba84a7ecbff8f8d837e47375de17ef82210084 /drivers/char
parentcb06e3676b22013e9b759627e41656ddb07dee6d (diff)
downloadlinux-4f23c573c0dbebfd193cfb90b003d67929c58b31.tar.xz
virtio: console: Separate out console-specific data into a separate struct
Move out console-specific stuff into a separate struct from 'struct port' as we need to maintain two lists: one for all the ports (which includes consoles) and one only for consoles since the hvc callbacks only give us the vtermno. This makes console handling cleaner. 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.c57
1 files changed, 37 insertions, 20 deletions
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index debc86542858..c6c6f52043b5 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -51,6 +51,24 @@ static struct ports_driver_data pdrvdata;
DEFINE_SPINLOCK(pdrvdata_lock);
+/* This struct holds information that's relevant only for console ports */
+struct console {
+ /* We'll place all consoles in a list in the pdrvdata struct */
+ struct list_head list;
+
+ /* The hvc device associated with this console port */
+ struct hvc_struct *hvc;
+
+ /*
+ * This number identifies the number that we used to register
+ * with hvc in hvc_instantiate() and hvc_alloc(); this is the
+ * number passed on by the hvc callbacks to us to
+ * differentiate between the other console ports handled by
+ * this driver
+ */
+ u32 vtermno;
+};
+
/*
* This is a per-device struct that stores data common to all the
* ports for that device (vdev->priv).
@@ -83,15 +101,11 @@ struct port {
/* The IO vqs for this port */
struct virtqueue *in_vq, *out_vq;
- /* For console ports, hvc != NULL and these are valid. */
- /* The hvc device */
- struct hvc_struct *hvc;
-
- /* We'll place all consoles in a list in the pdrvdata struct */
- struct list_head list;
-
- /* Our vterm number. */
- u32 vtermno;
+ /*
+ * The entries in this struct will be valid if this port is
+ * hooked up to an hvc console
+ */
+ struct console cons;
};
/* This is the very early arch-specified put chars function. */
@@ -100,12 +114,15 @@ static int (*early_put_chars)(u32, const char *, int);
static struct port *find_port_by_vtermno(u32 vtermno)
{
struct port *port;
+ struct console *cons;
unsigned long flags;
spin_lock_irqsave(&pdrvdata_lock, flags);
- list_for_each_entry(port, &pdrvdata.consoles, list) {
- if (port->vtermno == vtermno)
+ list_for_each_entry(cons, &pdrvdata.consoles, list) {
+ if (cons->vtermno == vtermno) {
+ port = container_of(cons, struct port, cons);
goto out;
+ }
}
port = NULL;
out:
@@ -264,7 +281,7 @@ static void resize_console(struct port *port)
vdev->config->get(vdev,
offsetof(struct virtio_console_config, rows),
&ws.ws_row, sizeof(u16));
- hvc_resize(port->hvc, ws);
+ hvc_resize(port->cons.hvc, ws);
}
}
@@ -295,11 +312,11 @@ static void notifier_del_vio(struct hvc_struct *hp, int data)
static void hvc_handle_input(struct virtqueue *vq)
{
- struct port *port;
+ struct console *cons;
bool activity = false;
- list_for_each_entry(port, &pdrvdata.consoles, list)
- activity |= hvc_poll(port->hvc);
+ list_for_each_entry(cons, &pdrvdata.consoles, list)
+ activity |= hvc_poll(cons->hvc);
if (activity)
hvc_kick();
@@ -361,17 +378,17 @@ static int __devinit add_port(struct ports_device *portdev)
* pointers. The final argument is the output buffer size: we
* can do any size, so we put PAGE_SIZE here.
*/
- port->vtermno = pdrvdata.next_vtermno;
- port->hvc = hvc_alloc(port->vtermno, 0, &hv_ops, PAGE_SIZE);
- if (IS_ERR(port->hvc)) {
- err = PTR_ERR(port->hvc);
+ 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);
goto free_inbuf;
}
/* Add to vtermno list. */
spin_lock_irq(&pdrvdata_lock);
pdrvdata.next_vtermno++;
- list_add(&port->list, &pdrvdata.consoles);
+ list_add(&port->cons.list, &pdrvdata.consoles);
spin_unlock_irq(&pdrvdata_lock);
/* Register the input buffer the first time. */