void pci_aer_exit(struct pci_dev *dev);
 extern const struct attribute_group aer_stats_attr_group;
 void pci_aer_clear_fatal_status(struct pci_dev *dev);
+void pci_aer_clear_device_status(struct pci_dev *dev);
 #else
 static inline void pci_no_aer(void) { }
 static inline int pci_aer_init(struct pci_dev *d) { return -ENODEV; }
 static inline void pci_aer_exit(struct pci_dev *d) { }
 static inline void pci_aer_clear_fatal_status(struct pci_dev *dev) { }
+static inline void pci_aer_clear_device_status(struct pci_dev *dev) { }
 #endif
 
 #endif /* DRIVERS_PCI_H */
 
 }
 EXPORT_SYMBOL_GPL(pci_disable_pcie_error_reporting);
 
+void pci_aer_clear_device_status(struct pci_dev *dev)
+{
+       u16 sta;
+
+       pcie_capability_read_word(dev, PCI_EXP_DEVSTA, &sta);
+       pcie_capability_write_word(dev, PCI_EXP_DEVSTA, sta);
+}
+
 int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev)
 {
        int pos;
  */
 static void aer_error_resume(struct pci_dev *dev)
 {
-       u16 reg16;
-
-       /* Clean up Root device status */
-       pcie_capability_read_word(dev, PCI_EXP_DEVSTA, ®16);
-       pcie_capability_write_word(dev, PCI_EXP_DEVSTA, reg16);
-
+       pci_aer_clear_device_status(dev);
        pci_cleanup_aer_uncorrect_error_status(dev);
 }
 
 
                        dev->error_state = state;
                pci_walk_bus(dev->subordinate, cb, &result_data);
                if (cb == report_resume) {
+                       pci_aer_clear_device_status(dev);
                        pci_cleanup_aer_uncorrect_error_status(dev);
                        dev->error_state = pci_channel_io_normal;
                }
                 * of the bridge and clear the error status of the bridge.
                 */
                pci_aer_clear_fatal_status(dev);
+               pci_aer_clear_device_status(dev);
        }
 
        if (result == PCI_ERS_RESULT_RECOVERED) {