pci: pci_host_generic: provide cleanup methods outside of detach

If device_attach() fails, we're expected to actually cleanup after
ourselves because device_detach() will not be called.  Factor out the
cleanup bits that don't rely on attach having actually succeeded so
that we can cleanup properly in bcm2838_pci.

Reviewed by:	andrew, imp
Differential Revision:	https://reviews.freebsd.org/D56896
This commit is contained in:
Kyle Evans
2026-05-08 21:46:24 -05:00
parent b230a7b9a5
commit 31a94ec32b
4 changed files with 32 additions and 4 deletions
+11 -4
View File
@@ -250,15 +250,22 @@ pci_host_generic_core_attach(device_t dev)
int
pci_host_generic_core_detach(device_t dev)
{
struct generic_pcie_core_softc *sc;
int error, rid, tuple;
sc = device_get_softc(dev);
int error;
error = bus_generic_detach(dev);
if (error != 0)
return (error);
return (pci_host_generic_core_free(dev));
}
int
pci_host_generic_core_free(device_t dev)
{
struct generic_pcie_core_softc *sc;
int rid, tuple;
sc = device_get_softc(dev);
for (tuple = 0; tuple < MAX_RANGES_TUPLES; tuple++) {
rid = sc->ranges[tuple].rid;
if (sc->ranges[tuple].size == 0) {
+1
View File
@@ -94,6 +94,7 @@ DECLARE_CLASS(generic_pcie_core_driver);
int pci_host_generic_core_attach(device_t);
int pci_host_generic_core_detach(device_t);
int pci_host_generic_core_free(device_t);
struct resource *pci_host_generic_core_alloc_resource(device_t, device_t, int,
int, rman_res_t, rman_res_t, rman_res_t, u_int);
int pci_host_generic_core_release_resource(device_t, device_t,
+19
View File
@@ -104,6 +104,25 @@ generic_pcie_fdt_probe(device_t dev)
return (ENXIO);
}
void
pci_host_generic_destroy_fdt(device_t dev)
{
struct generic_pcie_fdt_softc *sc;
struct pci_ofw_devinfo *di;
sc = device_get_softc(dev);
while (!STAILQ_EMPTY(&sc->pci_ofw_devlist)) {
di = STAILQ_FIRST(&sc->pci_ofw_devlist);
STAILQ_REMOVE_HEAD(&sc->pci_ofw_devlist, pci_ofw_link);
ofw_bus_gen_destroy_devinfo(&di->di_dinfo);
free(di, M_DEVBUF);
}
ofw_bus_destroy_iinfo(&sc->pci_iinfo);
(void)pci_host_generic_core_free(dev);
}
int
pci_host_generic_setup_fdt(device_t dev)
{
+1
View File
@@ -46,6 +46,7 @@ DECLARE_CLASS(generic_pcie_fdt_driver);
struct resource *pci_host_generic_alloc_resource(device_t,
device_t, int, int *, rman_res_t, rman_res_t, rman_res_t, u_int);
int pci_host_generic_setup_fdt(device_t);
void pci_host_generic_destroy_fdt(device_t);
int pci_host_generic_fdt_attach(device_t);
int generic_pcie_get_id(device_t, device_t, enum pci_id_type, uintptr_t *);