Commit 9a92c509 authored by Alex Williamson's avatar Alex Williamson
Browse files

vfio-pci: Enable device before attempting reset



Devices making use of PM reset are getting incorrectly identified as
not supporting reset because pci_pm_reset() fails unless the device is
in D0 power state.  When first attached to vfio_pci devices are
typically in an unknown power state.  We can fix this by explicitly
setting the power state or simply calling pci_enable_device() before
attempting a pci_reset_function().  We need to enable the device
anyway, so move this up in our vfio_pci_enable() function, which also
simplifies the error path a bit.

Note that pci_disable_device() does not explicitly set the power
state, so there's no need to re-order vfio_pci_disable().
Signed-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
parent 05bf3aac
......@@ -43,6 +43,10 @@ static int vfio_pci_enable(struct vfio_pci_device *vdev)
u16 cmd;
u8 msix_pos;
ret = pci_enable_device(pdev);
if (ret)
return ret;
vdev->reset_works = (pci_reset_function(pdev) == 0);
pci_save_state(pdev);
vdev->pci_saved_state = pci_store_saved_state(pdev);
......@@ -51,8 +55,11 @@ static int vfio_pci_enable(struct vfio_pci_device *vdev)
__func__, dev_name(&pdev->dev));
ret = vfio_config_init(vdev);
if (ret)
goto out;
if (ret) {
pci_load_and_free_saved_state(pdev, &vdev->pci_saved_state);
pci_disable_device(pdev);
return ret;
}
if (likely(!nointxmask))
vdev->pci_2_3 = pci_intx_mask_supported(pdev);
......@@ -77,17 +84,7 @@ static int vfio_pci_enable(struct vfio_pci_device *vdev)
} else
vdev->msix_bar = 0xFF;
ret = pci_enable_device(pdev);
if (ret)
goto out;
return ret;
out:
kfree(vdev->pci_saved_state);
vdev->pci_saved_state = NULL;
vfio_config_free(vdev);
return ret;
return 0;
}
static void vfio_pci_disable(struct vfio_pci_device *vdev)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment