Module Name: src Committed By: jruoho Date: Fri Feb 18 13:56:03 UTC 2011
Modified Files: src/sys/dev/acpi: acpi_wakedev.c Log Message: A small cleanup for the previous; use kmem(9), add assertions, etc. To generate a diff of this commit: cvs rdiff -u -r1.22 -r1.23 src/sys/dev/acpi/acpi_wakedev.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_wakedev.c diff -u src/sys/dev/acpi/acpi_wakedev.c:1.22 src/sys/dev/acpi/acpi_wakedev.c:1.23 --- src/sys/dev/acpi/acpi_wakedev.c:1.22 Thu Feb 17 19:36:49 2011 +++ src/sys/dev/acpi/acpi_wakedev.c Fri Feb 18 13:56:03 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_wakedev.c,v 1.22 2011/02/17 19:36:49 jruoho Exp $ */ +/* $NetBSD: acpi_wakedev.c,v 1.23 2011/02/18 13:56:03 jruoho Exp $ */ /*- * Copyright (c) 2009, 2010, 2011 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,13 +27,12 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: acpi_wakedev.c,v 1.22 2011/02/17 19:36:49 jruoho Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_wakedev.c,v 1.23 2011/02/18 13:56:03 jruoho Exp $"); #include <sys/param.h> #include <sys/device.h> +#include <sys/kmem.h> #include <sys/sysctl.h> -#include <sys/systm.h> -#include <sys/malloc.h> #include <dev/acpi/acpireg.h> #include <dev/acpi/acpivar.h> @@ -52,10 +51,8 @@ NULL, }; -MALLOC_DECLARE(M_ACPI); - -static int32_t acpi_wakedev_acpinode = CTL_EOL; -static int32_t acpi_wakedev_wakenode = CTL_EOL; +static int32_t acpi_wakedev_acpinode = CTL_EOL; +static int32_t acpi_wakedev_wakenode = CTL_EOL; static void acpi_wakedev_power(struct acpi_devnode *, ACPI_OBJECT *); static void acpi_wakedev_set(struct acpi_devnode *, int); @@ -65,11 +62,14 @@ acpi_wakedev_init(struct acpi_devnode *ad) { ACPI_OBJECT *elm, *obj; - ACPI_HANDLE hdl = NULL; - ACPI_INTEGER val = 0; + ACPI_INTEGER val; + ACPI_HANDLE hdl; ACPI_BUFFER buf; ACPI_STATUS rv; + KASSERT(ad != NULL && ad->ad_wakedev == NULL); + KASSERT(ad->ad_devinfo->Type == ACPI_TYPE_DEVICE); + rv = acpi_eval_struct(ad->ad_handle, "_PRW", &buf); if (ACPI_FAILURE(rv)) @@ -82,7 +82,7 @@ goto out; } - if (obj->Package.Count < 2) { + if (obj->Package.Count < 2 || obj->Package.Count > UINT32_MAX) { rv = AE_LIMIT; goto out; } @@ -100,6 +100,7 @@ case ACPI_TYPE_INTEGER: val = elm->Integer.Value; + hdl = NULL; break; case ACPI_TYPE_PACKAGE: @@ -126,8 +127,7 @@ goto out; } - ad->ad_wakedev = malloc(sizeof(*ad->ad_wakedev), - M_ACPI, M_NOWAIT | M_ZERO); + ad->ad_wakedev = kmem_zalloc(sizeof(*ad->ad_wakedev), KM_NOSLEEP); if (ad->ad_wakedev == NULL) return; @@ -146,13 +146,13 @@ ad->ad_wakedev->aw_sleep = elm->Integer.Value; /* - * Rest of the elements are references - * to power resources. Store these. + * The rest of the elements are reference + * handles to power resources. Store these. */ acpi_wakedev_power(ad, obj); /* - * Last but not least, mark GPEs for wake. + * Last but not least, mark the GPE for wake. */ rv = AcpiSetupGpeForWake(ad->ad_handle, hdl, val); @@ -209,7 +209,7 @@ aw->aw_enable = false; if (acpi_match_hid(ad->ad_devinfo, acpi_wakedev_default)) - ad->ad_wakedev->aw_enable = true; + aw->aw_enable = true; if (acpi_wakedev_acpinode == CTL_EOL || acpi_wakedev_wakenode == CTL_EOL) @@ -229,7 +229,7 @@ err = sysctl_createv(NULL, 0, NULL, NULL, CTLFLAG_READWRITE, CTLTYPE_BOOL, str, - NULL, NULL, 0, &ad->ad_wakedev->aw_enable, 0, CTL_HW, + NULL, NULL, 0, &aw->aw_enable, 0, CTL_HW, acpi_wakedev_acpinode, acpi_wakedev_wakenode, CTL_CREATE, CTL_EOL); @@ -311,7 +311,6 @@ */ if (aw->aw_enable != true) rv = AcpiSetGpeWakeMask(hdl, val, ACPI_GPE_DISABLE); - else { rv = AcpiSetGpeWakeMask(hdl, val, ACPI_GPE_ENABLE); @@ -324,7 +323,13 @@ goto out; /* - * Turn on power resources. + * Turn power resources on. + * + * XXX: We should also turn these off for devices + * that are not allowed to wake the system. + * However, as these are not yet integrated + * with pmf(9), we can not risk devices to + * possibly resume in a power-off state. */ for (i = 0; i < __arraycount(aw->aw_power); i++) { @@ -335,11 +340,11 @@ } } +out: if (state > aw->aw_sleep) aprint_error_dev(ad->ad_root, "sleep state S%d " "loses wake for %s\n", state, ad->ad_name); -out: if (ACPI_FAILURE(rv) && rv != AE_NOT_FOUND) aprint_error_dev(ad->ad_root, "failed to set wake GPE " "for %s: %s\n", ad->ad_name, AcpiFormatException(rv));