Page MenuHomeFreeBSD

D56896.id177476.diff
No OneTemporary

D56896.id177476.diff

diff --git a/sys/dev/pci/pci_host_generic.h b/sys/dev/pci/pci_host_generic.h
--- a/sys/dev/pci/pci_host_generic.h
+++ b/sys/dev/pci/pci_host_generic.h
@@ -94,6 +94,7 @@
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,
diff --git a/sys/dev/pci/pci_host_generic.c b/sys/dev/pci/pci_host_generic.c
--- a/sys/dev/pci/pci_host_generic.c
+++ b/sys/dev/pci/pci_host_generic.c
@@ -250,15 +250,22 @@
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) {
diff --git a/sys/dev/pci/pci_host_generic_fdt.h b/sys/dev/pci/pci_host_generic_fdt.h
--- a/sys/dev/pci/pci_host_generic_fdt.h
+++ b/sys/dev/pci/pci_host_generic_fdt.h
@@ -46,6 +46,7 @@
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 *);
diff --git a/sys/dev/pci/pci_host_generic_fdt.c b/sys/dev/pci/pci_host_generic_fdt.c
--- a/sys/dev/pci/pci_host_generic_fdt.c
+++ b/sys/dev/pci/pci_host_generic_fdt.c
@@ -104,6 +104,25 @@
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)
{

File Metadata

Mime Type
text/plain
Expires
Fri, Oct 2, 7:12 AM (15 h, 40 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40065632
Default Alt Text
D56896.id177476.diff (2 KB)

Event Timeline