|
@@ -74,6 +74,34 @@ int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(pci_cleanup_aer_uncorrect_error_status);
|
|
|
|
|
|
+int pci_cleanup_aer_error_status_regs(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ int pos;
|
|
|
+ u32 status;
|
|
|
+ int port_type;
|
|
|
+
|
|
|
+ if (!pci_is_pcie(dev))
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
+ pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
|
|
|
+ if (!pos)
|
|
|
+ return -EIO;
|
|
|
+
|
|
|
+ port_type = pci_pcie_type(dev);
|
|
|
+ if (port_type == PCI_EXP_TYPE_ROOT_PORT) {
|
|
|
+ pci_read_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, &status);
|
|
|
+ pci_write_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, status);
|
|
|
+ }
|
|
|
+
|
|
|
+ pci_read_config_dword(dev, pos + PCI_ERR_COR_STATUS, &status);
|
|
|
+ pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS, status);
|
|
|
+
|
|
|
+ pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, &status);
|
|
|
+ pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS, status);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* add_error_device - list device to be handled
|
|
|
* @e_info: pointer to error info
|