Commit 3c282db1 authored by Bjorn Helgaas's avatar Bjorn Helgaas

Merge branch 'pci/misc' into next

* pci/misc:
  PCI/AER: Report success only when every device has AER-aware driver

Conflicts:
	drivers/pci/pcie/aer/aerdrv_core.c
parents d3fe3988 918b4053
...@@ -87,6 +87,9 @@ struct aer_broadcast_data { ...@@ -87,6 +87,9 @@ struct aer_broadcast_data {
static inline pci_ers_result_t merge_result(enum pci_ers_result orig, static inline pci_ers_result_t merge_result(enum pci_ers_result orig,
enum pci_ers_result new) enum pci_ers_result new)
{ {
if (new == PCI_ERS_RESULT_NO_AER_DRIVER)
return PCI_ERS_RESULT_NO_AER_DRIVER;
if (new == PCI_ERS_RESULT_NONE) if (new == PCI_ERS_RESULT_NONE)
return orig; return orig;
...@@ -97,7 +100,7 @@ static inline pci_ers_result_t merge_result(enum pci_ers_result orig, ...@@ -97,7 +100,7 @@ static inline pci_ers_result_t merge_result(enum pci_ers_result orig,
break; break;
case PCI_ERS_RESULT_DISCONNECT: case PCI_ERS_RESULT_DISCONNECT:
if (new == PCI_ERS_RESULT_NEED_RESET) if (new == PCI_ERS_RESULT_NEED_RESET)
orig = new; orig = PCI_ERS_RESULT_NEED_RESET;
break; break;
default: default:
break; break;
......
...@@ -232,13 +232,27 @@ static int report_error_detected(struct pci_dev *dev, void *data) ...@@ -232,13 +232,27 @@ static int report_error_detected(struct pci_dev *dev, void *data)
dev->driver ? dev->driver ?
"no AER-aware driver" : "no 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); result_data->result = merge_result(result_data->result, vote);
out:
device_unlock(&dev->dev); device_unlock(&dev->dev);
return 0; return 0;
} }
......
...@@ -538,6 +538,9 @@ enum pci_ers_result { ...@@ -538,6 +538,9 @@ enum pci_ers_result {
/* Device driver is fully recovered and operational */ /* Device driver is fully recovered and operational */
PCI_ERS_RESULT_RECOVERED = (__force pci_ers_result_t) 5, PCI_ERS_RESULT_RECOVERED = (__force pci_ers_result_t) 5,
/* No AER capabilities registered for the driver */
PCI_ERS_RESULT_NO_AER_DRIVER = (__force pci_ers_result_t) 6,
}; };
/* PCI bus error event callbacks */ /* PCI bus error event callbacks */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment