Lines Matching refs:portdev
185 struct ports_device *portdev; member
269 static struct port *find_port_by_devt_in_portdev(struct ports_device *portdev, in find_port_by_devt_in_portdev() argument
275 spin_lock_irqsave(&portdev->ports_lock, flags); in find_port_by_devt_in_portdev()
276 list_for_each_entry(port, &portdev->ports, list) { in find_port_by_devt_in_portdev()
284 spin_unlock_irqrestore(&portdev->ports_lock, flags); in find_port_by_devt_in_portdev()
291 struct ports_device *portdev; in find_port_by_devt() local
296 list_for_each_entry(portdev, &pdrvdata.portdevs, list) { in find_port_by_devt()
297 port = find_port_by_devt_in_portdev(portdev, dev); in find_port_by_devt()
307 static struct port *find_port_by_id(struct ports_device *portdev, u32 id) in find_port_by_id() argument
312 spin_lock_irqsave(&portdev->ports_lock, flags); in find_port_by_id()
313 list_for_each_entry(port, &portdev->ports, list) in find_port_by_id()
318 spin_unlock_irqrestore(&portdev->ports_lock, flags); in find_port_by_id()
323 static struct port *find_port_by_vq(struct ports_device *portdev, in find_port_by_vq() argument
329 spin_lock_irqsave(&portdev->ports_lock, flags); in find_port_by_vq()
330 list_for_each_entry(port, &portdev->ports, list) in find_port_by_vq()
335 spin_unlock_irqrestore(&portdev->ports_lock, flags); in find_port_by_vq()
351 static inline bool use_multiport(struct ports_device *portdev) in use_multiport() argument
357 if (!portdev->vdev) in use_multiport()
359 return __virtio_test_bit(portdev->vdev, VIRTIO_CONSOLE_F_MULTIPORT); in use_multiport()
523 if (!port->portdev) { in discard_port_data()
559 static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id, in __send_control_msg() argument
567 if (!use_multiport(portdev)) in __send_control_msg()
570 cpkt.id = cpu_to_virtio32(portdev->vdev, port_id); in __send_control_msg()
571 cpkt.event = cpu_to_virtio16(portdev->vdev, event); in __send_control_msg()
572 cpkt.value = cpu_to_virtio16(portdev->vdev, value); in __send_control_msg()
574 vq = portdev->c_ovq; in __send_control_msg()
578 spin_lock(&portdev->c_ovq_lock); in __send_control_msg()
585 spin_unlock(&portdev->c_ovq_lock); in __send_control_msg()
593 if (port->portdev) in send_control_msg()
594 return __send_control_msg(port->portdev, port->id, event, value); in send_control_msg()
605 if (!port->portdev) { in reclaim_consumed_buffers()
1178 vdev = port->portdev->vdev; in resize_console()
1390 static int add_port(struct ports_device *portdev, u32 id) in add_port() argument
1406 port->portdev = portdev; in add_port()
1421 port->in_vq = portdev->in_vqs[port->id]; in add_port()
1422 port->out_vq = portdev->out_vqs[port->id]; in add_port()
1426 dev_err(&port->portdev->vdev->dev, "Error allocating cdev\n"); in add_port()
1432 devt = MKDEV(portdev->chr_major, id); in add_port()
1435 dev_err(&port->portdev->vdev->dev, in add_port()
1439 port->dev = device_create(pdrvdata.class, &port->portdev->vdev->dev, in add_port()
1441 port->portdev->vdev->index, id); in add_port()
1444 dev_err(&port->portdev->vdev->dev, in add_port()
1462 if (is_rproc_serial(port->portdev->vdev)) in add_port()
1469 else if (!use_multiport(port->portdev)) { in add_port()
1479 spin_lock_irq(&portdev->ports_lock); in add_port()
1480 list_add_tail(&port->list, &port->portdev->ports); in add_port()
1481 spin_unlock_irq(&portdev->ports_lock); in add_port()
1496 port->portdev->vdev->index, id); in add_port()
1515 __send_control_msg(portdev, id, VIRTIO_CONSOLE_PORT_READY, 0); in add_port()
1558 spin_lock_irq(&port->portdev->ports_lock); in unplug_port()
1560 spin_unlock_irq(&port->portdev->ports_lock); in unplug_port()
1589 port->portdev = NULL; in unplug_port()
1608 struct ports_device *portdev, in handle_control_message() argument
1618 port = find_port_by_id(portdev, virtio32_to_cpu(vdev, cpkt->id)); in handle_control_message()
1622 dev_dbg(&portdev->vdev->dev, in handle_control_message()
1630 dev_dbg(&portdev->vdev->dev, in handle_control_message()
1636 portdev->config.max_nr_ports) { in handle_control_message()
1637 dev_warn(&portdev->vdev->dev, in handle_control_message()
1640 cpkt->id, portdev->config.max_nr_ports - 1); in handle_control_message()
1643 add_port(portdev, virtio32_to_cpu(vdev, cpkt->id)); in handle_control_message()
1746 struct ports_device *portdev; in control_work_handler() local
1751 portdev = container_of(work, struct ports_device, control_work); in control_work_handler()
1752 vq = portdev->c_ivq; in control_work_handler()
1754 spin_lock(&portdev->c_ivq_lock); in control_work_handler()
1756 spin_unlock(&portdev->c_ivq_lock); in control_work_handler()
1761 handle_control_message(vq->vdev, portdev, buf); in control_work_handler()
1763 spin_lock(&portdev->c_ivq_lock); in control_work_handler()
1764 if (add_inbuf(portdev->c_ivq, buf) < 0) { in control_work_handler()
1765 dev_warn(&portdev->vdev->dev, in control_work_handler()
1770 spin_unlock(&portdev->c_ivq_lock); in control_work_handler()
1813 if (!port->guest_connected && !is_rproc_serial(port->portdev->vdev)) in in_intr()
1829 struct ports_device *portdev; in control_intr() local
1831 portdev = vq->vdev->priv; in control_intr()
1832 schedule_work(&portdev->control_work); in control_intr()
1837 struct ports_device *portdev; in config_intr() local
1839 portdev = vdev->priv; in config_intr()
1841 if (!use_multiport(portdev)) in config_intr()
1842 schedule_work(&portdev->config_work); in config_intr()
1847 struct ports_device *portdev; in config_work_handler() local
1849 portdev = container_of(work, struct ports_device, control_work); in config_work_handler()
1850 if (!use_multiport(portdev)) { in config_work_handler()
1855 vdev = portdev->vdev; in config_work_handler()
1859 port = find_port_by_id(portdev, 0); in config_work_handler()
1873 static int init_vqs(struct ports_device *portdev) in init_vqs() argument
1881 nr_ports = portdev->config.max_nr_ports; in init_vqs()
1882 nr_queues = use_multiport(portdev) ? (nr_ports + 1) * 2 : 2; in init_vqs()
1887 portdev->in_vqs = kmalloc(nr_ports * sizeof(struct virtqueue *), in init_vqs()
1889 portdev->out_vqs = kmalloc(nr_ports * sizeof(struct virtqueue *), in init_vqs()
1891 if (!vqs || !io_callbacks || !io_names || !portdev->in_vqs || in init_vqs()
1892 !portdev->out_vqs) { in init_vqs()
1909 if (use_multiport(portdev)) { in init_vqs()
1924 err = portdev->vdev->config->find_vqs(portdev->vdev, nr_queues, vqs, in init_vqs()
1931 portdev->in_vqs[0] = vqs[0]; in init_vqs()
1932 portdev->out_vqs[0] = vqs[1]; in init_vqs()
1934 if (use_multiport(portdev)) { in init_vqs()
1935 portdev->c_ivq = vqs[j]; in init_vqs()
1936 portdev->c_ovq = vqs[j + 1]; in init_vqs()
1940 portdev->in_vqs[i] = vqs[j]; in init_vqs()
1941 portdev->out_vqs[i] = vqs[j + 1]; in init_vqs()
1951 kfree(portdev->out_vqs); in init_vqs()
1952 kfree(portdev->in_vqs); in init_vqs()
1964 static void remove_vqs(struct ports_device *portdev) in remove_vqs() argument
1966 portdev->vdev->config->del_vqs(portdev->vdev); in remove_vqs()
1967 kfree(portdev->in_vqs); in remove_vqs()
1968 kfree(portdev->out_vqs); in remove_vqs()
1971 static void remove_controlq_data(struct ports_device *portdev) in remove_controlq_data() argument
1976 if (!use_multiport(portdev)) in remove_controlq_data()
1979 while ((buf = virtqueue_get_buf(portdev->c_ivq, &len))) in remove_controlq_data()
1982 while ((buf = virtqueue_detach_unused_buf(portdev->c_ivq))) in remove_controlq_data()
1996 struct ports_device *portdev; in virtcons_probe() local
2013 portdev = kmalloc(sizeof(*portdev), GFP_KERNEL); in virtcons_probe()
2014 if (!portdev) { in virtcons_probe()
2020 portdev->vdev = vdev; in virtcons_probe()
2021 vdev->priv = portdev; in virtcons_probe()
2023 portdev->chr_major = register_chrdev(0, "virtio-portsdev", in virtcons_probe()
2025 if (portdev->chr_major < 0) { in virtcons_probe()
2028 portdev->chr_major, vdev->index); in virtcons_probe()
2029 err = portdev->chr_major; in virtcons_probe()
2034 portdev->config.max_nr_ports = 1; in virtcons_probe()
2040 &portdev->config.max_nr_ports) == 0) { in virtcons_probe()
2044 err = init_vqs(portdev); in virtcons_probe()
2050 spin_lock_init(&portdev->ports_lock); in virtcons_probe()
2051 INIT_LIST_HEAD(&portdev->ports); in virtcons_probe()
2053 virtio_device_ready(portdev->vdev); in virtcons_probe()
2055 INIT_WORK(&portdev->config_work, &config_work_handler); in virtcons_probe()
2056 INIT_WORK(&portdev->control_work, &control_work_handler); in virtcons_probe()
2061 spin_lock_init(&portdev->c_ivq_lock); in virtcons_probe()
2062 spin_lock_init(&portdev->c_ovq_lock); in virtcons_probe()
2064 nr_added_bufs = fill_queue(portdev->c_ivq, in virtcons_probe()
2065 &portdev->c_ivq_lock); in virtcons_probe()
2077 add_port(portdev, 0); in virtcons_probe()
2081 list_add_tail(&portdev->list, &pdrvdata.portdevs); in virtcons_probe()
2084 __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID, in virtcons_probe()
2103 __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID, in virtcons_probe()
2105 remove_vqs(portdev); in virtcons_probe()
2107 unregister_chrdev(portdev->chr_major, "virtio-portsdev"); in virtcons_probe()
2109 kfree(portdev); in virtcons_probe()
2116 struct ports_device *portdev; in virtcons_remove() local
2119 portdev = vdev->priv; in virtcons_remove()
2122 list_del(&portdev->list); in virtcons_remove()
2128 if (use_multiport(portdev)) in virtcons_remove()
2129 cancel_work_sync(&portdev->control_work); in virtcons_remove()
2131 cancel_work_sync(&portdev->config_work); in virtcons_remove()
2133 list_for_each_entry_safe(port, port2, &portdev->ports, list) in virtcons_remove()
2136 unregister_chrdev(portdev->chr_major, "virtio-portsdev"); in virtcons_remove()
2146 remove_controlq_data(portdev); in virtcons_remove()
2147 remove_vqs(portdev); in virtcons_remove()
2148 kfree(portdev); in virtcons_remove()
2174 struct ports_device *portdev; in virtcons_freeze() local
2177 portdev = vdev->priv; in virtcons_freeze()
2181 virtqueue_disable_cb(portdev->c_ivq); in virtcons_freeze()
2182 cancel_work_sync(&portdev->control_work); in virtcons_freeze()
2183 cancel_work_sync(&portdev->config_work); in virtcons_freeze()
2188 virtqueue_disable_cb(portdev->c_ivq); in virtcons_freeze()
2189 remove_controlq_data(portdev); in virtcons_freeze()
2191 list_for_each_entry(port, &portdev->ports, list) { in virtcons_freeze()
2201 remove_vqs(portdev); in virtcons_freeze()
2208 struct ports_device *portdev; in virtcons_restore() local
2212 portdev = vdev->priv; in virtcons_restore()
2214 ret = init_vqs(portdev); in virtcons_restore()
2218 virtio_device_ready(portdev->vdev); in virtcons_restore()
2220 if (use_multiport(portdev)) in virtcons_restore()
2221 fill_queue(portdev->c_ivq, &portdev->c_ivq_lock); in virtcons_restore()
2223 list_for_each_entry(port, &portdev->ports, list) { in virtcons_restore()
2224 port->in_vq = portdev->in_vqs[port->id]; in virtcons_restore()
2225 port->out_vq = portdev->out_vqs[port->id]; in virtcons_restore()