4.12-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Christoph Hellwig <h...@lst.de>

commit 52354b9d1f46aae7386db7bb8ec8484b5488087f upstream.

Implement the reset probing / reset chain directly in
__pci_probe_reset_function() and __pci_reset_function_locked()
respectively.

Link: http://lkml.kernel.org/r/20170601111039.8913-4-...@lst.de
Signed-off-by: Christoph Hellwig <h...@lst.de>
Signed-off-by: Bjorn Helgaas <bhelg...@google.com>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 drivers/pci/pci.c |  108 ++++++++++++++++++++++++++----------------------------
 1 file changed, 52 insertions(+), 56 deletions(-)

--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -4069,40 +4069,6 @@ static int pci_dev_reset_slot_function(s
        return pci_reset_hotplug_slot(dev->slot->hotplug, probe);
 }
 
-static int __pci_dev_reset(struct pci_dev *dev, int probe)
-{
-       int rc;
-
-       might_sleep();
-
-       rc = pci_dev_specific_reset(dev, probe);
-       if (rc != -ENOTTY)
-               goto done;
-
-       if (pcie_has_flr(dev)) {
-               if (!probe)
-                       pcie_flr(dev);
-               rc = 0;
-               goto done;
-       }
-
-       rc = pci_af_flr(dev, probe);
-       if (rc != -ENOTTY)
-               goto done;
-
-       rc = pci_pm_reset(dev, probe);
-       if (rc != -ENOTTY)
-               goto done;
-
-       rc = pci_dev_reset_slot_function(dev, probe);
-       if (rc != -ENOTTY)
-               goto done;
-
-       rc = pci_parent_bus_reset(dev, probe);
-done:
-       return rc;
-}
-
 static void pci_dev_lock(struct pci_dev *dev)
 {
        pci_cfg_access_lock(dev);
@@ -4179,21 +4145,6 @@ static void pci_dev_restore(struct pci_d
        pci_reset_notify(dev, false);
 }
 
-static int pci_dev_reset(struct pci_dev *dev, int probe)
-{
-       int rc;
-
-       if (!probe)
-               pci_dev_lock(dev);
-
-       rc = __pci_dev_reset(dev, probe);
-
-       if (!probe)
-               pci_dev_unlock(dev);
-
-       return rc;
-}
-
 /**
  * __pci_reset_function - reset a PCI device function
  * @dev: PCI device to reset
@@ -4213,7 +4164,13 @@ static int pci_dev_reset(struct pci_dev
  */
 int __pci_reset_function(struct pci_dev *dev)
 {
-       return pci_dev_reset(dev, 0);
+       int ret;
+
+       pci_dev_lock(dev);
+       ret = __pci_reset_function_locked(dev);
+       pci_dev_unlock(dev);
+
+       return ret;
 }
 EXPORT_SYMBOL_GPL(__pci_reset_function);
 
@@ -4238,7 +4195,27 @@ EXPORT_SYMBOL_GPL(__pci_reset_function);
  */
 int __pci_reset_function_locked(struct pci_dev *dev)
 {
-       return __pci_dev_reset(dev, 0);
+       int rc;
+
+       might_sleep();
+
+       rc = pci_dev_specific_reset(dev, 0);
+       if (rc != -ENOTTY)
+               return rc;
+       if (pcie_has_flr(dev)) {
+               pcie_flr(dev);
+               return 0;
+       }
+       rc = pci_af_flr(dev, 0);
+       if (rc != -ENOTTY)
+               return rc;
+       rc = pci_pm_reset(dev, 0);
+       if (rc != -ENOTTY)
+               return rc;
+       rc = pci_dev_reset_slot_function(dev, 0);
+       if (rc != -ENOTTY)
+               return rc;
+       return pci_parent_bus_reset(dev, 0);
 }
 EXPORT_SYMBOL_GPL(__pci_reset_function_locked);
 
@@ -4255,7 +4232,26 @@ EXPORT_SYMBOL_GPL(__pci_reset_function_l
  */
 int pci_probe_reset_function(struct pci_dev *dev)
 {
-       return pci_dev_reset(dev, 1);
+       int rc;
+
+       might_sleep();
+
+       rc = pci_dev_specific_reset(dev, 1);
+       if (rc != -ENOTTY)
+               return rc;
+       if (pcie_has_flr(dev))
+               return 0;
+       rc = pci_af_flr(dev, 1);
+       if (rc != -ENOTTY)
+               return rc;
+       rc = pci_pm_reset(dev, 1);
+       if (rc != -ENOTTY)
+               return rc;
+       rc = pci_dev_reset_slot_function(dev, 1);
+       if (rc != -ENOTTY)
+               return rc;
+
+       return pci_parent_bus_reset(dev, 1);
 }
 
 /**
@@ -4278,14 +4274,14 @@ int pci_reset_function(struct pci_dev *d
 {
        int rc;
 
-       rc = pci_dev_reset(dev, 1);
+       rc = pci_probe_reset_function(dev);
        if (rc)
                return rc;
 
        pci_dev_lock(dev);
        pci_dev_save_and_disable(dev);
 
-       rc = __pci_dev_reset(dev, 0);
+       rc = __pci_reset_function_locked(dev);
 
        pci_dev_restore(dev);
        pci_dev_unlock(dev);
@@ -4304,7 +4300,7 @@ int pci_try_reset_function(struct pci_de
 {
        int rc;
 
-       rc = pci_dev_reset(dev, 1);
+       rc = pci_probe_reset_function(dev);
        if (rc)
                return rc;
 
@@ -4312,7 +4308,7 @@ int pci_try_reset_function(struct pci_de
                return -EAGAIN;
 
        pci_dev_save_and_disable(dev);
-       rc = __pci_dev_reset(dev, 0);
+       rc = __pci_reset_function_locked(dev);
        pci_dev_unlock(dev);
 
        pci_dev_restore(dev);


Reply via email to