aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/virtio_console.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/virtio_console.c')
-rw-r--r--drivers/char/virtio_console.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c
index 2f4f0b23ea00..b70fe96c1ccd 100644
--- a/drivers/char/virtio_console.c
+++ b/drivers/char/virtio_console.c
@@ -48,6 +48,9 @@ struct ports_driver_data {
48 /* Used for exporting per-port information to debugfs */ 48 /* Used for exporting per-port information to debugfs */
49 struct dentry *debugfs_dir; 49 struct dentry *debugfs_dir;
50 50
51 /* List of all the devices we're handling */
52 struct list_head portdevs;
53
51 /* Number of devices this driver is handling */ 54 /* Number of devices this driver is handling */
52 unsigned int index; 55 unsigned int index;
53 56
@@ -108,6 +111,9 @@ struct port_buffer {
108 * ports for that device (vdev->priv). 111 * ports for that device (vdev->priv).
109 */ 112 */
110struct ports_device { 113struct ports_device {
114 /* Next portdev in the list, head is in the pdrvdata struct */
115 struct list_head list;
116
111 /* 117 /*
112 * Workqueue handlers where we process deferred work after 118 * Workqueue handlers where we process deferred work after
113 * notification 119 * notification
@@ -1599,6 +1605,10 @@ static int __devinit virtcons_probe(struct virtio_device *vdev)
1599 add_port(portdev, 0); 1605 add_port(portdev, 0);
1600 } 1606 }
1601 1607
1608 spin_lock_irq(&pdrvdata_lock);
1609 list_add_tail(&portdev->list, &pdrvdata.portdevs);
1610 spin_unlock_irq(&pdrvdata_lock);
1611
1602 __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID, 1612 __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID,
1603 VIRTIO_CONSOLE_DEVICE_READY, 1); 1613 VIRTIO_CONSOLE_DEVICE_READY, 1);
1604 return 0; 1614 return 0;
@@ -1625,6 +1635,10 @@ static void virtcons_remove(struct virtio_device *vdev)
1625 1635
1626 portdev = vdev->priv; 1636 portdev = vdev->priv;
1627 1637
1638 spin_lock_irq(&pdrvdata_lock);
1639 list_del(&portdev->list);
1640 spin_unlock_irq(&pdrvdata_lock);
1641
1628 /* Disable interrupts for vqs */ 1642 /* Disable interrupts for vqs */
1629 vdev->config->reset(vdev); 1643 vdev->config->reset(vdev);
1630 /* Finish up work that's lined up */ 1644 /* Finish up work that's lined up */
@@ -1691,6 +1705,7 @@ static int __init init(void)
1691 PTR_ERR(pdrvdata.debugfs_dir)); 1705 PTR_ERR(pdrvdata.debugfs_dir));
1692 } 1706 }
1693 INIT_LIST_HEAD(&pdrvdata.consoles); 1707 INIT_LIST_HEAD(&pdrvdata.consoles);
1708 INIT_LIST_HEAD(&pdrvdata.portdevs);
1694 1709
1695 return register_virtio_driver(&virtio_console); 1710 return register_virtio_driver(&virtio_console);
1696} 1711}