|
@@ -258,7 +258,6 @@ static void handle_error_source(struct pcie_device *aerdev,
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_ACPI_APEI_PCIEAER
|
|
|
-static void aer_recover_work_func(struct work_struct *work);
|
|
|
|
|
|
#define AER_RECOVER_RING_ORDER 4
|
|
|
#define AER_RECOVER_RING_SIZE (1 << AER_RECOVER_RING_ORDER)
|
|
@@ -273,6 +272,30 @@ struct aer_recover_entry {
|
|
|
|
|
|
static DEFINE_KFIFO(aer_recover_ring, struct aer_recover_entry,
|
|
|
AER_RECOVER_RING_SIZE);
|
|
|
+
|
|
|
+static void aer_recover_work_func(struct work_struct *work)
|
|
|
+{
|
|
|
+ struct aer_recover_entry entry;
|
|
|
+ struct pci_dev *pdev;
|
|
|
+
|
|
|
+ while (kfifo_get(&aer_recover_ring, &entry)) {
|
|
|
+ pdev = pci_get_domain_bus_and_slot(entry.domain, entry.bus,
|
|
|
+ entry.devfn);
|
|
|
+ if (!pdev) {
|
|
|
+ pr_err("AER recover: Can not find pci_dev for %04x:%02x:%02x:%x\n",
|
|
|
+ entry.domain, entry.bus,
|
|
|
+ PCI_SLOT(entry.devfn), PCI_FUNC(entry.devfn));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ cper_print_aer(pdev, entry.severity, entry.regs);
|
|
|
+ if (entry.severity == AER_NONFATAL)
|
|
|
+ pcie_do_nonfatal_recovery(pdev);
|
|
|
+ else if (entry.severity == AER_FATAL)
|
|
|
+ pcie_do_fatal_recovery(pdev, PCIE_PORT_SERVICE_AER);
|
|
|
+ pci_dev_put(pdev);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Mutual exclusion for writers of aer_recover_ring, reader side don't
|
|
|
* need lock, because there is only one reader and lock is not needed
|
|
@@ -302,29 +325,6 @@ void aer_recover_queue(int domain, unsigned int bus, unsigned int devfn,
|
|
|
spin_unlock_irqrestore(&aer_recover_ring_lock, flags);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(aer_recover_queue);
|
|
|
-
|
|
|
-static void aer_recover_work_func(struct work_struct *work)
|
|
|
-{
|
|
|
- struct aer_recover_entry entry;
|
|
|
- struct pci_dev *pdev;
|
|
|
-
|
|
|
- while (kfifo_get(&aer_recover_ring, &entry)) {
|
|
|
- pdev = pci_get_domain_bus_and_slot(entry.domain, entry.bus,
|
|
|
- entry.devfn);
|
|
|
- if (!pdev) {
|
|
|
- pr_err("AER recover: Can not find pci_dev for %04x:%02x:%02x:%x\n",
|
|
|
- entry.domain, entry.bus,
|
|
|
- PCI_SLOT(entry.devfn), PCI_FUNC(entry.devfn));
|
|
|
- continue;
|
|
|
- }
|
|
|
- cper_print_aer(pdev, entry.severity, entry.regs);
|
|
|
- if (entry.severity == AER_NONFATAL)
|
|
|
- pcie_do_nonfatal_recovery(pdev);
|
|
|
- else if (entry.severity == AER_FATAL)
|
|
|
- pcie_do_fatal_recovery(pdev, PCIE_PORT_SERVICE_AER);
|
|
|
- pci_dev_put(pdev);
|
|
|
- }
|
|
|
-}
|
|
|
#endif
|
|
|
|
|
|
/**
|