Lines Matching refs:dev

54 static int virtio_pcidev_get_buf(struct virtio_pcidev_device *dev, bool *posted)  in virtio_pcidev_get_buf()  argument
59 if (!test_and_set_bit(i, dev->used_bufs)) in virtio_pcidev_get_buf()
67 static void virtio_pcidev_free_buf(struct virtio_pcidev_device *dev, void *buf) in virtio_pcidev_free_buf() argument
71 if (buf == &dev->bufs[VIRTIO_PCIDEV_WRITE_BUFS]) { in virtio_pcidev_free_buf()
72 kfree(dev->extra_ptrs[VIRTIO_PCIDEV_WRITE_BUFS]); in virtio_pcidev_free_buf()
73 dev->extra_ptrs[VIRTIO_PCIDEV_WRITE_BUFS] = NULL; in virtio_pcidev_free_buf()
78 if (buf == &dev->bufs[i]) { in virtio_pcidev_free_buf()
79 kfree(dev->extra_ptrs[i]); in virtio_pcidev_free_buf()
80 dev->extra_ptrs[i] = NULL; in virtio_pcidev_free_buf()
81 WARN_ON(!test_and_clear_bit(i, dev->used_bufs)); in virtio_pcidev_free_buf()
89 static int virtio_pcidev_send_cmd(struct virtio_pcidev_device *dev, in virtio_pcidev_send_cmd() argument
127 buf_idx = virtio_pcidev_get_buf(dev, &posted); in virtio_pcidev_send_cmd()
128 buf = &dev->bufs[buf_idx]; in virtio_pcidev_send_cmd()
132 dev->extra_ptrs[buf_idx] = kmemdup(extra, extra_size, in virtio_pcidev_send_cmd()
135 if (!dev->extra_ptrs[buf_idx]) { in virtio_pcidev_send_cmd()
136 virtio_pcidev_free_buf(dev, buf); in virtio_pcidev_send_cmd()
139 extra = dev->extra_ptrs[buf_idx]; in virtio_pcidev_send_cmd()
160 ret = virtqueue_add_sgs(dev->cmd_vq, sgs_list, in virtio_pcidev_send_cmd()
165 virtio_pcidev_free_buf(dev, buf); in virtio_pcidev_send_cmd()
170 virtqueue_kick(dev->cmd_vq); in virtio_pcidev_send_cmd()
175 set_bit(VIRTIO_PCIDEV_STAT_WAITING, &dev->status); in virtio_pcidev_send_cmd()
176 virtqueue_kick(dev->cmd_vq); in virtio_pcidev_send_cmd()
180 void *completed = virtqueue_get_buf(dev->cmd_vq, &len); in virtio_pcidev_send_cmd()
186 virtio_pcidev_free_buf(dev, completed); in virtio_pcidev_send_cmd()
188 if (WARN_ONCE(virtqueue_is_broken(dev->cmd_vq) || in virtio_pcidev_send_cmd()
196 clear_bit(VIRTIO_PCIDEV_STAT_WAITING, &dev->status); in virtio_pcidev_send_cmd()
201 virtio_pcidev_free_buf(dev, buf); in virtio_pcidev_send_cmd()
209 struct virtio_pcidev_device *dev = to_virtio_pcidev(pdev); in virtio_pcidev_cfgspace_read() local
221 if (virtio_pcidev_send_cmd(dev, &hdr, sizeof(hdr), NULL, 0, data, size)) in virtio_pcidev_cfgspace_read()
244 struct virtio_pcidev_device *dev = to_virtio_pcidev(pdev); in virtio_pcidev_cfgspace_write() local
275 WARN_ON(virtio_pcidev_send_cmd(dev, &msg.hdr, sizeof(msg), NULL, 0, NULL, 0)); in virtio_pcidev_cfgspace_write()
282 struct virtio_pcidev_device *dev = to_virtio_pcidev(pdev); in virtio_pcidev_bar_copy_from() local
292 virtio_pcidev_send_cmd(dev, &hdr, sizeof(hdr), NULL, 0, buffer, size); in virtio_pcidev_bar_copy_from()
324 struct virtio_pcidev_device *dev = to_virtio_pcidev(pdev); in virtio_pcidev_bar_copy_to() local
332 virtio_pcidev_send_cmd(dev, &hdr, sizeof(hdr), buffer, size, NULL, 0); in virtio_pcidev_bar_copy_to()
366 struct virtio_pcidev_device *dev = to_virtio_pcidev(pdev); in virtio_pcidev_bar_set() local
380 virtio_pcidev_send_cmd(dev, &msg.hdr, sizeof(msg), NULL, 0, NULL, 0); in virtio_pcidev_bar_set()
408 struct virtio_pcidev_device *dev = vdev->priv; in virtio_pcidev_handle_irq_message() local
410 if (!dev->pdev.irq) in virtio_pcidev_handle_irq_message()
417 generic_handle_irq(dev->pdev.irq); in virtio_pcidev_handle_irq_message()
430 dev_err(&vdev->dev, "unexpected virt-pci message %d\n", msg->op); in virtio_pcidev_handle_irq_message()
438 struct virtio_pcidev_device *dev = vdev->priv; in virtio_pcidev_cmd_vq_cb() local
442 if (test_bit(VIRTIO_PCIDEV_STAT_WAITING, &dev->status)) in virtio_pcidev_cmd_vq_cb()
446 virtio_pcidev_free_buf(dev, cmd); in virtio_pcidev_cmd_vq_cb()
463 static int virtio_pcidev_init_vqs(struct virtio_pcidev_device *dev) in virtio_pcidev_init_vqs() argument
472 err = virtio_find_vqs(dev->vdev, 2, vqs, vqs_info, NULL); in virtio_pcidev_init_vqs()
476 dev->cmd_vq = vqs[0]; in virtio_pcidev_init_vqs()
477 dev->irq_vq = vqs[1]; in virtio_pcidev_init_vqs()
479 virtio_device_ready(dev->vdev); in virtio_pcidev_init_vqs()
485 virtio_pcidev_irq_vq_addbuf(dev->irq_vq, msg, false); in virtio_pcidev_init_vqs()
488 virtqueue_kick(dev->irq_vq); in virtio_pcidev_init_vqs()
494 struct virtio_pcidev_device *dev) in __virtio_pcidev_virtio_platform_remove() argument
496 um_pci_platform_device_unregister(&dev->pdev); in __virtio_pcidev_virtio_platform_remove()
501 kfree(dev); in __virtio_pcidev_virtio_platform_remove()
505 struct virtio_pcidev_device *dev) in virtio_pcidev_virtio_platform_probe() argument
509 dev->platform = true; in virtio_pcidev_virtio_platform_probe()
511 err = virtio_pcidev_init_vqs(dev); in virtio_pcidev_virtio_platform_probe()
515 err = um_pci_platform_device_register(&dev->pdev); in virtio_pcidev_virtio_platform_probe()
519 err = of_platform_default_populate(vdev->dev.of_node, NULL, &vdev->dev); in virtio_pcidev_virtio_platform_probe()
526 um_pci_platform_device_unregister(&dev->pdev); in virtio_pcidev_virtio_platform_probe()
531 kfree(dev); in virtio_pcidev_virtio_platform_probe()
537 struct virtio_pcidev_device *dev; in virtio_pcidev_virtio_probe() local
540 dev = kzalloc(sizeof(*dev), GFP_KERNEL); in virtio_pcidev_virtio_probe()
541 if (!dev) in virtio_pcidev_virtio_probe()
544 dev->vdev = vdev; in virtio_pcidev_virtio_probe()
545 vdev->priv = dev; in virtio_pcidev_virtio_probe()
547 dev->pdev.ops = &virtio_pcidev_um_pci_ops; in virtio_pcidev_virtio_probe()
549 if (of_device_is_compatible(vdev->dev.of_node, "simple-bus")) in virtio_pcidev_virtio_probe()
550 return virtio_pcidev_virtio_platform_probe(vdev, dev); in virtio_pcidev_virtio_probe()
552 err = virtio_pcidev_init_vqs(dev); in virtio_pcidev_virtio_probe()
556 err = um_pci_device_register(&dev->pdev); in virtio_pcidev_virtio_probe()
560 device_set_wakeup_enable(&vdev->dev, true); in virtio_pcidev_virtio_probe()
574 kfree(dev); in virtio_pcidev_virtio_probe()
580 struct virtio_pcidev_device *dev = vdev->priv; in virtio_pcidev_virtio_remove() local
582 if (dev->platform) { in virtio_pcidev_virtio_remove()
583 of_platform_depopulate(&vdev->dev); in virtio_pcidev_virtio_remove()
584 __virtio_pcidev_virtio_platform_remove(vdev, dev); in virtio_pcidev_virtio_remove()
588 device_set_wakeup_enable(&vdev->dev, false); in virtio_pcidev_virtio_remove()
590 um_pci_device_unregister(&dev->pdev); in virtio_pcidev_virtio_remove()
594 dev->cmd_vq = NULL; in virtio_pcidev_virtio_remove()
595 dev->irq_vq = NULL; in virtio_pcidev_virtio_remove()
598 kfree(dev); in virtio_pcidev_virtio_remove()