diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2017-11-14 13:11:36 -0500 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2017-11-14 13:11:36 -0500 |
commit | 29d0d4411fafa1a934ff6ff00840df4f880add41 (patch) | |
tree | 749277ae8b4a8a90fdd978cf37986e5072a30ca2 | |
parent | d238be6957b2e57913f602fc4429813ca6027e93 (diff) | |
parent | 33ba90aa4d4432b884fc0ed57ba9dc12eb8fa288 (diff) |
Merge branch 'pci/host-thunder' into next
* pci/host-thunder:
PCI: Avoid slot reset if bridge itself is broken
PCI: Avoid bus reset if bridge itself is broken
PCI: Mark Cavium CN8xxx to avoid bus reset
-rw-r--r-- | drivers/pci/pci.c | 8 | ||||
-rw-r--r-- | drivers/pci/quirks.c | 7 |
2 files changed, 15 insertions, 0 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 50f148f154ab..b03e91aa8fec 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -4436,6 +4436,10 @@ static bool pci_bus_resetable(struct pci_bus *bus) | |||
4436 | { | 4436 | { |
4437 | struct pci_dev *dev; | 4437 | struct pci_dev *dev; |
4438 | 4438 | ||
4439 | |||
4440 | if (bus->self && (bus->self->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET)) | ||
4441 | return false; | ||
4442 | |||
4439 | list_for_each_entry(dev, &bus->devices, bus_list) { | 4443 | list_for_each_entry(dev, &bus->devices, bus_list) { |
4440 | if (dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET || | 4444 | if (dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET || |
4441 | (dev->subordinate && !pci_bus_resetable(dev->subordinate))) | 4445 | (dev->subordinate && !pci_bus_resetable(dev->subordinate))) |
@@ -4500,6 +4504,10 @@ static bool pci_slot_resetable(struct pci_slot *slot) | |||
4500 | { | 4504 | { |
4501 | struct pci_dev *dev; | 4505 | struct pci_dev *dev; |
4502 | 4506 | ||
4507 | if (slot->bus->self && | ||
4508 | (slot->bus->self->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET)) | ||
4509 | return false; | ||
4510 | |||
4503 | list_for_each_entry(dev, &slot->bus->devices, bus_list) { | 4511 | list_for_each_entry(dev, &slot->bus->devices, bus_list) { |
4504 | if (!dev->slot || dev->slot != slot) | 4512 | if (!dev->slot || dev->slot != slot) |
4505 | continue; | 4513 | continue; |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index cbe85e921ede..cb89ff5f9cb4 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -3365,6 +3365,13 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0032, quirk_no_bus_reset); | |||
3365 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003c, quirk_no_bus_reset); | 3365 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003c, quirk_no_bus_reset); |
3366 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0033, quirk_no_bus_reset); | 3366 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0033, quirk_no_bus_reset); |
3367 | 3367 | ||
3368 | /* | ||
3369 | * Root port on some Cavium CN8xxx chips do not successfully complete a bus | ||
3370 | * reset when used with certain child devices. After the reset, config | ||
3371 | * accesses to the child may fail. | ||
3372 | */ | ||
3373 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CAVIUM, 0xa100, quirk_no_bus_reset); | ||
3374 | |||
3368 | static void quirk_no_pm_reset(struct pci_dev *dev) | 3375 | static void quirk_no_pm_reset(struct pci_dev *dev) |
3369 | { | 3376 | { |
3370 | /* | 3377 | /* |