From Jérôme Duval <jerome.duval@xxxxxxxxx>:
Jérôme Duval has uploaded this change for review. (
https://review.haiku-os.org/c/haiku/+/2335 ;)
Change subject: embeddedcontroller: remove child devices if init failed.
......................................................................
embeddedcontroller: remove child devices if init failed.
---
M src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp
1 file changed, 22 insertions(+), 16 deletions(-)
git pull ssh://git.haiku-os.org:22/haiku refs/changes/35/2335/1
diff --git a/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp
b/src/add-ons/kernel/bus_managers/acpi/EmbeddedController.cpp
index 011da58..3d2ec16 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 @@
// 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 @@
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_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 @@
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 @@
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 @@
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);
}
--
To view, visit https://review.haiku-os.org/c/haiku/+/2335
To unsubscribe, or for help writing mail filters, visit
https://review.haiku-os.org/settings
Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I82120ae95936505da06255e6d0cd3b72fb267be5
Gerrit-Change-Number: 2335
Gerrit-PatchSet: 1
Gerrit-Owner: Jérôme Duval <jerome.duval@xxxxxxxxx>
Gerrit-MessageType: newchange