aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjorn Helgaas <bhelgaas@google.com>2017-11-14 13:11:36 -0500
committerBjorn Helgaas <bhelgaas@google.com>2017-11-14 13:11:36 -0500
commit29d0d4411fafa1a934ff6ff00840df4f880add41 (patch)
tree749277ae8b4a8a90fdd978cf37986e5072a30ca2
parentd238be6957b2e57913f602fc4429813ca6027e93 (diff)
parent33ba90aa4d4432b884fc0ed57ba9dc12eb8fa288 (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.c8
-rw-r--r--drivers/pci/quirks.c7
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);
3365DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003c, quirk_no_bus_reset); 3365DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x003c, quirk_no_bus_reset);
3366DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATHEROS, 0x0033, quirk_no_bus_reset); 3366DECLARE_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 */
3373DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_CAVIUM, 0xa100, quirk_no_bus_reset);
3374
3368static void quirk_no_pm_reset(struct pci_dev *dev) 3375static void quirk_no_pm_reset(struct pci_dev *dev)
3369{ 3376{
3370 /* 3377 /*