Index: src/drivers/net/ethernet/intel/ice/ice_backport_compat.h =================================================================== --- src.orig/drivers/net/ethernet/intel/ice/ice_backport_compat.h 2020-08-27 23:41:54.067426597 +0200 +++ src/drivers/net/ethernet/intel/ice/ice_backport_compat.h 2020-08-27 23:44:20.729496531 +0200 @@ -37,4 +37,47 @@ } +static inline struct pci_bus *find_pci_root_bus_dup(struct pci_bus *bus) +{ + while (bus->parent) + bus = bus->parent; + + return bus; +} + +static inline struct pci_host_bridge *pci_find_host_bridge_dup(struct pci_bus *bus) +{ + struct pci_bus *root_bus = find_pci_root_bus_dup(bus); + + return to_pci_host_bridge(root_bus->bridge); +} + +static inline int pcie_aer_is_native(struct pci_dev *dev) +{ + struct pci_host_bridge *host = pci_find_host_bridge_dup(dev->bus); + + if (!dev->aer_cap) + return 0; + + return /* pcie_ports_native || */ host->native_aer; +} + +static inline int pci_aer_clear_nonfatal_status(struct pci_dev *dev) +{ + int aer = dev->aer_cap; + u32 status, sev; + + if (!pcie_aer_is_native(dev)) + return -EIO; + + /* Clear status bits for ERR_NONFATAL errors only */ + pci_read_config_dword(dev, aer + PCI_ERR_UNCOR_STATUS, &status); + pci_read_config_dword(dev, aer + PCI_ERR_UNCOR_SEVER, &sev); + status &= ~sev; + if (status) + pci_write_config_dword(dev, aer + PCI_ERR_UNCOR_STATUS, status); + + return 0; +} + #endif /* ICE_BACKPORT_COMPAT_H */