Lines Matching full:port
52 /* Used for exporting per-port information to debugfs */
86 /* The hvc device associated with this console port */
148 /* Array of per-port IO virtqueues */
162 /* This struct holds the per-port data */
163 struct port { struct
164 /* Next port in the list, head is in the ports_device */
175 * port. Has to be a spinlock because it can be called from argument
183 /* The IO vqs for this port */ argument
186 /* File in the debugfs directory that exposes this port's information */ argument
191 * this port for accounting and debugging purposes. These argument
192 * counts are not reset across port open / close events.
197 * The entries in this struct will be valid if this port is
202 /* Each port associates with a separate char device */ argument
206 /* Reference-counting to handle port hot-unplugs and file operations */ argument
212 /* The 'name' of the port that we expose via sysfs properties */ argument
218 /* The 'id' to identify the port with the Host */ argument
226 /* We should allow only one process to open a port */ argument
233 static struct port *find_port_by_vtermno(u32 vtermno) in find_port_by_vtermno() argument
235 struct port *port; in find_port_by_vtermno() local
242 port = container_of(cons, struct port, cons); in find_port_by_vtermno()
246 port = NULL; in find_port_by_vtermno()
249 return port; in find_port_by_vtermno()
252 static struct port *find_port_by_devt_in_portdev(struct ports_device *portdev, in find_port_by_devt_in_portdev()
255 struct port *port; in find_port_by_devt_in_portdev() local
259 list_for_each_entry(port, &portdev->ports, list) in find_port_by_devt_in_portdev()
260 if (port->cdev->dev == dev) in find_port_by_devt_in_portdev()
262 port = NULL; in find_port_by_devt_in_portdev()
266 return port; in find_port_by_devt_in_portdev()
269 static struct port *find_port_by_devt(dev_t dev) in find_port_by_devt()
272 struct port *port; in find_port_by_devt() local
277 port = find_port_by_devt_in_portdev(portdev, dev); in find_port_by_devt()
278 if (port) in find_port_by_devt()
281 port = NULL; in find_port_by_devt()
284 return port; in find_port_by_devt()
287 static struct port *find_port_by_id(struct ports_device *portdev, u32 id) in find_port_by_id()
289 struct port *port; in find_port_by_id() local
293 list_for_each_entry(port, &portdev->ports, list) in find_port_by_id()
294 if (port->id == id) in find_port_by_id()
296 port = NULL; in find_port_by_id()
300 return port; in find_port_by_id()
303 static struct port *find_port_by_vq(struct ports_device *portdev, in find_port_by_vq()
306 struct port *port; in find_port_by_vq() local
310 list_for_each_entry(port, &portdev->ports, list) in find_port_by_vq()
311 if (port->in_vq == vq || port->out_vq == vq) in find_port_by_vq()
313 port = NULL; in find_port_by_vq()
316 return port; in find_port_by_vq()
319 static bool is_console_port(struct port *port) in is_console_port() argument
321 if (port->cons.hvc) in is_console_port()
365 static struct port_buffer *get_inbuf(struct port *port) in get_inbuf() argument
370 if (port->inbuf) in get_inbuf()
371 return port->inbuf; in get_inbuf()
373 buf = virtqueue_get_buf(port->in_vq, &len); in get_inbuf()
377 port->stats.bytes_received += len; in get_inbuf()
400 /* Discard any unread data this port has. Callers lockers. */
401 static void discard_port_data(struct port *port) in discard_port_data() argument
406 if (!port->portdev) { in discard_port_data()
410 buf = get_inbuf(port); in discard_port_data()
414 port->stats.bytes_discarded += buf->len - buf->offset; in discard_port_data()
415 if (add_inbuf(port->in_vq, buf) < 0) { in discard_port_data()
419 port->inbuf = NULL; in discard_port_data()
420 buf = get_inbuf(port); in discard_port_data()
423 dev_warn(port->dev, "Errors adding %d buffers back to vq\n", in discard_port_data()
427 static bool port_has_data(struct port *port) in port_has_data() argument
433 spin_lock_irqsave(&port->inbuf_lock, flags); in port_has_data()
434 port->inbuf = get_inbuf(port); in port_has_data()
435 if (port->inbuf) in port_has_data()
438 spin_unlock_irqrestore(&port->inbuf_lock, flags); in port_has_data()
468 static ssize_t send_control_msg(struct port *port, unsigned int event, in send_control_msg() argument
471 /* Did the port get unplugged before userspace closed it? */ in send_control_msg()
472 if (port->portdev) in send_control_msg()
473 return __send_control_msg(port->portdev, port->id, event, value); in send_control_msg()
477 /* Callers must take the port->outvq_lock */
478 static void reclaim_consumed_buffers(struct port *port) in reclaim_consumed_buffers() argument
483 if (!port->portdev) { in reclaim_consumed_buffers()
487 while ((buf = virtqueue_get_buf(port->out_vq, &len))) { in reclaim_consumed_buffers()
489 port->outvq_full = false; in reclaim_consumed_buffers()
493 static ssize_t send_buf(struct port *port, void *in_buf, size_t in_count, in send_buf() argument
502 out_vq = port->out_vq; in send_buf()
504 spin_lock_irqsave(&port->outvq_lock, flags); in send_buf()
506 reclaim_consumed_buffers(port); in send_buf()
520 port->outvq_full = true; in send_buf()
537 spin_unlock_irqrestore(&port->outvq_lock, flags); in send_buf()
539 port->stats.bytes_sent += in_count; in send_buf()
551 static ssize_t fill_readbuf(struct port *port, char *out_buf, size_t out_count, in fill_readbuf() argument
557 if (!out_count || !port_has_data(port)) in fill_readbuf()
560 buf = port->inbuf; in fill_readbuf()
580 spin_lock_irqsave(&port->inbuf_lock, flags); in fill_readbuf()
581 port->inbuf = NULL; in fill_readbuf()
583 if (add_inbuf(port->in_vq, buf) < 0) in fill_readbuf()
584 dev_warn(port->dev, "failed add_buf\n"); in fill_readbuf()
586 spin_unlock_irqrestore(&port->inbuf_lock, flags); in fill_readbuf()
593 static bool will_read_block(struct port *port) in will_read_block() argument
595 if (!port->guest_connected) { in will_read_block()
596 /* Port got hot-unplugged. Let's exit. */ in will_read_block()
599 return !port_has_data(port) && port->host_connected; in will_read_block()
602 static bool will_write_block(struct port *port) in will_write_block() argument
606 if (!port->guest_connected) { in will_write_block()
607 /* Port got hot-unplugged. Let's exit. */ in will_write_block()
610 if (!port->host_connected) in will_write_block()
613 spin_lock_irq(&port->outvq_lock); in will_write_block()
618 reclaim_consumed_buffers(port); in will_write_block()
619 ret = port->outvq_full; in will_write_block()
620 spin_unlock_irq(&port->outvq_lock); in will_write_block()
628 struct port *port; in port_fops_read() local
631 port = filp->private_data; in port_fops_read()
633 if (!port_has_data(port)) { in port_fops_read()
639 if (!port->host_connected) in port_fops_read()
644 ret = wait_event_freezable(port->waitqueue, in port_fops_read()
645 !will_read_block(port)); in port_fops_read()
649 /* Port got hot-unplugged. */ in port_fops_read()
650 if (!port->guest_connected) in port_fops_read()
662 if (!port_has_data(port) && !port->host_connected) in port_fops_read()
665 return fill_readbuf(port, ubuf, count, true); in port_fops_read()
671 struct port *port; in port_fops_write() local
680 port = filp->private_data; in port_fops_write()
684 if (will_write_block(port)) { in port_fops_write()
688 ret = wait_event_freezable(port->waitqueue, in port_fops_write()
689 !will_write_block(port)); in port_fops_write()
693 /* Port got hot-unplugged. */ in port_fops_write()
694 if (!port->guest_connected) in port_fops_write()
717 ret = send_buf(port, buf, count, nonblock); in port_fops_write()
730 struct port *port; in port_fops_poll() local
733 port = filp->private_data; in port_fops_poll()
734 poll_wait(filp, &port->waitqueue, wait); in port_fops_poll()
736 if (!port->guest_connected) { in port_fops_poll()
737 /* Port got unplugged */ in port_fops_poll()
741 if (!will_read_block(port)) in port_fops_poll()
743 if (!will_write_block(port)) in port_fops_poll()
745 if (!port->host_connected) in port_fops_poll()
755 struct port *port; in port_fops_release() local
757 port = filp->private_data; in port_fops_release()
759 /* Notify host of port being closed */ in port_fops_release()
760 send_control_msg(port, VIRTIO_CONSOLE_PORT_OPEN, 0); in port_fops_release()
762 spin_lock_irq(&port->inbuf_lock); in port_fops_release()
763 port->guest_connected = false; in port_fops_release()
765 discard_port_data(port); in port_fops_release()
767 spin_unlock_irq(&port->inbuf_lock); in port_fops_release()
769 spin_lock_irq(&port->outvq_lock); in port_fops_release()
770 reclaim_consumed_buffers(port); in port_fops_release()
771 spin_unlock_irq(&port->outvq_lock); in port_fops_release()
774 * Locks aren't necessary here as a port can't be opened after in port_fops_release()
775 * unplug, and if a port isn't unplugged, a kref would already in port_fops_release()
776 * exist for the port. Plus, taking ports_lock here would in port_fops_release()
778 * inside remove_port if we're the last holder of the port, in port_fops_release()
781 kref_put(&port->kref, remove_port); in port_fops_release()
789 struct port *port; in port_fops_open() local
792 port = find_port_by_devt(cdev->dev); in port_fops_open()
793 filp->private_data = port; in port_fops_open()
795 /* Prevent against a port getting hot-unplugged at the same time */ in port_fops_open()
796 spin_lock_irq(&port->portdev->ports_lock); in port_fops_open()
797 kref_get(&port->kref); in port_fops_open()
798 spin_unlock_irq(&port->portdev->ports_lock); in port_fops_open()
801 * Don't allow opening of console port devices -- that's done in port_fops_open()
804 if (is_console_port(port)) { in port_fops_open()
809 /* Allow only one process to open a particular port at a time */ in port_fops_open()
810 spin_lock_irq(&port->inbuf_lock); in port_fops_open()
811 if (port->guest_connected) { in port_fops_open()
812 spin_unlock_irq(&port->inbuf_lock); in port_fops_open()
817 port->guest_connected = true; in port_fops_open()
818 spin_unlock_irq(&port->inbuf_lock); in port_fops_open()
820 spin_lock_irq(&port->outvq_lock); in port_fops_open()
823 * buffers in the window of the port getting previously closed in port_fops_open()
826 reclaim_consumed_buffers(port); in port_fops_open()
827 spin_unlock_irq(&port->outvq_lock); in port_fops_open()
831 /* Notify host of port being opened */ in port_fops_open()
836 kref_put(&port->kref, remove_port); in port_fops_open()
842 struct port *port; in port_fops_fasync() local
844 port = filp->private_data; in port_fops_fasync()
845 return fasync_helper(fd, filp, mode, &port->async_queue); in port_fops_fasync()
852 * /dev/vport<device number>p<port number>
875 struct port *port; in put_chars() local
880 port = find_port_by_vtermno(vtermno); in put_chars()
881 if (!port) in put_chars()
884 return send_buf(port, (void *)buf, count, false); in put_chars()
896 struct port *port; in get_chars() local
898 /* If we've not set up the port yet, we have no input to give. */ in get_chars()
902 port = find_port_by_vtermno(vtermno); in get_chars()
903 if (!port) in get_chars()
907 BUG_ON(!port->in_vq); in get_chars()
909 return fill_readbuf(port, buf, count, false); in get_chars()
912 static void resize_console(struct port *port) in resize_console() argument
916 /* The port could have been hot-unplugged */ in resize_console()
917 if (!port || !is_console_port(port)) in resize_console()
920 vdev = port->portdev->vdev; in resize_console()
922 hvc_resize(port->cons.hvc, port->cons.ws); in resize_console()
928 struct port *port; in notifier_add_vio() local
930 port = find_port_by_vtermno(hp->vtermno); in notifier_add_vio()
931 if (!port) in notifier_add_vio()
935 resize_console(port); in notifier_add_vio()
969 int init_port_console(struct port *port) in init_port_console() argument
974 * The Host's telling us this port is a console port. Hook it in init_port_console()
990 port->cons.vtermno = pdrvdata.next_vtermno; in init_port_console()
992 port->cons.hvc = hvc_alloc(port->cons.vtermno, 0, &hv_ops, PAGE_SIZE); in init_port_console()
993 if (IS_ERR(port->cons.hvc)) { in init_port_console()
994 ret = PTR_ERR(port->cons.hvc); in init_port_console()
995 dev_err(port->dev, in init_port_console()
996 "error %d allocating hvc for port\n", ret); in init_port_console()
997 port->cons.hvc = NULL; in init_port_console()
1002 list_add_tail(&port->cons.list, &pdrvdata.consoles); in init_port_console()
1004 port->guest_connected = true; in init_port_console()
1013 /* Notify host of port being opened */ in init_port_console()
1014 send_control_msg(port, VIRTIO_CONSOLE_PORT_OPEN, 1); in init_port_console()
1022 struct port *port; in show_port_name() local
1024 port = dev_get_drvdata(dev); in show_port_name()
1026 return sprintf(buffer, "%s\n", port->name); in show_port_name()
1050 struct port *port; in debugfs_read() local
1059 port = filp->private_data; in debugfs_read()
1062 "name: %s\n", port->name ? port->name : ""); in debugfs_read()
1064 "guest_connected: %d\n", port->guest_connected); in debugfs_read()
1066 "host_connected: %d\n", port->host_connected); in debugfs_read()
1068 "outvq_full: %d\n", port->outvq_full); in debugfs_read()
1070 "bytes_sent: %lu\n", port->stats.bytes_sent); in debugfs_read()
1073 port->stats.bytes_received); in debugfs_read()
1076 port->stats.bytes_discarded); in debugfs_read()
1079 is_console_port(port) ? "yes" : "no"); in debugfs_read()
1081 "console_vtermno: %u\n", port->cons.vtermno); in debugfs_read()
1094 static void set_console_size(struct port *port, u16 rows, u16 cols) in set_console_size() argument
1096 if (!port || !is_console_port(port)) in set_console_size()
1099 port->cons.ws.ws_row = rows; in set_console_size()
1100 port->cons.ws.ws_col = cols; in set_console_size()
1129 static void send_sigio_to_port(struct port *port) in send_sigio_to_port() argument
1131 if (port->async_queue && port->guest_connected) in send_sigio_to_port()
1132 kill_fasync(&port->async_queue, SIGIO, POLL_OUT); in send_sigio_to_port()
1138 struct port *port; in add_port() local
1144 port = kmalloc(sizeof(*port), GFP_KERNEL); in add_port()
1145 if (!port) { in add_port()
1149 kref_init(&port->kref); in add_port()
1151 port->portdev = portdev; in add_port()
1152 port->id = id; in add_port()
1154 port->name = NULL; in add_port()
1155 port->inbuf = NULL; in add_port()
1156 port->cons.hvc = NULL; in add_port()
1157 port->async_queue = NULL; in add_port()
1159 port->cons.ws.ws_row = port->cons.ws.ws_col = 0; in add_port()
1161 port->host_connected = port->guest_connected = false; in add_port()
1162 port->stats = (struct port_stats) { 0 }; in add_port()
1164 port->outvq_full = false; in add_port()
1166 port->in_vq = portdev->in_vqs[port->id]; in add_port()
1167 port->out_vq = portdev->out_vqs[port->id]; in add_port()
1169 port->cdev = cdev_alloc(); in add_port()
1170 if (!port->cdev) { in add_port()
1171 dev_err(&port->portdev->vdev->dev, "Error allocating cdev\n"); in add_port()
1175 port->cdev->ops = &port_fops; in add_port()
1178 err = cdev_add(port->cdev, devt, 1); in add_port()
1180 dev_err(&port->portdev->vdev->dev, in add_port()
1181 "Error %d adding cdev for port %u\n", err, id); in add_port()
1184 port->dev = device_create(pdrvdata.class, &port->portdev->vdev->dev, in add_port()
1185 devt, port, "vport%up%u", in add_port()
1186 port->portdev->drv_index, id); in add_port()
1187 if (IS_ERR(port->dev)) { in add_port()
1188 err = PTR_ERR(port->dev); in add_port()
1189 dev_err(&port->portdev->vdev->dev, in add_port()
1190 "Error %d creating device for port %u\n", in add_port()
1195 spin_lock_init(&port->inbuf_lock); in add_port()
1196 spin_lock_init(&port->outvq_lock); in add_port()
1197 init_waitqueue_head(&port->waitqueue); in add_port()
1200 nr_added_bufs = fill_queue(port->in_vq, &port->inbuf_lock); in add_port()
1202 dev_err(port->dev, "Error allocating inbufs\n"); in add_port()
1208 * If we're not using multiport support, this has to be a console port in add_port()
1210 if (!use_multiport(port->portdev)) { in add_port()
1211 err = init_port_console(port); in add_port()
1217 list_add_tail(&port->list, &port->portdev->ports); in add_port()
1222 * configuration parameters for this port (eg, port name, in add_port()
1223 * caching, whether this is a console port, etc.) in add_port()
1225 send_control_msg(port, VIRTIO_CONSOLE_PORT_READY, 1); in add_port()
1230 * inspect a port's state at any time in add_port()
1233 port->portdev->drv_index, id); in add_port()
1234 port->debugfs_file = debugfs_create_file(debugfs_name, 0444, in add_port()
1236 port, in add_port()
1242 while ((buf = virtqueue_detach_unused_buf(port->in_vq))) in add_port()
1245 device_destroy(pdrvdata.class, port->dev->devt); in add_port()
1247 cdev_del(port->cdev); in add_port()
1249 kfree(port); in add_port()
1251 /* The host might want to notify management sw about port add failure */ in add_port()
1256 /* No users remain, remove all port-specific data. */
1259 struct port *port; in remove_port() local
1261 port = container_of(kref, struct port, kref); in remove_port()
1263 sysfs_remove_group(&port->dev->kobj, &port_attribute_group); in remove_port()
1264 device_destroy(pdrvdata.class, port->dev->devt); in remove_port()
1265 cdev_del(port->cdev); in remove_port()
1267 kfree(port->name); in remove_port()
1269 debugfs_remove(port->debugfs_file); in remove_port()
1271 kfree(port); in remove_port()
1274 static void remove_port_data(struct port *port) in remove_port_data() argument
1278 /* Remove unused data this port might have received. */ in remove_port_data()
1279 discard_port_data(port); in remove_port_data()
1281 reclaim_consumed_buffers(port); in remove_port_data()
1284 while ((buf = virtqueue_detach_unused_buf(port->in_vq))) in remove_port_data()
1289 * Port got unplugged. Remove port from portdev's list and drop the
1290 * kref reference. If no userspace has this port opened, it will
1291 * result in immediate removal the port.
1293 static void unplug_port(struct port *port) in unplug_port() argument
1295 spin_lock_irq(&port->portdev->ports_lock); in unplug_port()
1296 list_del(&port->list); in unplug_port()
1297 spin_unlock_irq(&port->portdev->ports_lock); in unplug_port()
1299 if (port->guest_connected) { in unplug_port()
1300 port->guest_connected = false; in unplug_port()
1301 port->host_connected = false; in unplug_port()
1302 wake_up_interruptible(&port->waitqueue); in unplug_port()
1304 /* Let the app know the port is going down. */ in unplug_port()
1305 send_sigio_to_port(port); in unplug_port()
1308 if (is_console_port(port)) { in unplug_port()
1310 list_del(&port->cons.list); in unplug_port()
1312 hvc_remove(port->cons.hvc); in unplug_port()
1315 remove_port_data(port); in unplug_port()
1319 * else a close on an open port later will try to send out a in unplug_port()
1322 port->portdev = NULL; in unplug_port()
1325 * Locks around here are not necessary - a port can't be in unplug_port()
1326 * opened after we removed the port struct from ports_list in unplug_port()
1329 kref_put(&port->kref, remove_port); in unplug_port()
1337 struct port *port; in handle_control_message() local
1343 port = find_port_by_id(portdev, cpkt->id); in handle_control_message()
1344 if (!port && cpkt->event != VIRTIO_CONSOLE_PORT_ADD) { in handle_control_message()
1353 if (port) { in handle_control_message()
1355 "Port %u already added\n", port->id); in handle_control_message()
1356 send_control_msg(port, VIRTIO_CONSOLE_PORT_READY, 1); in handle_control_message()
1361 "Request for adding port with out-of-bound id %u, max. supported id: %u\n", in handle_control_message()
1368 unplug_port(port); in handle_control_message()
1373 if (is_console_port(port)) in handle_control_message()
1376 init_port_console(port); in handle_control_message()
1379 * Could remove the port here in case init fails - but in handle_control_message()
1389 if (!is_console_port(port)) in handle_control_message()
1394 set_console_size(port, size.rows, size.cols); in handle_control_message()
1396 port->cons.hvc->irq_requested = 1; in handle_control_message()
1397 resize_console(port); in handle_control_message()
1401 port->host_connected = cpkt->value; in handle_control_message()
1402 wake_up_interruptible(&port->waitqueue); in handle_control_message()
1404 * If the host port got closed and the host had any in handle_control_message()
1408 spin_lock_irq(&port->outvq_lock); in handle_control_message()
1409 reclaim_consumed_buffers(port); in handle_control_message()
1410 spin_unlock_irq(&port->outvq_lock); in handle_control_message()
1416 send_sigio_to_port(port); in handle_control_message()
1423 if (port->name) in handle_control_message()
1432 port->name = kmalloc(name_size, GFP_KERNEL); in handle_control_message()
1433 if (!port->name) { in handle_control_message()
1434 dev_err(port->dev, in handle_control_message()
1435 "Not enough space to store port name\n"); in handle_control_message()
1438 strncpy(port->name, buf->buf + buf->offset + sizeof(*cpkt), in handle_control_message()
1440 port->name[name_size - 1] = 0; in handle_control_message()
1444 * create it only if we have a name for the port. in handle_control_message()
1446 err = sysfs_create_group(&port->dev->kobj, in handle_control_message()
1449 dev_err(port->dev, in handle_control_message()
1458 kobject_uevent(&port->dev->kobj, KOBJ_CHANGE); in handle_control_message()
1495 struct port *port; in out_intr() local
1497 port = find_port_by_vq(vq->vdev->priv, vq); in out_intr()
1498 if (!port) in out_intr()
1501 wake_up_interruptible(&port->waitqueue); in out_intr()
1506 struct port *port; in in_intr() local
1509 port = find_port_by_vq(vq->vdev->priv, vq); in in_intr()
1510 if (!port) in in_intr()
1513 spin_lock_irqsave(&port->inbuf_lock, flags); in in_intr()
1514 port->inbuf = get_inbuf(port); in in_intr()
1517 * Don't queue up data when port is closed. This condition in in_intr()
1518 * can be reached when a console port is not yet connected (no in in_intr()
1523 if (!port->guest_connected) in in_intr()
1524 discard_port_data(port); in in_intr()
1526 spin_unlock_irqrestore(&port->inbuf_lock, flags); in in_intr()
1528 wake_up_interruptible(&port->waitqueue); in in_intr()
1531 send_sigio_to_port(port); in in_intr()
1533 if (is_console_port(port) && hvc_poll(port->cons.hvc)) in in_intr()
1552 struct port *port; in config_intr() local
1562 port = find_port_by_id(portdev, 0); in config_intr()
1563 set_console_size(port, rows, cols); in config_intr()
1570 * done per-port. in config_intr()
1572 resize_console(port); in config_intr()
1602 * spawns a console port first and also inits the vqs for port in init_vqs()
1695 * initialize each port found.
1763 * For backward compatibility: Create a console port in virtcons_probe()
1806 struct port *port, *port2; in virtcons_remove() local
1819 list_for_each_entry_safe(port, port2, &portdev->ports, list) in virtcons_remove()
1820 unplug_port(port); in virtcons_remove()
1829 * have to just stop using the port, as the vqs are going in virtcons_remove()
1851 struct port *port; in virtcons_freeze() local
1866 list_for_each_entry(port, &portdev->ports, list) { in virtcons_freeze()
1867 virtqueue_disable_cb(port->in_vq); in virtcons_freeze()
1868 virtqueue_disable_cb(port->out_vq); in virtcons_freeze()
1871 * the port opened or closed. in virtcons_freeze()
1873 port->host_connected = false; in virtcons_freeze()
1874 remove_port_data(port); in virtcons_freeze()
1884 struct port *port; in virtcons_restore() local
1896 list_for_each_entry(port, &portdev->ports, list) { in virtcons_restore()
1897 port->in_vq = portdev->in_vqs[port->id]; in virtcons_restore()
1898 port->out_vq = portdev->out_vqs[port->id]; in virtcons_restore()
1900 fill_queue(port->in_vq, &port->inbuf_lock); in virtcons_restore()
1902 /* Get port open/close status on the host */ in virtcons_restore()
1903 send_control_msg(port, VIRTIO_CONSOLE_PORT_READY, 1); in virtcons_restore()