diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index e9d4fd861ba1c84a82f9561841d4e1da26715a2a..422bc0179e908122c6093b3e56e2c42e18bf188e 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -3197,7 +3197,7 @@ static int pci_pm_reset(struct pci_dev *dev, int probe) { u16 csr; - if (!dev->pm_cap) + if (!dev->pm_cap || dev->dev_flags & PCI_DEV_FLAGS_NO_PM_RESET) return -ENOTTY; pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &csr); diff --git a/include/linux/pci.h b/include/linux/pci.h index 44627f1df4caad4fac490add16bd012bd27e69fc..7bed32b3fd5433c3a07d6365e9c023306161e56d 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -177,6 +177,8 @@ enum pci_dev_flags { PCI_DEV_FLAG_PCIE_BRIDGE_ALIAS = (__force pci_dev_flags_t) (1 << 5), /* Do not use bus resets for device */ PCI_DEV_FLAGS_NO_BUS_RESET = (__force pci_dev_flags_t) (1 << 6), + /* Do not use PM reset even if device advertises NoSoftRst- */ + PCI_DEV_FLAGS_NO_PM_RESET = (__force pci_dev_flags_t) (1 << 7), }; enum pci_irq_reroute_variant {