Lines Matching refs:portdev
123 /* Next portdev in the list, head is in the pdrvdata struct */
177 struct ports_device *portdev;
261 static struct port *find_port_by_devt_in_portdev(struct ports_device *portdev,
267 spin_lock_irqsave(&portdev->ports_lock, flags);
268 list_for_each_entry(port, &portdev->ports, list) {
276 spin_unlock_irqrestore(&portdev->ports_lock, flags);
283 struct ports_device *portdev;
288 list_for_each_entry(portdev, &pdrvdata.portdevs, list) {
289 port = find_port_by_devt_in_portdev(portdev, dev);
299 static struct port *find_port_by_id(struct ports_device *portdev, u32 id)
304 spin_lock_irqsave(&portdev->ports_lock, flags);
305 list_for_each_entry(port, &portdev->ports, list)
310 spin_unlock_irqrestore(&portdev->ports_lock, flags);
315 static struct port *find_port_by_vq(struct ports_device *portdev,
321 spin_lock_irqsave(&portdev->ports_lock, flags);
322 list_for_each_entry(port, &portdev->ports, list)
327 spin_unlock_irqrestore(&portdev->ports_lock, flags);
343 static inline bool use_multiport(struct ports_device *portdev)
349 if (!portdev->vdev)
351 return __virtio_test_bit(portdev->vdev, VIRTIO_CONSOLE_F_MULTIPORT);
511 if (!port->portdev) {
547 static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id,
554 if (!use_multiport(portdev))
557 vq = portdev->c_ovq;
559 spin_lock(&portdev->c_ovq_lock);
561 portdev->cpkt.id = cpu_to_virtio32(portdev->vdev, port_id);
562 portdev->cpkt.event = cpu_to_virtio16(portdev->vdev, event);
563 portdev->cpkt.value = cpu_to_virtio16(portdev->vdev, value);
565 sg_init_one(sg, &portdev->cpkt, sizeof(struct virtio_console_control));
567 if (virtqueue_add_outbuf(vq, sg, 1, &portdev->cpkt, GFP_ATOMIC) == 0) {
574 spin_unlock(&portdev->c_ovq_lock);
582 if (port->portdev)
583 return __send_control_msg(port->portdev, port->id, event, value);
594 if (!port->portdev) {
827 buf = alloc_buf(port->portdev->vdev, count, 0);
943 buf = alloc_buf(port->portdev->vdev, 0, occupancy);
1173 vdev = port->portdev->vdev;
1358 static int add_port(struct ports_device *portdev, u32 id)
1372 port->portdev = portdev;
1388 port->in_vq = portdev->in_vqs[port->id];
1389 port->out_vq = portdev->out_vqs[port->id];
1393 dev_err(&port->portdev->vdev->dev, "Error allocating cdev\n");
1399 devt = MKDEV(portdev->chr_major, id);
1402 dev_err(&port->portdev->vdev->dev,
1406 port->dev = device_create(pdrvdata.class, &port->portdev->vdev->dev,
1408 port->portdev->vdev->index, id);
1411 dev_err(&port->portdev->vdev->dev,
1431 if (is_rproc_serial(port->portdev->vdev))
1438 else if (!use_multiport(port->portdev)) {
1448 spin_lock_irq(&portdev->ports_lock);
1449 list_add_tail(&port->list, &port->portdev->ports);
1450 spin_unlock_irq(&portdev->ports_lock);
1465 port->portdev->vdev->index, id);
1482 __send_control_msg(portdev, id, VIRTIO_CONSOLE_PORT_READY, 0);
1509 * Port got unplugged. Remove port from portdev's list and drop the
1515 spin_lock_irq(&port->portdev->ports_lock);
1517 spin_unlock_irq(&port->portdev->ports_lock);
1546 port->portdev = NULL;
1565 struct ports_device *portdev,
1575 port = find_port_by_id(portdev, virtio32_to_cpu(vdev, cpkt->id));
1579 dev_dbg(&portdev->vdev->dev,
1587 dev_dbg(&portdev->vdev->dev,
1593 portdev->max_nr_ports) {
1594 dev_warn(&portdev->vdev->dev,
1597 cpkt->id, portdev->max_nr_ports - 1);
1600 add_port(portdev, virtio32_to_cpu(vdev, cpkt->id));
1703 struct ports_device *portdev;
1708 portdev = container_of(work, struct ports_device, control_work);
1709 vq = portdev->c_ivq;
1711 spin_lock(&portdev->c_ivq_lock);
1713 spin_unlock(&portdev->c_ivq_lock);
1718 handle_control_message(vq->vdev, portdev, buf);
1720 spin_lock(&portdev->c_ivq_lock);
1721 if (add_inbuf(portdev->c_ivq, buf) < 0) {
1722 dev_warn(&portdev->vdev->dev,
1727 spin_unlock(&portdev->c_ivq_lock);
1783 if (!port->guest_connected && !is_rproc_serial(port->portdev->vdev))
1799 struct ports_device *portdev;
1801 portdev = vq->vdev->priv;
1802 schedule_work(&portdev->control_work);
1807 struct ports_device *portdev;
1809 portdev = vdev->priv;
1811 if (!use_multiport(portdev))
1812 schedule_work(&portdev->config_work);
1817 struct ports_device *portdev;
1819 portdev = container_of(work, struct ports_device, config_work);
1820 if (!use_multiport(portdev)) {
1825 vdev = portdev->vdev;
1829 port = find_port_by_id(portdev, 0);
1843 static int init_vqs(struct ports_device *portdev)
1851 nr_ports = portdev->max_nr_ports;
1852 nr_queues = use_multiport(portdev) ? (nr_ports + 1) * 2 : 2;
1858 portdev->in_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
1860 portdev->out_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
1862 if (!vqs || !io_callbacks || !io_names || !portdev->in_vqs ||
1863 !portdev->out_vqs) {
1880 if (use_multiport(portdev)) {
1895 err = virtio_find_vqs(portdev->vdev, nr_queues, vqs,
1902 portdev->in_vqs[0] = vqs[0];
1903 portdev->out_vqs[0] = vqs[1];
1905 if (use_multiport(portdev)) {
1906 portdev->c_ivq = vqs[j];
1907 portdev->c_ovq = vqs[j + 1];
1911 portdev->in_vqs[i] = vqs[j];
1912 portdev->out_vqs[i] = vqs[j + 1];
1922 kfree(portdev->out_vqs);
1923 kfree(portdev->in_vqs);
1935 static void remove_vqs(struct ports_device *portdev)
1939 virtio_device_for_each_vq(portdev->vdev, vq) {
1946 portdev->vdev->config->del_vqs(portdev->vdev);
1947 kfree(portdev->in_vqs);
1948 kfree(portdev->out_vqs);
1953 struct ports_device *portdev;
1956 portdev = vdev->priv;
1959 list_del(&portdev->list);
1964 if (use_multiport(portdev))
1965 flush_work(&portdev->control_work);
1967 flush_work(&portdev->config_work);
1972 if (use_multiport(portdev))
1973 cancel_work_sync(&portdev->control_work);
1975 cancel_work_sync(&portdev->config_work);
1977 list_for_each_entry_safe(port, port2, &portdev->ports, list)
1980 unregister_chrdev(portdev->chr_major, "virtio-portsdev");
1990 remove_vqs(portdev);
1991 kfree(portdev);
2004 struct ports_device *portdev;
2021 portdev = kmalloc(sizeof(*portdev), GFP_KERNEL);
2022 if (!portdev) {
2027 /* Attach this portdev to this virtio_device, and vice-versa. */
2028 portdev->vdev = vdev;
2029 vdev->priv = portdev;
2031 portdev->chr_major = register_chrdev(0, "virtio-portsdev",
2033 if (portdev->chr_major < 0) {
2036 portdev->chr_major, vdev->index);
2037 err = portdev->chr_major;
2042 portdev->max_nr_ports = 1;
2048 &portdev->max_nr_ports) == 0) {
2052 err = init_vqs(portdev);
2058 spin_lock_init(&portdev->ports_lock);
2059 INIT_LIST_HEAD(&portdev->ports);
2060 INIT_LIST_HEAD(&portdev->list);
2062 virtio_device_ready(portdev->vdev);
2064 INIT_WORK(&portdev->config_work, &config_work_handler);
2065 INIT_WORK(&portdev->control_work, &control_work_handler);
2068 spin_lock_init(&portdev->c_ivq_lock);
2069 spin_lock_init(&portdev->c_ovq_lock);
2071 err = fill_queue(portdev->c_ivq, &portdev->c_ivq_lock);
2079 __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID,
2090 add_port(portdev, 0);
2094 list_add_tail(&portdev->list, &pdrvdata.portdevs);
2097 __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID,
2115 unregister_chrdev(portdev->chr_major, "virtio-portsdev");
2117 kfree(portdev);
2147 struct ports_device *portdev;
2150 portdev = vdev->priv;
2154 if (use_multiport(portdev))
2155 virtqueue_disable_cb(portdev->c_ivq);
2156 cancel_work_sync(&portdev->control_work);
2157 cancel_work_sync(&portdev->config_work);
2162 if (use_multiport(portdev))
2163 virtqueue_disable_cb(portdev->c_ivq);
2165 list_for_each_entry(port, &portdev->ports, list) {
2175 remove_vqs(portdev);
2182 struct ports_device *portdev;
2186 portdev = vdev->priv;
2188 ret = init_vqs(portdev);
2192 virtio_device_ready(portdev->vdev);
2194 if (use_multiport(portdev))
2195 fill_queue(portdev->c_ivq, &portdev->c_ivq_lock);
2197 list_for_each_entry(port, &portdev->ports, list) {
2198 port->in_vq = portdev->in_vqs[port->id];
2199 port->out_vq = portdev->out_vqs[port->id];