Skip to content

Commit

Permalink
virtio: disable multiport console support.
Browse files Browse the repository at this point in the history
Move MULTIPORT feature and related config changes
out of exported headers, and disable the feature
at runtime.

At this point, it seems less risky to keep code around
until we can enable it than rip it out completely.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
  • Loading branch information
Michael S. Tsirkin authored and Rusty Russell committed Apr 8, 2010
1 parent 9ff4cfa commit b7a4130
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 31 deletions.
49 changes: 41 additions & 8 deletions drivers/char/virtio_console.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,35 @@
#include <linux/workqueue.h>
#include "hvc_console.h"

/* Moved here from .h file in order to disable MULTIPORT. */
#define VIRTIO_CONSOLE_F_MULTIPORT 1 /* Does host provide multiple ports? */

struct virtio_console_multiport_conf {
struct virtio_console_config config;
/* max. number of ports this device can hold */
__u32 max_nr_ports;
/* number of ports added so far */
__u32 nr_ports;
} __attribute__((packed));

/*
* A message that's passed between the Host and the Guest for a
* particular port.
*/
struct virtio_console_control {
__u32 id; /* Port number */
__u16 event; /* The kind of control event (see below) */
__u16 value; /* Extra information for the key */
};

/* Some events for control messages */
#define VIRTIO_CONSOLE_PORT_READY 0
#define VIRTIO_CONSOLE_CONSOLE_PORT 1
#define VIRTIO_CONSOLE_RESIZE 2
#define VIRTIO_CONSOLE_PORT_OPEN 3
#define VIRTIO_CONSOLE_PORT_NAME 4
#define VIRTIO_CONSOLE_PORT_REMOVE 5

/*
* This is a global struct for storing common data for all the devices
* this driver handles.
Expand Down Expand Up @@ -121,7 +150,7 @@ struct ports_device {
spinlock_t cvq_lock;

/* The current config space is stored here */
struct virtio_console_config config;
struct virtio_console_multiport_conf config;

/* The virtio device we're associated with */
struct virtio_device *vdev;
Expand Down Expand Up @@ -1214,7 +1243,7 @@ static int add_port(struct ports_device *portdev, u32 id)
*/
static void config_work_handler(struct work_struct *work)
{
struct virtio_console_config virtconconf;
struct virtio_console_multiport_conf virtconconf;
struct ports_device *portdev;
struct virtio_device *vdev;
int err;
Expand All @@ -1223,7 +1252,8 @@ static void config_work_handler(struct work_struct *work)

vdev = portdev->vdev;
vdev->config->get(vdev,
offsetof(struct virtio_console_config, nr_ports),
offsetof(struct virtio_console_multiport_conf,
nr_ports),
&virtconconf.nr_ports,
sizeof(virtconconf.nr_ports));

Expand Down Expand Up @@ -1415,16 +1445,19 @@ static int __devinit virtcons_probe(struct virtio_device *vdev)
multiport = false;
portdev->config.nr_ports = 1;
portdev->config.max_nr_ports = 1;
#if 0 /* Multiport is not quite ready yet --RR */
if (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT)) {
multiport = true;
vdev->features[0] |= 1 << VIRTIO_CONSOLE_F_MULTIPORT;

vdev->config->get(vdev, offsetof(struct virtio_console_config,
nr_ports),
vdev->config->get(vdev,
offsetof(struct virtio_console_multiport_conf,
nr_ports),
&portdev->config.nr_ports,
sizeof(portdev->config.nr_ports));
vdev->config->get(vdev, offsetof(struct virtio_console_config,
max_nr_ports),
vdev->config->get(vdev,
offsetof(struct virtio_console_multiport_conf,
max_nr_ports),
&portdev->config.max_nr_ports,
sizeof(portdev->config.max_nr_ports));
if (portdev->config.nr_ports > portdev->config.max_nr_ports) {
Expand All @@ -1440,6 +1473,7 @@ static int __devinit virtcons_probe(struct virtio_device *vdev)

/* Let the Host know we support multiple ports.*/
vdev->config->finalize_features(vdev);
#endif

err = init_vqs(portdev);
if (err < 0) {
Expand Down Expand Up @@ -1522,7 +1556,6 @@ static struct virtio_device_id id_table[] = {

static unsigned int features[] = {
VIRTIO_CONSOLE_F_SIZE,
VIRTIO_CONSOLE_F_MULTIPORT,
};

static struct virtio_driver virtio_console = {
Expand Down
23 changes: 0 additions & 23 deletions include/linux/virtio_console.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,37 +12,14 @@

/* Feature bits */
#define VIRTIO_CONSOLE_F_SIZE 0 /* Does host provide console size? */
#define VIRTIO_CONSOLE_F_MULTIPORT 1 /* Does host provide multiple ports? */

struct virtio_console_config {
/* colums of the screens */
__u16 cols;
/* rows of the screens */
__u16 rows;
/* max. number of ports this device can hold */
__u32 max_nr_ports;
/* number of ports added so far */
__u32 nr_ports;
} __attribute__((packed));

/*
* A message that's passed between the Host and the Guest for a
* particular port.
*/
struct virtio_console_control {
__u32 id; /* Port number */
__u16 event; /* The kind of control event (see below) */
__u16 value; /* Extra information for the key */
};

/* Some events for control messages */
#define VIRTIO_CONSOLE_PORT_READY 0
#define VIRTIO_CONSOLE_CONSOLE_PORT 1
#define VIRTIO_CONSOLE_RESIZE 2
#define VIRTIO_CONSOLE_PORT_OPEN 3
#define VIRTIO_CONSOLE_PORT_NAME 4
#define VIRTIO_CONSOLE_PORT_REMOVE 5

#ifdef __KERNEL__
int __init virtio_cons_early_init(int (*put_chars)(u32, const char *, int));
#endif /* __KERNEL__ */
Expand Down

0 comments on commit b7a4130

Please sign in to comment.