When we see 'can't recover (no error_detected callback)' on console,
Maybe the reason is io state is not changed by calling
pci_dev_set_io_state(), that is confused. fix it.

Signed-off-by: Ethan Zhao <haifeng.z...@intel.com>
Tested-by: Wen Jin <wen....@intel.com>
Tested-by: Shanshan Zhang <shanshanx.zh...@intel.com>
---
Chagnes:
 V2: no change.
 V3: no change.
 V4: no change.

 drivers/pci/pcie/err.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/pci/pcie/err.c b/drivers/pci/pcie/err.c
index e35c4480c86b..d85f27c90c26 100644
--- a/drivers/pci/pcie/err.c
+++ b/drivers/pci/pcie/err.c
@@ -55,8 +55,10 @@ static int report_error_detected(struct pci_dev *dev,
        if (!pci_dev_get(dev))
                return 0;
        device_lock(&dev->dev);
-       if (!pci_dev_set_io_state(dev, state) ||
-               !dev->driver ||
+       if (!pci_dev_set_io_state(dev, state)) {
+               pci_dbg(dev, "Device might already being in error handling 
...\n");
+               vote = PCI_ERS_RESULT_NONE;
+       } else if (!dev->driver ||
                !dev->driver->err_handler ||
                !dev->driver->err_handler->error_detected) {
                /*
-- 
2.18.4

Reply via email to