Module Name: src Committed By: riastradh Date: Fri Dec 31 14:20:24 UTC 2021
Modified Files: src/sys/dev/acpi: acpi_bat.c Log Message: acpibat(4): Fix attach and detach ordering. On attach: Don't register acpibat_resume handler with pmf or acpibat_notify_handler with acpi until it is safe to call acpibat_update_info and acpibat_update_status. => This requires the sc->sc_sensor array to be allocated, so allocate that first. => This requires sc->sc_sme to be created, so defer them to config_interrupts after sysmon_envsys_register. => Make sure to register the notify handler before initially polling the info and status. On detach: Deregister pmf handler and acpi notifier before we destroy anything. To generate a diff of this commit: cvs rdiff -u -r1.117 -r1.118 src/sys/dev/acpi/acpi_bat.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/acpi/acpi_bat.c diff -u src/sys/dev/acpi/acpi_bat.c:1.117 src/sys/dev/acpi/acpi_bat.c:1.118 --- src/sys/dev/acpi/acpi_bat.c:1.117 Fri Jan 29 15:20:13 2021 +++ src/sys/dev/acpi/acpi_bat.c Fri Dec 31 14:20:24 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_bat.c,v 1.117 2021/01/29 15:20:13 thorpej Exp $ */ +/* $NetBSD: acpi_bat.c,v 1.118 2021/12/31 14:20:24 riastradh Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -75,7 +75,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.117 2021/01/29 15:20:13 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_bat.c,v 1.118 2021/12/31 14:20:24 riastradh Exp $"); #include <sys/param.h> #include <sys/condvar.h> @@ -235,20 +235,13 @@ acpibat_attach(device_t parent, device_t sc->sc_wcapacity = 0; sc->sc_sme = NULL; - sc->sc_sensor = NULL; mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_NONE); cv_init(&sc->sc_condvar, device_xname(self)); - (void)pmf_device_register(self, NULL, acpibat_resume); - (void)acpi_register_notify(sc->sc_node, acpibat_notify_handler); - sc->sc_sensor = kmem_zalloc(ACPIBAT_COUNT * sizeof(*sc->sc_sensor), KM_SLEEP); - if (sc->sc_sensor == NULL) - return; - config_interrupts(self, acpibat_init_envsys); /* @@ -270,11 +263,9 @@ acpibat_detach(device_t self, int flags) { struct acpibat_softc *sc = device_private(self); + pmf_device_deregister(self); acpi_deregister_notify(sc->sc_node); - cv_destroy(&sc->sc_condvar); - mutex_destroy(&sc->sc_mutex); - if (sc->sc_sme != NULL) sysmon_envsys_unregister(sc->sc_sme); @@ -282,7 +273,8 @@ acpibat_detach(device_t self, int flags) kmem_free(sc->sc_sensor, ACPIBAT_COUNT * sizeof(*sc->sc_sensor)); - pmf_device_deregister(self); + cv_destroy(&sc->sc_condvar); + mutex_destroy(&sc->sc_mutex); return 0; } @@ -774,12 +766,15 @@ acpibat_init_envsys(device_t dv) sc->sc_sme->sme_flags = SME_POLL_ONLY | SME_INIT_REFRESH; sc->sc_sme->sme_get_limits = acpibat_get_limits; + (void)acpi_register_notify(sc->sc_node, acpibat_notify_handler); acpibat_update_info(dv); acpibat_update_status(dv); if (sysmon_envsys_register(sc->sc_sme)) goto fail; + (void)pmf_device_register(dv, NULL, acpibat_resume); + return; fail: