|
@@ -2057,7 +2057,7 @@ static pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev,
|
|
|
{
|
|
|
struct cxl *adapter = pci_get_drvdata(pdev);
|
|
|
struct cxl_afu *afu;
|
|
|
- pci_ers_result_t result = PCI_ERS_RESULT_NEED_RESET;
|
|
|
+ pci_ers_result_t result = PCI_ERS_RESULT_NEED_RESET, afu_result;
|
|
|
int i;
|
|
|
|
|
|
/* At this point, we could still have an interrupt pending.
|
|
@@ -2162,15 +2162,18 @@ static pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev,
|
|
|
for (i = 0; i < adapter->slices; i++) {
|
|
|
afu = adapter->afu[i];
|
|
|
|
|
|
- result = cxl_vphb_error_detected(afu, state);
|
|
|
-
|
|
|
- /* Only continue if everyone agrees on NEED_RESET */
|
|
|
- if (result != PCI_ERS_RESULT_NEED_RESET)
|
|
|
- return result;
|
|
|
+ afu_result = cxl_vphb_error_detected(afu, state);
|
|
|
|
|
|
cxl_context_detach_all(afu);
|
|
|
cxl_ops->afu_deactivate_mode(afu, afu->current_mode);
|
|
|
pci_deconfigure_afu(afu);
|
|
|
+
|
|
|
+ /* Disconnect trumps all, NONE trumps NEED_RESET */
|
|
|
+ if (afu_result == PCI_ERS_RESULT_DISCONNECT)
|
|
|
+ result = PCI_ERS_RESULT_DISCONNECT;
|
|
|
+ else if ((afu_result == PCI_ERS_RESULT_NONE) &&
|
|
|
+ (result == PCI_ERS_RESULT_NEED_RESET))
|
|
|
+ result = PCI_ERS_RESULT_NONE;
|
|
|
}
|
|
|
|
|
|
/* should take the context lock here */
|