| From foo@baz Thu Dec 21 09:02:40 CET 2017 |
| From: David Daney <david.daney@cavium.com> |
| Date: Fri, 8 Sep 2017 10:10:31 +0200 |
| Subject: PCI: Avoid bus reset if bridge itself is broken |
| |
| From: David Daney <david.daney@cavium.com> |
| |
| |
| [ Upstream commit 357027786f3523d26f42391aa4c075b8495e5d28 ] |
| |
| When checking to see if a PCI bus can safely be reset, we previously |
| checked to see if any of the children had their PCI_DEV_FLAGS_NO_BUS_RESET |
| flag set. Children marked with that flag are known not to behave well |
| after a bus reset. |
| |
| Some PCIe root port bridges also do not behave well after a bus reset, |
| sometimes causing the devices behind the bridge to become unusable. |
| |
| Add a check for PCI_DEV_FLAGS_NO_BUS_RESET being set in the bridge device |
| to allow these bridges to be flagged, and prevent their secondary buses |
| from being reset. |
| |
| Signed-off-by: David Daney <david.daney@cavium.com> |
| [jglauber@cavium.com: fixed typo] |
| Signed-off-by: Jan Glauber <jglauber@cavium.com> |
| Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> |
| Reviewed-by: Alex Williamson <alex.williamson@redhat.com> |
| |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/pci/pci.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/drivers/pci/pci.c |
| +++ b/drivers/pci/pci.c |
| @@ -4214,6 +4214,10 @@ static bool pci_bus_resetable(struct pci |
| { |
| struct pci_dev *dev; |
| |
| + |
| + if (bus->self && (bus->self->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET)) |
| + return false; |
| + |
| list_for_each_entry(dev, &bus->devices, bus_list) { |
| if (dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET || |
| (dev->subordinate && !pci_bus_resetable(dev->subordinate))) |