diff options
| -rw-r--r-- | drivers/char/virtio_console.c | 43 | 
1 files changed, 31 insertions, 12 deletions
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 1e3f4674da4a..f1fe11a344e9 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c  | |||
| @@ -78,6 +78,9 @@ struct console { | |||
| 78 | /* The hvc device associated with this console port */ | 78 | /* The hvc device associated with this console port */ | 
| 79 | struct hvc_struct *hvc; | 79 | struct hvc_struct *hvc; | 
| 80 | 80 | ||
| 81 | /* The size of the console */ | ||
| 82 | struct winsize ws; | ||
| 83 | |||
| 81 | /* | 84 | /* | 
| 82 | * This number identifies the number that we used to register | 85 | * This number identifies the number that we used to register | 
| 83 | * with hvc in hvc_instantiate() and hvc_alloc(); this is the | 86 | * with hvc in hvc_instantiate() and hvc_alloc(); this is the | 
| @@ -773,22 +776,14 @@ static int get_chars(u32 vtermno, char *buf, int count) | |||
| 773 | static void resize_console(struct port *port) | 776 | static void resize_console(struct port *port) | 
| 774 | { | 777 | { | 
| 775 | struct virtio_device *vdev; | 778 | struct virtio_device *vdev; | 
| 776 | struct winsize ws; | ||
| 777 | 779 | ||
| 778 | /* The port could have been hot-unplugged */ | 780 | /* The port could have been hot-unplugged */ | 
| 779 | if (!port) | 781 | if (!port || !is_console_port(port)) | 
| 780 | return; | 782 | return; | 
| 781 | 783 | ||
| 782 | vdev = port->portdev->vdev; | 784 | vdev = port->portdev->vdev; | 
| 783 | if (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE)) { | 785 | if (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE)) | 
| 784 | vdev->config->get(vdev, | 786 | hvc_resize(port->cons.hvc, port->cons.ws); | 
| 785 | offsetof(struct virtio_console_config, cols), | ||
| 786 | &ws.ws_col, sizeof(u16)); | ||
| 787 | vdev->config->get(vdev, | ||
| 788 | offsetof(struct virtio_console_config, rows), | ||
| 789 | &ws.ws_row, sizeof(u16)); | ||
| 790 | hvc_resize(port->cons.hvc, ws); | ||
| 791 | } | ||
| 792 | } | 787 | } | 
| 793 | 788 | ||
| 794 | /* We set the configuration at this point, since we now have a tty */ | 789 | /* We set the configuration at this point, since we now have a tty */ | 
| @@ -952,6 +947,15 @@ static const struct file_operations port_debugfs_ops = { | |||
| 952 | .read = debugfs_read, | 947 | .read = debugfs_read, | 
| 953 | }; | 948 | }; | 
| 954 | 949 | ||
| 950 | static void set_console_size(struct port *port, u16 rows, u16 cols) | ||
| 951 | { | ||
| 952 | if (!port || !is_console_port(port)) | ||
| 953 | return; | ||
| 954 | |||
| 955 | port->cons.ws.ws_row = rows; | ||
| 956 | port->cons.ws.ws_col = cols; | ||
| 957 | } | ||
| 958 | |||
| 955 | static unsigned int fill_queue(struct virtqueue *vq, spinlock_t *lock) | 959 | static unsigned int fill_queue(struct virtqueue *vq, spinlock_t *lock) | 
| 956 | { | 960 | { | 
| 957 | struct port_buffer *buf; | 961 | struct port_buffer *buf; | 
| @@ -1000,6 +1004,8 @@ static int add_port(struct ports_device *portdev, u32 id) | |||
| 1000 | port->inbuf = NULL; | 1004 | port->inbuf = NULL; | 
| 1001 | port->cons.hvc = NULL; | 1005 | port->cons.hvc = NULL; | 
| 1002 | 1006 | ||
| 1007 | port->cons.ws.ws_row = port->cons.ws.ws_col = 0; | ||
| 1008 | |||
| 1003 | port->host_connected = port->guest_connected = false; | 1009 | port->host_connected = port->guest_connected = false; | 
| 1004 | 1010 | ||
| 1005 | port->outvq_full = false; | 1011 | port->outvq_full = false; | 
| @@ -1320,6 +1326,19 @@ static void config_intr(struct virtio_device *vdev) | |||
| 1320 | portdev = vdev->priv; | 1326 | portdev = vdev->priv; | 
| 1321 | 1327 | ||
| 1322 | if (!use_multiport(portdev)) { | 1328 | if (!use_multiport(portdev)) { | 
| 1329 | struct port *port; | ||
| 1330 | u16 rows, cols; | ||
| 1331 | |||
| 1332 | vdev->config->get(vdev, | ||
| 1333 | offsetof(struct virtio_console_config, cols), | ||
| 1334 | &cols, sizeof(u16)); | ||
| 1335 | vdev->config->get(vdev, | ||
| 1336 | offsetof(struct virtio_console_config, rows), | ||
| 1337 | &rows, sizeof(u16)); | ||
| 1338 | |||
| 1339 | port = find_port_by_id(portdev, 0); | ||
| 1340 | set_console_size(port, rows, cols); | ||
| 1341 | |||
| 1323 | /* | 1342 | /* | 
| 1324 | * We'll use this way of resizing only for legacy | 1343 | * We'll use this way of resizing only for legacy | 
| 1325 | * support. For newer userspace | 1344 | * support. For newer userspace | 
| @@ -1327,7 +1346,7 @@ static void config_intr(struct virtio_device *vdev) | |||
| 1327 | * to indicate console size changes so that it can be | 1346 | * to indicate console size changes so that it can be | 
| 1328 | * done per-port. | 1347 | * done per-port. | 
| 1329 | */ | 1348 | */ | 
| 1330 | resize_console(find_port_by_id(portdev, 0)); | 1349 | resize_console(port); | 
| 1331 | } | 1350 | } | 
| 1332 | } | 1351 | } | 
| 1333 | 1352 | ||
