Exemple #1
0
/*
 * removes a virtio device if a hot remove event has been
 * requested by the host.
 */
static int mic_remove_device(struct mic_device_desc __iomem *d,
	unsigned int offset, struct mic_driver *mdrv)
{
	struct mic_device_ctrl __iomem *dc
		= (void __iomem *)d + mic_aligned_desc_size(d);
	struct mic_vdev *mvdev = (struct mic_vdev *)ioread64(&dc->vdev);
	u8 status;
	int ret = -1;

	if (ioread8(&dc->config_change) == MIC_VIRTIO_PARAM_DEV_REMOVE) {
		dev_dbg(mdrv->dev,
			"%s %d config_change %d type %d mvdev %p\n",
			__func__, __LINE__,
			ioread8(&dc->config_change), ioread8(&d->type), mvdev);

		status = ioread8(&d->status);
		reinit_completion(&mvdev->reset_done);
		unregister_virtio_device(&mvdev->vdev);
		mic_free_card_irq(mvdev->virtio_cookie, mvdev);
		if (status & VIRTIO_CONFIG_S_DRIVER_OK)
			wait_for_completion(&mvdev->reset_done);
		kfree(mvdev);
		iowrite8(1, &dc->guest_ack);
		dev_dbg(mdrv->dev, "%s %d guest_ack %d\n",
			__func__, __LINE__, ioread8(&dc->guest_ack));
		ret = 0;
	}

	return ret;
}
Exemple #2
0
/*
 * removes a virtio device if a hot remove event has been
 * requested by the host.
 */
static int _vop_remove_device(struct mic_device_desc __iomem *d,
                              unsigned int offset, struct vop_device *vpdev)
{
    struct mic_device_ctrl __iomem *dc
        = (void __iomem *)d + _vop_aligned_desc_size(d);
    struct _vop_vdev *vdev = (struct _vop_vdev *)readq(&dc->vdev);
    u8 status;
    int ret = -1;

    if (ioread8(&dc->config_change) == MIC_VIRTIO_PARAM_DEV_REMOVE) {
        dev_dbg(&vpdev->dev,
                "%s %d config_change %d type %d vdev %p\n",
                __func__, __LINE__,
                ioread8(&dc->config_change), ioread8(&d->type), vdev);
        status = ioread8(&d->status);
        reinit_completion(&vdev->reset_done);
        unregister_virtio_device(&vdev->vdev);
        vpdev->hw_ops->free_irq(vpdev, vdev->virtio_cookie, vdev);
        iowrite8(-1, &dc->h2c_vdev_db);
        if (status & VIRTIO_CONFIG_S_DRIVER_OK)
            wait_for_completion(&vdev->reset_done);
        kfree(vdev);
        iowrite8(1, &dc->guest_ack);
        dev_dbg(&vpdev->dev, "%s %d guest_ack %d\n",
                __func__, __LINE__, ioread8(&dc->guest_ack));
        iowrite8(-1, &d->type);
        ret = 0;
    }
    return ret;
}
Exemple #3
0
static int __devexit virtio_mmio_remove(struct platform_device *pdev)
{
	struct virtio_mmio_device *vm_dev = platform_get_drvdata(pdev);

	unregister_virtio_device(&vm_dev->vdev);

	return 0;
}
static int zynq_rpmsg_deinitialize(struct platform_device *pdev)
{
	unregister_virtio_device(&(zynq_rpmsg_p->virtio_dev));

	put_device(&(zynq_rpmsg_p->mid_dev));

	dma_release_declared_memory(&pdev->dev);

	clear_ipi_handler(zynq_rpmsg_p->vring0);

	return 0;
}