PCI: portdrv: Restore PCI config state on slot reset
authorKeith Busch <keith.busch@intel.com>
Thu, 20 Sep 2018 16:27:07 +0000 (10:27 -0600)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 20 Sep 2018 21:06:18 +0000 (16:06 -0500)
The port's config space may be cleared after a link reset, which wipes out
the bridge's bus and memory windows.  Restore the config space that was
saved during probe so we can access downstream devices.

Signed-off-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Sinan Kaya <okaya@kernel.org>
drivers/pci/pcie/portdrv_pci.c

index 23a5a0c2c3fe9021252475e97eef03789d7d0d5d..17256733fa430d307b401bfeaccd498110747db4 100644 (file)
@@ -146,6 +146,13 @@ static pci_ers_result_t pcie_portdrv_error_detected(struct pci_dev *dev,
        return PCI_ERS_RESULT_CAN_RECOVER;
 }
 
+static pci_ers_result_t pcie_portdrv_slot_reset(struct pci_dev *dev)
+{
+       pci_restore_state(dev);
+       pci_save_state(dev);
+       return PCI_ERS_RESULT_RECOVERED;
+}
+
 static pci_ers_result_t pcie_portdrv_mmio_enabled(struct pci_dev *dev)
 {
        return PCI_ERS_RESULT_RECOVERED;
@@ -185,6 +192,7 @@ static const struct pci_device_id port_pci_ids[] = { {
 
 static const struct pci_error_handlers pcie_portdrv_err_handler = {
        .error_detected = pcie_portdrv_error_detected,
+       .slot_reset = pcie_portdrv_slot_reset,
        .mmio_enabled = pcie_portdrv_mmio_enabled,
        .resume = pcie_portdrv_err_resume,
 };