lkml.org 
[lkml]   [2021]   [Jun]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 45/57] Revert "PCI: PM: Do not read power state in pci_enable_device_flags()"
    Date
    From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>

    [ Upstream commit 4d6035f9bf4ea12776322746a216e856dfe46698 ]

    Revert commit 4514d991d992 ("PCI: PM: Do not read power state in
    pci_enable_device_flags()") that is reported to cause PCI device
    initialization issues on some systems.

    BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=213481
    Link: https://lore.kernel.org/linux-acpi/YNDoGICcg0V8HhpQ@eldamar.lan
    Reported-by: Michael <phyre@rogers.com>
    Reported-by: Salvatore Bonaccorso <carnil@debian.org>
    Fixes: 4514d991d992 ("PCI: PM: Do not read power state in pci_enable_device_flags()")
    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/pci/pci.c | 16 +++++++++++++---
    1 file changed, 13 insertions(+), 3 deletions(-)

    diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
    index 22e8172f373d..b7f65fc54dc2 100644
    --- a/drivers/pci/pci.c
    +++ b/drivers/pci/pci.c
    @@ -1328,11 +1328,21 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
    int err;
    int i, bars = 0;

    - if (atomic_inc_return(&dev->enable_cnt) > 1) {
    - pci_update_current_state(dev, dev->current_state);
    - return 0; /* already enabled */
    + /*
    + * Power state could be unknown at this point, either due to a fresh
    + * boot or a device removal call. So get the current power state
    + * so that things like MSI message writing will behave as expected
    + * (e.g. if the device really is in D0 at enable time).
    + */
    + if (dev->pm_cap) {
    + u16 pmcsr;
    + pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);
    + dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK);
    }

    + if (atomic_inc_return(&dev->enable_cnt) > 1)
    + return 0; /* already enabled */
    +
    bridge = pci_upstream_bridge(dev);
    if (bridge)
    pci_enable_bridge(bridge);
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-06-28 17:40    [W:4.273 / U:0.616 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site