Page MenuHomeFreeBSD

D35291.id106281.diff
No OneTemporary

D35291.id106281.diff

Index: sys/dev/pci/pci_host_generic.h
===================================================================
--- sys/dev/pci/pci_host_generic.h
+++ sys/dev/pci/pci_host_generic.h
@@ -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);
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, int, int,
Index: sys/dev/pci/pci_host_generic.c
===================================================================
--- sys/dev/pci/pci_host_generic.c
+++ sys/dev/pci/pci_host_generic.c
@@ -97,8 +97,9 @@
rid = 0;
sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE);
if (sc->res == NULL) {
- device_printf(dev, "could not map memory.\n");
- return (ENXIO);
+ device_printf(dev, "could not allocate memory.\n");
+ error = ENXIO;
+ goto err_resource;
}
sc->bst = rman_get_bustag(sc->res);
@@ -118,19 +119,19 @@
error = rman_init(&sc->pmem_rman);
if (error) {
device_printf(dev, "rman_init() failed. error = %d\n", error);
- return (error);
+ goto err_pmem_rman;
}
error = rman_init(&sc->mem_rman);
if (error) {
device_printf(dev, "rman_init() failed. error = %d\n", error);
- return (error);
+ goto err_mem_rman;
}
error = rman_init(&sc->io_rman);
if (error) {
device_printf(dev, "rman_init() failed. error = %d\n", error);
- return (error);
+ goto err_io_rman;
}
for (tuple = 0; tuple < MAX_RANGES_TUPLES; tuple++) {
@@ -159,13 +160,38 @@
if (error) {
device_printf(dev, "rman_manage_region() failed."
"error = %d\n", error);
- rman_fini(&sc->pmem_rman);
- rman_fini(&sc->mem_rman);
- rman_fini(&sc->io_rman);
- return (error);
+ goto err_rman_manage;
}
}
+ return (0);
+
+err_rman_manage:
+ rman_fini(&sc->io_rman);
+err_io_rman:
+ rman_fini(&sc->mem_rman);
+err_mem_rman:
+ rman_fini(&sc->pmem_rman);
+err_pmem_rman:
+ bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->res);
+err_resource:
+ bus_dma_tag_destroy(sc->dmat);
+ return (error);
+}
+
+int
+pci_host_generic_core_detach(device_t dev)
+{
+ struct generic_pcie_core_softc *sc;
+
+ sc = device_get_softc(dev);
+
+ rman_fini(&sc->io_rman);
+ rman_fini(&sc->mem_rman);
+ rman_fini(&sc->pmem_rman);
+ bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->res);
+ bus_dma_tag_destroy(sc->dmat);
+
return (0);
}
@@ -538,6 +564,8 @@
static device_method_t generic_pcie_methods[] = {
DEVMETHOD(device_attach, pci_host_generic_core_attach),
+ DEVMETHOD(device_detach, pci_host_generic_core_detach),
+
DEVMETHOD(bus_read_ivar, generic_pcie_read_ivar),
DEVMETHOD(bus_write_ivar, generic_pcie_write_ivar),
DEVMETHOD(bus_alloc_resource, pci_host_generic_core_alloc_resource),

File Metadata

Mime Type
text/plain
Expires
Wed, Apr 30, 8:24 PM (18 h, 19 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17864596
Default Alt Text
D35291.id106281.diff (2 KB)

Event Timeline