|
@@ -566,9 +566,9 @@ static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id,
|
|
|
if (!use_multiport(portdev))
|
|
|
return 0;
|
|
|
|
|
|
- cpkt.id = port_id;
|
|
|
- cpkt.event = event;
|
|
|
- cpkt.value = value;
|
|
|
+ cpkt.id = cpu_to_virtio32(portdev->vdev, port_id);
|
|
|
+ cpkt.event = cpu_to_virtio16(portdev->vdev, event);
|
|
|
+ cpkt.value = cpu_to_virtio16(portdev->vdev, value);
|
|
|
|
|
|
vq = portdev->c_ovq;
|
|
|
|
|
@@ -1602,7 +1602,8 @@ static void unplug_port(struct port *port)
|
|
|
}
|
|
|
|
|
|
/* Any private messages that the Host and Guest want to share */
|
|
|
-static void handle_control_message(struct ports_device *portdev,
|
|
|
+static void handle_control_message(struct virtio_device *vdev,
|
|
|
+ struct ports_device *portdev,
|
|
|
struct port_buffer *buf)
|
|
|
{
|
|
|
struct virtio_console_control *cpkt;
|
|
@@ -1612,15 +1613,16 @@ static void handle_control_message(struct ports_device *portdev,
|
|
|
|
|
|
cpkt = (struct virtio_console_control *)(buf->buf + buf->offset);
|
|
|
|
|
|
- port = find_port_by_id(portdev, cpkt->id);
|
|
|
- if (!port && cpkt->event != VIRTIO_CONSOLE_PORT_ADD) {
|
|
|
+ port = find_port_by_id(portdev, virtio32_to_cpu(vdev, cpkt->id));
|
|
|
+ if (!port &&
|
|
|
+ cpkt->event != cpu_to_virtio16(vdev, VIRTIO_CONSOLE_PORT_ADD)) {
|
|
|
/* No valid header at start of buffer. Drop it. */
|
|
|
dev_dbg(&portdev->vdev->dev,
|
|
|
"Invalid index %u in control packet\n", cpkt->id);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- switch (cpkt->event) {
|
|
|
+ switch (virtio16_to_cpu(vdev, cpkt->event)) {
|
|
|
case VIRTIO_CONSOLE_PORT_ADD:
|
|
|
if (port) {
|
|
|
dev_dbg(&portdev->vdev->dev,
|
|
@@ -1628,13 +1630,15 @@ static void handle_control_message(struct ports_device *portdev,
|
|
|
send_control_msg(port, VIRTIO_CONSOLE_PORT_READY, 1);
|
|
|
break;
|
|
|
}
|
|
|
- if (cpkt->id >= portdev->config.max_nr_ports) {
|
|
|
+ if (virtio32_to_cpu(vdev, cpkt->id) >=
|
|
|
+ portdev->config.max_nr_ports) {
|
|
|
dev_warn(&portdev->vdev->dev,
|
|
|
- "Request for adding port with out-of-bound id %u, max. supported id: %u\n",
|
|
|
+ "Request for adding port with "
|
|
|
+ "out-of-bound id %u, max. supported id: %u\n",
|
|
|
cpkt->id, portdev->config.max_nr_ports - 1);
|
|
|
break;
|
|
|
}
|
|
|
- add_port(portdev, cpkt->id);
|
|
|
+ add_port(portdev, virtio32_to_cpu(vdev, cpkt->id));
|
|
|
break;
|
|
|
case VIRTIO_CONSOLE_PORT_REMOVE:
|
|
|
unplug_port(port);
|
|
@@ -1670,7 +1674,7 @@ static void handle_control_message(struct ports_device *portdev,
|
|
|
break;
|
|
|
}
|
|
|
case VIRTIO_CONSOLE_PORT_OPEN:
|
|
|
- port->host_connected = cpkt->value;
|
|
|
+ port->host_connected = virtio16_to_cpu(vdev, cpkt->value);
|
|
|
wake_up_interruptible(&port->waitqueue);
|
|
|
/*
|
|
|
* If the host port got closed and the host had any
|
|
@@ -1752,7 +1756,7 @@ static void control_work_handler(struct work_struct *work)
|
|
|
buf->len = len;
|
|
|
buf->offset = 0;
|
|
|
|
|
|
- handle_control_message(portdev, buf);
|
|
|
+ handle_control_message(vq->vdev, portdev, buf);
|
|
|
|
|
|
spin_lock(&portdev->c_ivq_lock);
|
|
|
if (add_inbuf(portdev->c_ivq, buf) < 0) {
|
|
@@ -2126,6 +2130,7 @@ static struct virtio_device_id id_table[] = {
|
|
|
static unsigned int features[] = {
|
|
|
VIRTIO_CONSOLE_F_SIZE,
|
|
|
VIRTIO_CONSOLE_F_MULTIPORT,
|
|
|
+ VIRTIO_F_VERSION_1,
|
|
|
};
|
|
|
|
|
|
static struct virtio_device_id rproc_serial_id_table[] = {
|