Lines Matching refs:portdev

172 	struct ports_device *portdev;  member
253 static struct port *find_port_by_devt_in_portdev(struct ports_device *portdev, in find_port_by_devt_in_portdev() argument
259 spin_lock_irqsave(&portdev->ports_lock, flags); in find_port_by_devt_in_portdev()
260 list_for_each_entry(port, &portdev->ports, list) { in find_port_by_devt_in_portdev()
268 spin_unlock_irqrestore(&portdev->ports_lock, flags); in find_port_by_devt_in_portdev()
275 struct ports_device *portdev; in find_port_by_devt() local
280 list_for_each_entry(portdev, &pdrvdata.portdevs, list) { in find_port_by_devt()
281 port = find_port_by_devt_in_portdev(portdev, dev); in find_port_by_devt()
291 static struct port *find_port_by_id(struct ports_device *portdev, u32 id) in find_port_by_id() argument
296 spin_lock_irqsave(&portdev->ports_lock, flags); in find_port_by_id()
297 list_for_each_entry(port, &portdev->ports, list) in find_port_by_id()
302 spin_unlock_irqrestore(&portdev->ports_lock, flags); in find_port_by_id()
307 static struct port *find_port_by_vq(struct ports_device *portdev, in find_port_by_vq() argument
313 spin_lock_irqsave(&portdev->ports_lock, flags); in find_port_by_vq()
314 list_for_each_entry(port, &portdev->ports, list) in find_port_by_vq()
319 spin_unlock_irqrestore(&portdev->ports_lock, flags); in find_port_by_vq()
335 static inline bool use_multiport(struct ports_device *portdev) in use_multiport() argument
341 if (!portdev->vdev) in use_multiport()
343 return __virtio_test_bit(portdev->vdev, VIRTIO_CONSOLE_F_MULTIPORT); in use_multiport()
503 if (!port->portdev) { in discard_port_data()
539 static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id, in __send_control_msg() argument
546 if (!use_multiport(portdev)) in __send_control_msg()
549 vq = portdev->c_ovq; in __send_control_msg()
551 spin_lock(&portdev->c_ovq_lock); in __send_control_msg()
553 portdev->cpkt.id = cpu_to_virtio32(portdev->vdev, port_id); in __send_control_msg()
554 portdev->cpkt.event = cpu_to_virtio16(portdev->vdev, event); in __send_control_msg()
555 portdev->cpkt.value = cpu_to_virtio16(portdev->vdev, value); in __send_control_msg()
557 sg_init_one(sg, &portdev->cpkt, sizeof(struct virtio_console_control)); in __send_control_msg()
559 if (virtqueue_add_outbuf(vq, sg, 1, &portdev->cpkt, GFP_ATOMIC) == 0) { in __send_control_msg()
566 spin_unlock(&portdev->c_ovq_lock); in __send_control_msg()
574 if (port->portdev) in send_control_msg()
575 return __send_control_msg(port->portdev, port->id, event, value); in send_control_msg()
586 if (!port->portdev) { in reclaim_consumed_buffers()
819 buf = alloc_buf(port->portdev->vdev, count, 0); in port_fops_write()
935 buf = alloc_buf(port->portdev->vdev, 0, occupancy); in port_fops_splice_write()
1157 vdev = port->portdev->vdev; in resize_console()
1322 static int add_port(struct ports_device *portdev, u32 id) in add_port() argument
1335 port->portdev = portdev; in add_port()
1351 port->in_vq = portdev->in_vqs[port->id]; in add_port()
1352 port->out_vq = portdev->out_vqs[port->id]; in add_port()
1356 dev_err(&port->portdev->vdev->dev, "Error allocating cdev\n"); in add_port()
1362 devt = MKDEV(portdev->chr_major, id); in add_port()
1365 dev_err(&port->portdev->vdev->dev, in add_port()
1369 port->dev = device_create(&port_class, &port->portdev->vdev->dev, in add_port()
1371 port->portdev->vdev->index, id); in add_port()
1374 dev_err(&port->portdev->vdev->dev, in add_port()
1394 if (is_rproc_serial(port->portdev->vdev)) in add_port()
1401 else if (!use_multiport(port->portdev)) { in add_port()
1411 spin_lock_irq(&portdev->ports_lock); in add_port()
1412 list_add_tail(&port->list, &port->portdev->ports); in add_port()
1413 spin_unlock_irq(&portdev->ports_lock); in add_port()
1440 __send_control_msg(portdev, id, VIRTIO_CONSOLE_PORT_READY, 0); in add_port()
1473 spin_lock_irq(&port->portdev->ports_lock); in unplug_port()
1475 spin_unlock_irq(&port->portdev->ports_lock); in unplug_port()
1505 port->portdev = NULL; in unplug_port()
1524 struct ports_device *portdev, in handle_control_message() argument
1534 port = find_port_by_id(portdev, virtio32_to_cpu(vdev, cpkt->id)); in handle_control_message()
1538 dev_dbg(&portdev->vdev->dev, in handle_control_message()
1546 dev_dbg(&portdev->vdev->dev, in handle_control_message()
1552 portdev->max_nr_ports) { in handle_control_message()
1553 dev_warn(&portdev->vdev->dev, in handle_control_message()
1556 cpkt->id, portdev->max_nr_ports - 1); in handle_control_message()
1559 add_port(portdev, virtio32_to_cpu(vdev, cpkt->id)); in handle_control_message()
1662 struct ports_device *portdev; in control_work_handler() local
1667 portdev = container_of(work, struct ports_device, control_work); in control_work_handler()
1668 vq = portdev->c_ivq; in control_work_handler()
1670 spin_lock(&portdev->c_ivq_lock); in control_work_handler()
1672 spin_unlock(&portdev->c_ivq_lock); in control_work_handler()
1677 handle_control_message(vq->vdev, portdev, buf); in control_work_handler()
1679 spin_lock(&portdev->c_ivq_lock); in control_work_handler()
1680 if (add_inbuf(portdev->c_ivq, buf) < 0) { in control_work_handler()
1681 dev_warn(&portdev->vdev->dev, in control_work_handler()
1686 spin_unlock(&portdev->c_ivq_lock); in control_work_handler()
1742 if (!port->guest_connected && !is_rproc_serial(port->portdev->vdev)) in in_intr()
1758 struct ports_device *portdev; in control_intr() local
1760 portdev = vq->vdev->priv; in control_intr()
1761 schedule_work(&portdev->control_work); in control_intr()
1766 struct ports_device *portdev; in config_intr() local
1768 portdev = vdev->priv; in config_intr()
1770 if (!use_multiport(portdev)) in config_intr()
1771 schedule_work(&portdev->config_work); in config_intr()
1776 struct ports_device *portdev; in config_work_handler() local
1778 portdev = container_of(work, struct ports_device, config_work); in config_work_handler()
1779 if (!use_multiport(portdev)) { in config_work_handler()
1784 vdev = portdev->vdev; in config_work_handler()
1788 port = find_port_by_id(portdev, 0); in config_work_handler()
1802 static int init_vqs(struct ports_device *portdev) in init_vqs() argument
1809 nr_ports = portdev->max_nr_ports; in init_vqs()
1810 nr_queues = use_multiport(portdev) ? (nr_ports + 1) * 2 : 2; in init_vqs()
1814 portdev->in_vqs = kmalloc_objs(struct virtqueue *, nr_ports); in init_vqs()
1815 portdev->out_vqs = kmalloc_objs(struct virtqueue *, nr_ports); in init_vqs()
1816 if (!vqs || !vqs_info || !portdev->in_vqs || !portdev->out_vqs) { in init_vqs()
1833 if (use_multiport(portdev)) { in init_vqs()
1847 err = virtio_find_vqs(portdev->vdev, nr_queues, vqs, vqs_info, NULL); in init_vqs()
1852 portdev->in_vqs[0] = vqs[0]; in init_vqs()
1853 portdev->out_vqs[0] = vqs[1]; in init_vqs()
1855 if (use_multiport(portdev)) { in init_vqs()
1856 portdev->c_ivq = vqs[j]; in init_vqs()
1857 portdev->c_ovq = vqs[j + 1]; in init_vqs()
1861 portdev->in_vqs[i] = vqs[j]; in init_vqs()
1862 portdev->out_vqs[i] = vqs[j + 1]; in init_vqs()
1871 kfree(portdev->out_vqs); in init_vqs()
1872 kfree(portdev->in_vqs); in init_vqs()
1883 static void remove_vqs(struct ports_device *portdev) in remove_vqs() argument
1887 virtio_device_for_each_vq(portdev->vdev, vq) { in remove_vqs()
1895 portdev->vdev->config->del_vqs(portdev->vdev); in remove_vqs()
1896 kfree(portdev->in_vqs); in remove_vqs()
1897 kfree(portdev->out_vqs); in remove_vqs()
1902 struct ports_device *portdev; in virtcons_remove() local
1905 portdev = vdev->priv; in virtcons_remove()
1908 list_del(&portdev->list); in virtcons_remove()
1913 if (use_multiport(portdev)) in virtcons_remove()
1914 flush_work(&portdev->control_work); in virtcons_remove()
1916 flush_work(&portdev->config_work); in virtcons_remove()
1921 if (use_multiport(portdev)) in virtcons_remove()
1922 cancel_work_sync(&portdev->control_work); in virtcons_remove()
1924 cancel_work_sync(&portdev->config_work); in virtcons_remove()
1926 list_for_each_entry_safe(port, port2, &portdev->ports, list) in virtcons_remove()
1929 unregister_chrdev(portdev->chr_major, "virtio-portsdev"); in virtcons_remove()
1939 remove_vqs(portdev); in virtcons_remove()
1940 kfree(portdev); in virtcons_remove()
1953 struct ports_device *portdev; in virtcons_probe() local
1966 portdev = kmalloc_obj(*portdev); in virtcons_probe()
1967 if (!portdev) { in virtcons_probe()
1973 portdev->vdev = vdev; in virtcons_probe()
1974 vdev->priv = portdev; in virtcons_probe()
1976 portdev->chr_major = register_chrdev(0, "virtio-portsdev", in virtcons_probe()
1978 if (portdev->chr_major < 0) { in virtcons_probe()
1981 portdev->chr_major, vdev->index); in virtcons_probe()
1982 err = portdev->chr_major; in virtcons_probe()
1987 portdev->max_nr_ports = 1; in virtcons_probe()
1993 &portdev->max_nr_ports) == 0) { in virtcons_probe()
1994 if (portdev->max_nr_ports == 0 || in virtcons_probe()
1995 portdev->max_nr_ports > VIRTCONS_MAX_PORTS) { in virtcons_probe()
1998 portdev->max_nr_ports); in virtcons_probe()
2005 spin_lock_init(&portdev->ports_lock); in virtcons_probe()
2006 INIT_LIST_HEAD(&portdev->ports); in virtcons_probe()
2007 INIT_LIST_HEAD(&portdev->list); in virtcons_probe()
2009 INIT_WORK(&portdev->config_work, &config_work_handler); in virtcons_probe()
2010 INIT_WORK(&portdev->control_work, &control_work_handler); in virtcons_probe()
2013 spin_lock_init(&portdev->c_ivq_lock); in virtcons_probe()
2014 spin_lock_init(&portdev->c_ovq_lock); in virtcons_probe()
2017 err = init_vqs(portdev); in virtcons_probe()
2023 virtio_device_ready(portdev->vdev); in virtcons_probe()
2026 err = fill_queue(portdev->c_ivq, &portdev->c_ivq_lock); in virtcons_probe()
2034 __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID, in virtcons_probe()
2045 add_port(portdev, 0); in virtcons_probe()
2049 list_add_tail(&portdev->list, &pdrvdata.portdevs); in virtcons_probe()
2052 __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID, in virtcons_probe()
2058 unregister_chrdev(portdev->chr_major, "virtio-portsdev"); in virtcons_probe()
2060 kfree(portdev); in virtcons_probe()
2090 struct ports_device *portdev; in virtcons_freeze() local
2093 portdev = vdev->priv; in virtcons_freeze()
2097 if (use_multiport(portdev)) in virtcons_freeze()
2098 virtqueue_disable_cb(portdev->c_ivq); in virtcons_freeze()
2099 cancel_work_sync(&portdev->control_work); in virtcons_freeze()
2100 cancel_work_sync(&portdev->config_work); in virtcons_freeze()
2105 if (use_multiport(portdev)) in virtcons_freeze()
2106 virtqueue_disable_cb(portdev->c_ivq); in virtcons_freeze()
2108 list_for_each_entry(port, &portdev->ports, list) { in virtcons_freeze()
2118 remove_vqs(portdev); in virtcons_freeze()
2125 struct ports_device *portdev; in virtcons_restore() local
2129 portdev = vdev->priv; in virtcons_restore()
2131 ret = init_vqs(portdev); in virtcons_restore()
2135 virtio_device_ready(portdev->vdev); in virtcons_restore()
2137 if (use_multiport(portdev)) in virtcons_restore()
2138 fill_queue(portdev->c_ivq, &portdev->c_ivq_lock); in virtcons_restore()
2140 list_for_each_entry(port, &portdev->ports, list) { in virtcons_restore()
2141 port->in_vq = portdev->in_vqs[port->id]; in virtcons_restore()
2142 port->out_vq = portdev->out_vqs[port->id]; in virtcons_restore()