diff options
Diffstat (limited to 'sys/dev/ow/ow.c')
-rw-r--r-- | sys/dev/ow/ow.c | 28 |
1 files changed, 10 insertions, 18 deletions
diff --git a/sys/dev/ow/ow.c b/sys/dev/ow/ow.c index 6d89cd445a3b..0325e6b324c8 100644 --- a/sys/dev/ow/ow.c +++ b/sys/dev/ow/ow.c @@ -321,7 +321,7 @@ ow_add_child(device_t dev, romid_t romid) di = malloc(sizeof(*di), M_OW, M_WAITOK); di->romid = romid; - child = device_add_child(dev, NULL, -1); + child = device_add_child(dev, NULL, DEVICE_UNIT_ANY); if (child == NULL) { free(di, M_OW); return ENOMEM; @@ -330,6 +330,12 @@ ow_add_child(device_t dev, romid_t romid) return (0); } +static void +ow_child_deleted(device_t dev, device_t child) +{ + free(device_get_ivars(child), M_OW); +} + static device_t ow_child_by_romid(device_t dev, romid_t romid) { @@ -552,15 +558,13 @@ ow_attach(device_t ndev) sc->dev = ndev; mtx_init(&sc->mtx, device_get_nameunit(sc->dev), "ow", MTX_DEF); ow_enumerate(ndev, ow_search_rom, ow_device_found); - return bus_generic_attach(ndev); + bus_attach_children(ndev); + return (0); } static int ow_detach(device_t ndev) { - device_t *children, child; - int nkid, i; - struct ow_devinfo *di; struct ow_softc *sc; sc = device_get_softc(ndev); @@ -570,19 +574,6 @@ ow_detach(device_t ndev) */ bus_generic_detach(ndev); - /* - * We delete all the children, and free up the ivars - */ - if (device_get_children(ndev, &children, &nkid) != 0) - return ENOMEM; - for (i = 0; i < nkid; i++) { - child = children[i]; - di = device_get_ivars(child); - free(di, M_OW); - device_delete_child(ndev, child); - } - free(children, M_TEMP); - OW_LOCK_DESTROY(sc); return 0; } @@ -703,6 +694,7 @@ static device_method_t ow_methods[] = { DEVMETHOD(device_detach, ow_detach), /* Bus interface */ + DEVMETHOD(bus_child_deleted, ow_child_deleted), DEVMETHOD(bus_child_pnpinfo, ow_child_pnpinfo), DEVMETHOD(bus_read_ivar, ow_read_ivar), DEVMETHOD(bus_write_ivar, ow_write_ivar), |