Add support for clearing the BAR info during the deinitialization phase of the epf test driver. Signed-off-by: Vidya Sagar <vidyas@xxxxxxxxxx> --- V2: * This is a new patch in this series drivers/pci/endpoint/functions/pci-epf-test.c | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c index 136470019a24..25ac3d161fac 100644 --- a/drivers/pci/endpoint/functions/pci-epf-test.c +++ b/drivers/pci/endpoint/functions/pci-epf-test.c @@ -826,6 +826,35 @@ static int pci_epf_test_core_init(struct pci_epf *epf) return 0; } +static int pci_epf_test_clear_bar(struct pci_epf *epf) +{ + int bar, add; + struct pci_epf_bar *epf_bar; + struct pci_epc *epc = epf->epc; + struct pci_epf_test *epf_test = epf_get_drvdata(epf); + const struct pci_epc_features *epc_features; + + epc_features = epf_test->epc_features; + + for (bar = 0; bar < PCI_STD_NUM_BARS; bar += add) { + epf_bar = &epf->bar[bar]; + add = (epf_bar->flags & PCI_BASE_ADDRESS_MEM_TYPE_64) ? 2 : 1; + + if (!!(epc_features->reserved_bar & (1 << bar))) + continue; + + pci_epc_clear_bar(epc, epf->func_no, epf->vfunc_no, epf_bar); + } + + return 0; +} + +static int pci_epf_test_core_deinit(struct pci_epf *epf) +{ + pci_epf_test_clear_bar(epf); + return 0; +} + int pci_epf_test_link_up(struct pci_epf *epf) { struct pci_epf_test *epf_test = epf_get_drvdata(epf); @@ -839,6 +868,7 @@ int pci_epf_test_link_up(struct pci_epf *epf) static const struct pci_epc_event_ops pci_epf_test_event_ops = { .core_init = pci_epf_test_core_init, .link_up = pci_epf_test_link_up, + .core_deinit = pci_epf_test_core_deinit, }; static int pci_epf_test_alloc_space(struct pci_epf *epf) -- 2.17.1