aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/nvdimm/nvdimm_acpi.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/nvdimm/nvdimm_acpi.c')
-rw-r--r--sys/dev/nvdimm/nvdimm_acpi.c27
1 files changed, 10 insertions, 17 deletions
diff --git a/sys/dev/nvdimm/nvdimm_acpi.c b/sys/dev/nvdimm/nvdimm_acpi.c
index 995e60e8b4ee..39697e52eebb 100644
--- a/sys/dev/nvdimm/nvdimm_acpi.c
+++ b/sys/dev/nvdimm/nvdimm_acpi.c
@@ -109,7 +109,7 @@ nvdimm_root_create_devs(device_t dev, ACPI_TABLE_NFIT *nfitbl)
if (dimm_handle == NULL)
continue;
- child = BUS_ADD_CHILD(dev, 100, "nvdimm", -1);
+ child = BUS_ADD_CHILD(dev, 100, "nvdimm", DEVICE_UNIT_ANY);
if (child == NULL) {
device_printf(dev, "failed to create nvdimm\n");
return (ENXIO);
@@ -188,22 +188,24 @@ nvdimm_root_attach(device_t dev)
error = nvdimm_root_create_devs(dev, nfitbl);
if (error != 0)
return (error);
- error = bus_generic_attach(dev);
- if (error != 0)
- return (error);
+ bus_attach_children(dev);
root = device_get_softc(dev);
error = nvdimm_root_create_spas(root, nfitbl);
AcpiPutTable(&nfitbl->Header);
return (error);
}
+static void
+nvdimm_root_child_deleted(device_t dev, device_t child)
+{
+ free(device_get_ivars(child), M_NVDIMM_ACPI);
+}
+
static int
nvdimm_root_detach(device_t dev)
{
struct nvdimm_root_dev *root;
struct SPA_mapping *spa, *next;
- device_t *children;
- int i, error, num_children;
root = device_get_softc(dev);
SLIST_FOREACH_SAFE(spa, &root->spas, link, next) {
@@ -212,17 +214,7 @@ nvdimm_root_detach(device_t dev)
SLIST_REMOVE_HEAD(&root->spas, link);
free(spa, M_NVDIMM_ACPI);
}
- error = bus_generic_detach(dev);
- if (error != 0)
- return (error);
- error = device_get_children(dev, &children, &num_children);
- if (error != 0)
- return (error);
- for (i = 0; i < num_children; i++)
- free(device_get_ivars(children[i]), M_NVDIMM_ACPI);
- free(children, M_TEMP);
- error = device_delete_children(dev);
- return (error);
+ return (bus_generic_detach(dev));
}
static int
@@ -264,6 +256,7 @@ static device_method_t nvdimm_acpi_methods[] = {
DEVMETHOD(device_attach, nvdimm_root_attach),
DEVMETHOD(device_detach, nvdimm_root_detach),
DEVMETHOD(bus_add_child, bus_generic_add_child),
+ DEVMETHOD(bus_child_deleted, nvdimm_root_child_deleted),
DEVMETHOD(bus_read_ivar, nvdimm_root_read_ivar),
DEVMETHOD(bus_write_ivar, nvdimm_root_write_ivar),
DEVMETHOD(bus_child_location, nvdimm_root_child_location),