From a0adb978da0cfda473fb90f86dd55399e962e9d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sat, 7 Mar 2020 12:57:22 +0100 Subject: [PATCH] embeddedcontroller: remove child devices if init failed. Change-Id: I82120ae95936505da06255e6d0cd3b72fb267be5 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2335 Reviewed-by: Adrien Destugues --- .../bus_managers/acpi/EmbeddedController.cpp | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp b/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp index 011da58345..3d2ec16d03 100644 --- a/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp +++ b/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp @@ -324,14 +324,14 @@ embedded_controller_init_driver(device_node* dev, void** _driverCookie) // and GPE bit, similar to _PRW. status = sc->ec_acpi->evaluate_method(sc->ec_handle, "_GPE", NULL, &buf); if (status != B_OK) { - ERROR("can't evaluate _GPE\n"); - goto error; + ERROR("can't evaluate _GPE %s\n", strerror(status)); + goto error2; } acpi_object_type* obj; obj = (acpi_object_type*)buf.pointer; if (obj == NULL) - goto error; + goto error2; switch (obj->object_type) { case ACPI_TYPE_INTEGER: @@ -340,16 +340,16 @@ embedded_controller_init_driver(device_node* dev, void** _driverCookie) break; case ACPI_TYPE_PACKAGE: if (!ACPI_PKG_VALID(obj, 2)) - goto error; + goto error2; sc->ec_gpehandle = acpi_GetReference(sc->ec_acpi_module, NULL, &obj->package.objects[0]); if (sc->ec_gpehandle == NULL || acpi_PkgInt32(obj, 1, (uint32*)&sc->ec_gpebit) != B_OK) - goto error; + goto error2; break; default: ERROR("_GPE has invalid type %i\n", int(obj->object_type)); - goto error; + goto error2; } sc->ec_suspending = FALSE; @@ -359,7 +359,7 @@ embedded_controller_init_driver(device_node* dev, void** _driverCookie) embedded_controller_io_ports_parse_callback, sc); if (status != B_OK) { ERROR("Error while getting IO ports addresses\n"); - goto error; + goto error2; } // Install a handler for this EC's GPE bit. We want edge-triggered @@ -369,7 +369,7 @@ embedded_controller_init_driver(device_node* dev, void** _driverCookie) sc->ec_gpebit, ACPI_GPE_EDGE_TRIGGERED, &EcGpeHandler, sc); if (status != B_OK) { TRACE("can't install ec GPE handler\n"); - goto error; + goto error1; } // Install address space handler @@ -378,26 +378,33 @@ embedded_controller_init_driver(device_node* dev, void** _driverCookie) ACPI_ADR_SPACE_EC, &EcSpaceHandler, &EcSpaceSetup, sc); if (status != B_OK) { ERROR("can't install address space handler\n"); - goto error; + goto error1; } // Enable runtime GPEs for the handler. status = sc->ec_acpi_module->enable_gpe(sc->ec_gpehandle, sc->ec_gpebit); if (status != B_OK) { ERROR("AcpiEnableGpe failed.\n"); - goto error; + goto error1; } return 0; -error: - free(buf.pointer); - +error1: sc->ec_acpi_module->remove_gpe_handler(sc->ec_gpehandle, sc->ec_gpebit, &EcGpeHandler); sc->ec_acpi->remove_address_space_handler(sc->ec_handle, ACPI_ADR_SPACE_EC, EcSpaceHandler); +error2: + free(buf.pointer); + + // remove child nodes + device_node *child = NULL; + const device_attr attrs[] = { { NULL } }; + while (gDeviceManager->get_next_child_node(dev, attrs, &child) == B_OK) + gDeviceManager->unregister_node(child); + return ENXIO; } @@ -433,15 +440,14 @@ embedded_controller_register_child_devices(void* _cookie) static status_t embedded_controller_init_device(void* driverCookie, void** cookie) { - return B_ERROR; + *cookie = driverCookie; + return B_OK; } static void embedded_controller_uninit_device(void* _cookie) { - acpi_ec_cookie* device = (acpi_ec_cookie*)_cookie; - free(device); }