From 7d86ca8db51f6b75b5c1470d6294c6f24221f560 Mon Sep 17 00:00:00 2001 From: GloriousEggroll Date: Mon, 30 Oct 2023 22:36:19 -0600 Subject: [PATCH] Revert "nvme-pci: drop redundant pci_enable_pcie_error_reporting()" This reverts commits: 1ad11eafc63ac16e667853bee4273879226d2d1b 7ec4b34be4234599cf1241ef807cdb7c3636f6fe 69b264df8a412820e98867dbab871c6526c5e5aa --- drivers/nvme/host/pci.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 3f0c9ee09a12..bc11bfe6f87a 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -5,6 +5,7 @@ */ #include +#include #include #include #include @@ -2537,6 +2538,7 @@ static int nvme_pci_enable(struct nvme_dev *dev) nvme_map_cmb(dev); + pci_enable_pcie_error_reporting(pdev); pci_save_state(pdev); result = nvme_pci_configure_admin_queue(dev); @@ -2601,8 +2603,10 @@ static void nvme_dev_disable(struct nvme_dev *dev, bool shutdown) nvme_suspend_io_queues(dev); nvme_suspend_queue(dev, 0); pci_free_irq_vectors(pdev); - if (pci_is_enabled(pdev)) + if (pci_is_enabled(pdev)) { + pci_disable_pcie_error_reporting(pdev); pci_disable_device(pdev); + } nvme_reap_pending_cqes(dev); nvme_cancel_tagset(&dev->ctrl); -- 2.41.0 diff --git a/include/linux/aer.h b/include/linux/aer.h index 29cc10220..94ce49a5f 100644 --- a/include/linux/aer.h +++ b/include/linux/aer.h @@ -41,9 +41,20 @@ struct aer_capability_regs { }; #if defined(CONFIG_PCIEAER) +/* PCIe port driver needs this function to enable AER */ +int pci_enable_pcie_error_reporting(struct pci_dev *dev); +int pci_disable_pcie_error_reporting(struct pci_dev *dev); int pci_aer_clear_nonfatal_status(struct pci_dev *dev); int pcie_aer_is_native(struct pci_dev *dev); #else +static inline int pci_enable_pcie_error_reporting(struct pci_dev *dev) +{ + return -EINVAL; +} +static inline int pci_disable_pcie_error_reporting(struct pci_dev *dev) +{ + return -EINVAL; +} static inline int pci_aer_clear_nonfatal_status(struct pci_dev *dev) { return -EINVAL; diff --git a/drivers/pci/pcie/aer.c b/drivers/pci/pcie/aer.c index 9c8fd69ae..0dc7be481 100644 --- a/drivers/pci/pcie/aer.c +++ b/drivers/pci/pcie/aer.c @@ -231,7 +231,7 @@ int pcie_aer_is_native(struct pci_dev *dev) } EXPORT_SYMBOL_NS_GPL(pcie_aer_is_native, CXL); -static int pci_enable_pcie_error_reporting(struct pci_dev *dev) +int pci_enable_pcie_error_reporting(struct pci_dev *dev) { int rc; @@ -241,6 +241,19 @@ static int pci_enable_pcie_error_reporting(struct pci_dev *dev) rc = pcie_capability_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_AER_FLAGS); return pcibios_err_to_errno(rc); } +EXPORT_SYMBOL_GPL(pci_enable_pcie_error_reporting); + +int pci_disable_pcie_error_reporting(struct pci_dev *dev) +{ + int rc; + + if (!pcie_aer_is_native(dev)) + return -EIO; + + rc = pcie_capability_clear_word(dev, PCI_EXP_DEVCTL, PCI_EXP_AER_FLAGS); + return pcibios_err_to_errno(rc); +} +EXPORT_SYMBOL_GPL(pci_disable_pcie_error_reporting); int pci_aer_clear_nonfatal_status(struct pci_dev *dev) {