virtio-pci: move freeze/restore to virtio core
[cascardo/linux.git] / drivers / virtio / virtio_pci.c
index f39f4e7..d34ebfa 100644 (file)
@@ -57,9 +57,6 @@ struct virtio_pci_device
        /* Vectors allocated, excluding per-vq vectors if any */
        unsigned msix_used_vectors;
 
-       /* Status saved during hibernate/restore */
-       u8 saved_status;
-
        /* Whether we have vector per vq */
        bool per_vq_vectors;
 };
@@ -764,16 +761,9 @@ static int virtio_pci_freeze(struct device *dev)
 {
        struct pci_dev *pci_dev = to_pci_dev(dev);
        struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
-       struct virtio_driver *drv;
        int ret;
 
-       drv = container_of(vp_dev->vdev.dev.driver,
-                          struct virtio_driver, driver);
-
-       ret = 0;
-       vp_dev->saved_status = vp_get_status(&vp_dev->vdev);
-       if (drv && drv->freeze)
-               ret = drv->freeze(&vp_dev->vdev);
+       ret = virtio_device_freeze(&vp_dev->vdev);
 
        if (!ret)
                pci_disable_device(pci_dev);
@@ -784,54 +774,14 @@ static int virtio_pci_restore(struct device *dev)
 {
        struct pci_dev *pci_dev = to_pci_dev(dev);
        struct virtio_pci_device *vp_dev = pci_get_drvdata(pci_dev);
-       struct virtio_driver *drv;
-       unsigned status = 0;
        int ret;
 
-       drv = container_of(vp_dev->vdev.dev.driver,
-                          struct virtio_driver, driver);
-
        ret = pci_enable_device(pci_dev);
        if (ret)
                return ret;
 
        pci_set_master(pci_dev);
-       /* We always start by resetting the device, in case a previous
-        * driver messed it up. */
-       vp_reset(&vp_dev->vdev);
-
-       /* Acknowledge that we've seen the device. */
-       status |= VIRTIO_CONFIG_S_ACKNOWLEDGE;
-       vp_set_status(&vp_dev->vdev, status);
-
-       /* Maybe driver failed before freeze.
-        * Restore the failed status, for debugging. */
-       status |= vp_dev->saved_status & VIRTIO_CONFIG_S_FAILED;
-       vp_set_status(&vp_dev->vdev, status);
-
-       if (!drv)
-               return 0;
-
-       /* We have a driver! */
-       status |= VIRTIO_CONFIG_S_DRIVER;
-       vp_set_status(&vp_dev->vdev, status);
-
-       vp_finalize_features(&vp_dev->vdev);
-
-       if (drv->restore) {
-               ret = drv->restore(&vp_dev->vdev);
-               if (ret) {
-                       status |= VIRTIO_CONFIG_S_FAILED;
-                       vp_set_status(&vp_dev->vdev, status);
-                       return ret;
-               }
-       }
-
-       /* Finally, tell the device we're all set */
-       status |= VIRTIO_CONFIG_S_DRIVER_OK;
-       vp_set_status(&vp_dev->vdev, status);
-
-       return ret;
+       return virtio_device_restore(&vp_dev->vdev);
 }
 
 static const struct dev_pm_ops virtio_pci_pm_ops = {