Skip to content

Commit

Permalink
vfio-pci: Enable device before attempting reset
Browse files Browse the repository at this point in the history
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: Alex Williamson <alex.williamson@redhat.com>
  • Loading branch information
Alex Williamson committed Dec 7, 2012
1 parent 05bf3aa commit 9a92c50
Showing 1 changed file with 10 additions and 13 deletions.
23 changes: 10 additions & 13 deletions drivers/vfio/pci/vfio_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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)
Expand Down

0 comments on commit 9a92c50

Please sign in to comment.