|
@@ -232,13 +232,27 @@ static int report_error_detected(struct pci_dev *dev, void *data)
|
|
|
dev->driver ?
|
|
|
"no AER-aware driver" : "no driver");
|
|
|
}
|
|
|
- goto out;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * If there's any device in the subtree that does not
|
|
|
+ * have an error_detected callback, returning
|
|
|
+ * PCI_ERS_RESULT_NO_AER_DRIVER prevents calling of
|
|
|
+ * the subsequent mmio_enabled/slot_reset/resume
|
|
|
+ * callbacks of "any" device in the subtree. All the
|
|
|
+ * devices in the subtree are left in the error state
|
|
|
+ * without recovery.
|
|
|
+ */
|
|
|
+
|
|
|
+ if (!(dev->hdr_type & PCI_HEADER_TYPE_BRIDGE))
|
|
|
+ vote = PCI_ERS_RESULT_NO_AER_DRIVER;
|
|
|
+ else
|
|
|
+ vote = PCI_ERS_RESULT_NONE;
|
|
|
+ } else {
|
|
|
+ err_handler = dev->driver->err_handler;
|
|
|
+ vote = err_handler->error_detected(dev, result_data->state);
|
|
|
}
|
|
|
|
|
|
- err_handler = dev->driver->err_handler;
|
|
|
- vote = err_handler->error_detected(dev, result_data->state);
|
|
|
result_data->result = merge_result(result_data->result, vote);
|
|
|
-out:
|
|
|
device_unlock(&dev->dev);
|
|
|
return 0;
|
|
|
}
|