diff --git a/sys/dev/nvme/nvme.c b/sys/dev/nvme/nvme.c --- a/sys/dev/nvme/nvme.c +++ b/sys/dev/nvme/nvme.c @@ -104,9 +104,14 @@ nvme_detach(device_t dev) { struct nvme_controller *ctrlr = DEVICE2SOFTC(dev); + int error; config_intrhook_drain(&ctrlr->config_hook); + error = bus_generic_detach(dev); + if (error) + return (error); + nvme_ctrlr_destruct(ctrlr, dev); return (0); } diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c --- a/sys/dev/nvme/nvme_ctrlr.c +++ b/sys/dev/nvme/nvme_ctrlr.c @@ -1178,8 +1178,13 @@ config_intrhook_disestablish(&ctrlr->config_hook); if (!ctrlr->is_failed) { + device_t child; + ctrlr->is_initialized = true; nvme_notify_new_controller(ctrlr); + child = device_add_child(ctrlr->dev, NULL, DEVICE_UNIT_ANY); + device_set_ivars(child, ctrlr); + bus_attach_children(ctrlr->dev); } TSEXIT(); }