|
@@ -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 = {
|