]> www.infradead.org Git - users/hch/misc.git/commitdiff
s390/pci: Use pci_uevent_ers() in PCI recovery
authorNiklas Schnelle <schnelle@linux.ibm.com>
Thu, 7 Aug 2025 13:55:39 +0000 (15:55 +0200)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 14 Aug 2025 20:56:28 +0000 (15:56 -0500)
Issue uevents on s390 during PCI recovery using pci_uevent_ers() as done by
EEH and AER PCIe recovery routines.

Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Lukas Wunner <lukas@wunner.de>
Link: https://patch.msgid.link/20250807-add_err_uevents-v5-2-adf85b0620b0@linux.ibm.com
arch/s390/pci/pci_event.c
drivers/pci/pci-driver.c
include/linux/pci.h

index d930416d4c903f709764b75fe45fb66e529fcc5b..b95376041501f479eee20705d45fb8c68553da71 100644 (file)
@@ -88,6 +88,7 @@ static pci_ers_result_t zpci_event_notify_error_detected(struct pci_dev *pdev,
        pci_ers_result_t ers_res = PCI_ERS_RESULT_DISCONNECT;
 
        ers_res = driver->err_handler->error_detected(pdev,  pdev->error_state);
+       pci_uevent_ers(pdev, ers_res);
        if (ers_result_indicates_abort(ers_res))
                pr_info("%s: Automatic recovery failed after initial reporting\n", pci_name(pdev));
        else if (ers_res == PCI_ERS_RESULT_NEED_RESET)
@@ -244,6 +245,7 @@ static pci_ers_result_t zpci_event_attempt_error_recovery(struct pci_dev *pdev)
                ers_res = PCI_ERS_RESULT_RECOVERED;
 
        if (ers_res != PCI_ERS_RESULT_RECOVERED) {
+               pci_uevent_ers(pdev, PCI_ERS_RESULT_DISCONNECT);
                pr_err("%s: Automatic recovery failed; operator intervention is required\n",
                       pci_name(pdev));
                status_str = "failed (driver can't recover)";
@@ -253,6 +255,7 @@ static pci_ers_result_t zpci_event_attempt_error_recovery(struct pci_dev *pdev)
        pr_info("%s: The device is ready to resume operations\n", pci_name(pdev));
        if (driver->err_handler->resume)
                driver->err_handler->resume(pdev);
+       pci_uevent_ers(pdev, PCI_ERS_RESULT_RECOVERED);
 out_unlock:
        pci_dev_unlock(pdev);
        zpci_report_status(zdev, "recovery", status_str);
index 6405acdb5d0f38ad599e5743c0da59a822272899..302d61783f6c04d9bbb32fd061bebca7673cfc80 100644 (file)
@@ -1582,7 +1582,7 @@ static int pci_uevent(const struct device *dev, struct kobj_uevent_env *env)
        return 0;
 }
 
-#if defined(CONFIG_PCIEAER) || defined(CONFIG_EEH)
+#if defined(CONFIG_PCIEAER) || defined(CONFIG_EEH) || defined(CONFIG_S390)
 /**
  * pci_uevent_ers - emit a uevent during recovery path of PCI device
  * @pdev: PCI device undergoing error recovery
index 59876de13860dbe50ee6c207cd57e54f51a11079..7735acf6f349052c8b6f51cd4657c08e9022d2ae 100644 (file)
@@ -2764,7 +2764,7 @@ static inline bool pci_is_thunderbolt_attached(struct pci_dev *pdev)
        return false;
 }
 
-#if defined(CONFIG_PCIEPORTBUS) || defined(CONFIG_EEH)
+#if defined(CONFIG_PCIEPORTBUS) || defined(CONFIG_EEH) || defined(CONFIG_S390)
 void pci_uevent_ers(struct pci_dev *pdev, enum  pci_ers_result err_type);
 #endif