Lines Matching refs:portdev
117 /* Next portdev in the list, head is in the pdrvdata struct */
171 struct ports_device *portdev;
255 static struct port *find_port_by_devt_in_portdev(struct ports_device *portdev,
261 spin_lock_irqsave(&portdev->ports_lock, flags);
262 list_for_each_entry(port, &portdev->ports, list) {
270 spin_unlock_irqrestore(&portdev->ports_lock, flags);
277 struct ports_device *portdev;
282 list_for_each_entry(portdev, &pdrvdata.portdevs, list) {
283 port = find_port_by_devt_in_portdev(portdev, dev);
293 static struct port *find_port_by_id(struct ports_device *portdev, u32 id)
298 spin_lock_irqsave(&portdev->ports_lock, flags);
299 list_for_each_entry(port, &portdev->ports, list)
304 spin_unlock_irqrestore(&portdev->ports_lock, flags);
309 static struct port *find_port_by_vq(struct ports_device *portdev,
315 spin_lock_irqsave(&portdev->ports_lock, flags);
316 list_for_each_entry(port, &portdev->ports, list)
321 spin_unlock_irqrestore(&portdev->ports_lock, flags);
337 static inline bool use_multiport(struct ports_device *portdev)
343 if (!portdev->vdev)
345 return __virtio_test_bit(portdev->vdev, VIRTIO_CONSOLE_F_MULTIPORT);
505 if (!port->portdev) {
541 static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id,
548 if (!use_multiport(portdev))
551 vq = portdev->c_ovq;
553 spin_lock(&portdev->c_ovq_lock);
555 portdev->cpkt.id = cpu_to_virtio32(portdev->vdev, port_id);
556 portdev->cpkt.event = cpu_to_virtio16(portdev->vdev, event);
557 portdev->cpkt.value = cpu_to_virtio16(portdev->vdev, value);
559 sg_init_one(sg, &portdev->cpkt, sizeof(struct virtio_console_control));
561 if (virtqueue_add_outbuf(vq, sg, 1, &portdev->cpkt, GFP_ATOMIC) == 0) {
568 spin_unlock(&portdev->c_ovq_lock);
576 if (port->portdev)
577 return __send_control_msg(port->portdev, port->id, event, value);
588 if (!port->portdev) {
821 buf = alloc_buf(port->portdev->vdev, count, 0);
937 buf = alloc_buf(port->portdev->vdev, 0, occupancy);
1167 vdev = port->portdev->vdev;
1355 static int add_port(struct ports_device *portdev, u32 id)
1369 port->portdev = portdev;
1385 port->in_vq = portdev->in_vqs[port->id];
1386 port->out_vq = portdev->out_vqs[port->id];
1390 dev_err(&port->portdev->vdev->dev, "Error allocating cdev\n");
1396 devt = MKDEV(portdev->chr_major, id);
1399 dev_err(&port->portdev->vdev->dev,
1403 port->dev = device_create(&port_class, &port->portdev->vdev->dev,
1405 port->portdev->vdev->index, id);
1408 dev_err(&port->portdev->vdev->dev,
1428 if (is_rproc_serial(port->portdev->vdev))
1435 else if (!use_multiport(port->portdev)) {
1445 spin_lock_irq(&portdev->ports_lock);
1446 list_add_tail(&port->list, &port->portdev->ports);
1447 spin_unlock_irq(&portdev->ports_lock);
1461 port->portdev->vdev->index, id);
1476 __send_control_msg(portdev, id, VIRTIO_CONSOLE_PORT_READY, 0);
1503 * Port got unplugged. Remove port from portdev's list and drop the
1509 spin_lock_irq(&port->portdev->ports_lock);
1511 spin_unlock_irq(&port->portdev->ports_lock);
1541 port->portdev = NULL;
1560 struct ports_device *portdev,
1570 port = find_port_by_id(portdev, virtio32_to_cpu(vdev, cpkt->id));
1574 dev_dbg(&portdev->vdev->dev,
1582 dev_dbg(&portdev->vdev->dev,
1588 portdev->max_nr_ports) {
1589 dev_warn(&portdev->vdev->dev,
1592 cpkt->id, portdev->max_nr_ports - 1);
1595 add_port(portdev, virtio32_to_cpu(vdev, cpkt->id));
1697 struct ports_device *portdev;
1702 portdev = container_of(work, struct ports_device, control_work);
1703 vq = portdev->c_ivq;
1705 spin_lock(&portdev->c_ivq_lock);
1707 spin_unlock(&portdev->c_ivq_lock);
1712 handle_control_message(vq->vdev, portdev, buf);
1714 spin_lock(&portdev->c_ivq_lock);
1715 if (add_inbuf(portdev->c_ivq, buf) < 0) {
1716 dev_warn(&portdev->vdev->dev,
1721 spin_unlock(&portdev->c_ivq_lock);
1777 if (!port->guest_connected && !is_rproc_serial(port->portdev->vdev))
1793 struct ports_device *portdev;
1795 portdev = vq->vdev->priv;
1796 schedule_work(&portdev->control_work);
1801 struct ports_device *portdev;
1803 portdev = vdev->priv;
1805 if (!use_multiport(portdev))
1806 schedule_work(&portdev->config_work);
1811 struct ports_device *portdev;
1813 portdev = container_of(work, struct ports_device, config_work);
1814 if (!use_multiport(portdev)) {
1819 vdev = portdev->vdev;
1823 port = find_port_by_id(portdev, 0);
1837 static int init_vqs(struct ports_device *portdev)
1845 nr_ports = portdev->max_nr_ports;
1846 nr_queues = use_multiport(portdev) ? (nr_ports + 1) * 2 : 2;
1852 portdev->in_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
1854 portdev->out_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
1856 if (!vqs || !io_callbacks || !io_names || !portdev->in_vqs ||
1857 !portdev->out_vqs) {
1874 if (use_multiport(portdev)) {
1889 err = virtio_find_vqs(portdev->vdev, nr_queues, vqs,
1896 portdev->in_vqs[0] = vqs[0];
1897 portdev->out_vqs[0] = vqs[1];
1899 if (use_multiport(portdev)) {
1900 portdev->c_ivq = vqs[j];
1901 portdev->c_ovq = vqs[j + 1];
1905 portdev->in_vqs[i] = vqs[j];
1906 portdev->out_vqs[i] = vqs[j + 1];
1916 kfree(portdev->out_vqs);
1917 kfree(portdev->in_vqs);
1929 static void remove_vqs(struct ports_device *portdev)
1933 virtio_device_for_each_vq(portdev->vdev, vq) {
1941 portdev->vdev->config->del_vqs(portdev->vdev);
1942 kfree(portdev->in_vqs);
1943 kfree(portdev->out_vqs);
1948 struct ports_device *portdev;
1951 portdev = vdev->priv;
1954 list_del(&portdev->list);
1959 if (use_multiport(portdev))
1960 flush_work(&portdev->control_work);
1962 flush_work(&portdev->config_work);
1967 if (use_multiport(portdev))
1968 cancel_work_sync(&portdev->control_work);
1970 cancel_work_sync(&portdev->config_work);
1972 list_for_each_entry_safe(port, port2, &portdev->ports, list)
1975 unregister_chrdev(portdev->chr_major, "virtio-portsdev");
1985 remove_vqs(portdev);
1986 kfree(portdev);
1999 struct ports_device *portdev;
2016 portdev = kmalloc(sizeof(*portdev), GFP_KERNEL);
2017 if (!portdev) {
2022 /* Attach this portdev to this virtio_device, and vice-versa. */
2023 portdev->vdev = vdev;
2024 vdev->priv = portdev;
2026 portdev->chr_major = register_chrdev(0, "virtio-portsdev",
2028 if (portdev->chr_major < 0) {
2031 portdev->chr_major, vdev->index);
2032 err = portdev->chr_major;
2037 portdev->max_nr_ports = 1;
2043 &portdev->max_nr_ports) == 0) {
2044 if (portdev->max_nr_ports == 0 ||
2045 portdev->max_nr_ports > VIRTCONS_MAX_PORTS) {
2048 portdev->max_nr_ports);
2055 err = init_vqs(portdev);
2061 spin_lock_init(&portdev->ports_lock);
2062 INIT_LIST_HEAD(&portdev->ports);
2063 INIT_LIST_HEAD(&portdev->list);
2065 virtio_device_ready(portdev->vdev);
2067 INIT_WORK(&portdev->config_work, &config_work_handler);
2068 INIT_WORK(&portdev->control_work, &control_work_handler);
2071 spin_lock_init(&portdev->c_ivq_lock);
2072 spin_lock_init(&portdev->c_ovq_lock);
2074 err = fill_queue(portdev->c_ivq, &portdev->c_ivq_lock);
2082 __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID,
2093 add_port(portdev, 0);
2097 list_add_tail(&portdev->list, &pdrvdata.portdevs);
2100 __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID,
2118 unregister_chrdev(portdev->chr_major, "virtio-portsdev");
2120 kfree(portdev);
2150 struct ports_device *portdev;
2153 portdev = vdev->priv;
2157 if (use_multiport(portdev))
2158 virtqueue_disable_cb(portdev->c_ivq);
2159 cancel_work_sync(&portdev->control_work);
2160 cancel_work_sync(&portdev->config_work);
2165 if (use_multiport(portdev))
2166 virtqueue_disable_cb(portdev->c_ivq);
2168 list_for_each_entry(port, &portdev->ports, list) {
2178 remove_vqs(portdev);
2185 struct ports_device *portdev;
2189 portdev = vdev->priv;
2191 ret = init_vqs(portdev);
2195 virtio_device_ready(portdev->vdev);
2197 if (use_multiport(portdev))
2198 fill_queue(portdev->c_ivq, &portdev->c_ivq_lock);
2200 list_for_each_entry(port, &portdev->ports, list) {
2201 port->in_vq = portdev->in_vqs[port->id];
2202 port->out_vq = portdev->out_vqs[port->id];