Skip to content
23 changes: 23 additions & 0 deletions drivers/misc/pci_endpoint_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -1325,6 +1325,8 @@ static int pci_endpoint_test_probe(struct pci_dev *pdev,
misc_device->parent = &pdev->dev;
misc_device->fops = &pci_endpoint_test_fops;

pci_save_state(pdev);

ret = misc_register(misc_device);
if (ret) {
dev_err(dev, "Failed to register device\n");
Expand Down Expand Up @@ -1452,12 +1454,33 @@ static const struct pci_device_id pci_endpoint_test_tbl[] = {
};
MODULE_DEVICE_TABLE(pci, pci_endpoint_test_tbl);

static pci_ers_result_t pci_endpoint_test_error_detected(struct pci_dev *pdev,
pci_channel_state_t state)
{
if (state == pci_channel_io_perm_failure)
return PCI_ERS_RESULT_DISCONNECT;

return PCI_ERS_RESULT_NEED_RESET;
}

static pci_ers_result_t pci_endpoint_test_slot_reset(struct pci_dev *pdev)
{
pci_restore_state(pdev);
return PCI_ERS_RESULT_RECOVERED;
}

static const struct pci_error_handlers pci_endpoint_test_err_handler = {
.error_detected = pci_endpoint_test_error_detected,
.slot_reset = pci_endpoint_test_slot_reset,
};

static struct pci_driver pci_endpoint_test_driver = {
.name = DRV_MODULE_NAME,
.id_table = pci_endpoint_test_tbl,
.probe = pci_endpoint_test_probe,
.remove = pci_endpoint_test_remove,
.sriov_configure = pci_sriov_configure_simple,
.err_handler = &pci_endpoint_test_err_handler,
};
module_pci_driver(pci_endpoint_test_driver);

Expand Down
5 changes: 5 additions & 0 deletions drivers/pci/controller/dwc/pcie-designware-ep.c
Original file line number Diff line number Diff line change
Expand Up @@ -1153,6 +1153,11 @@ void dw_pcie_ep_cleanup(struct dw_pcie_ep *ep)
{
struct dw_pcie *pci = to_dw_pcie_from_ep(ep);

if (ep->msi_iatu_mapped) {
dw_pcie_ep_unmap_addr(ep->epc, 0, 0, ep->msi_mem_phys);
ep->msi_iatu_mapped = false;
}

dwc_pcie_debugfs_deinit(pci);
dw_pcie_edma_remove(pci);
}
Expand Down
Loading
Loading