lkml.org 
[lkml]   [2019]   [Aug]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] PCI: PM: Also move to D0 before calling pci_legacy_resume_early()
    Date

    In pci_legacy_suspend_late(), the device state is moved to PCI_UNKNOWN.
    In pci_pm_thaw_noirq(), the state is supposed to be moved back to PCI_D0,
    but the current code misses the pci_legacy_resume_early() path, so the
    state remains in PCI_UNKNOWN in that path, and during hiberantion this
    causes an error for the Mellanox VF driver, which fails to enable
    MSI-X: pci_msi_supported() is false due to dev->current_state != PCI_D0:

    mlx4_core a6d1:00:02.0: Detected virtual function - running in slave mode
    mlx4_core a6d1:00:02.0: Sending reset
    mlx4_core a6d1:00:02.0: Sending vhcr0
    mlx4_core a6d1:00:02.0: HCA minimum page size:512
    mlx4_core a6d1:00:02.0: Timestamping is not supported in slave mode
    mlx4_core a6d1:00:02.0: INTx is not supported in multi-function mode, aborting
    PM: dpm_run_callback(): pci_pm_thaw+0x0/0xd7 returns -95
    PM: Device a6d1:00:02.0 failed to thaw: error -95

    Signed-off-by: Dexuan Cui <decui@microsoft.com>
    ---
    drivers/pci/pci-driver.c | 7 ++++---
    1 file changed, 4 insertions(+), 3 deletions(-)

    diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
    index 36dbe960306b..27dfc68db9e7 100644
    --- a/drivers/pci/pci-driver.c
    +++ b/drivers/pci/pci-driver.c
    @@ -1074,15 +1074,16 @@ static int pci_pm_thaw_noirq(struct device *dev)
    return error;
    }

    - if (pci_has_legacy_pm_support(pci_dev))
    - return pci_legacy_resume_early(dev);
    -
    /*
    * pci_restore_state() requires the device to be in D0 (because of MSI
    * restoration among other things), so force it into D0 in case the
    * driver's "freeze" callbacks put it into a low-power state directly.
    */
    pci_set_power_state(pci_dev, PCI_D0);
    +
    + if (pci_has_legacy_pm_support(pci_dev))
    + return pci_legacy_resume_early(dev);
    +
    pci_restore_state(pci_dev);

    if (drv && drv->pm && drv->pm->thaw_noirq)
    --
    2.19.1
    \
     
     \ /
      Last update: 2019-08-08 20:47    [W:3.105 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site