Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/acpi from Jukka Ruohonen:
details: https://anonhg.NetBSD.org/src/rev/2c1f61bc7ce5
branches: trunk
changeset: 747856:2c1f61bc7ce5
user: jmcneill <jmcneill%NetBSD.org@localhost>
date: Sat Oct 03 15:49:21 2009 +0000
description:
from Jukka Ruohonen:
- Remove redundant assertions.
- Properly check for NULL pointers.
- No real need to keep track whether the internal event handler is installed.
- Add a missing function to pass possible extra information associated with
an event. Mentioned in the specification.
diffstat:
sys/dev/acpi/wmi_acpi.c | 85 +++++++++++++++++++++++++++------------------
sys/dev/acpi/wmi_acpivar.h | 5 +-
2 files changed, 54 insertions(+), 36 deletions(-)
diffs (233 lines):
diff -r c41f2d7fe0ae -r 2c1f61bc7ce5 sys/dev/acpi/wmi_acpi.c
--- a/sys/dev/acpi/wmi_acpi.c Sat Oct 03 13:37:27 2009 +0000
+++ b/sys/dev/acpi/wmi_acpi.c Sat Oct 03 15:49:21 2009 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: wmi_acpi.c,v 1.1 2009/10/02 16:47:52 jmcneill Exp $ */
+/* $NetBSD: wmi_acpi.c,v 1.2 2009/10/03 15:49:21 jmcneill Exp $ */
/*-
* Copyright (c) 2009 Jukka Ruohonen <jruohonen%iki.fi@localhost>
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wmi_acpi.c,v 1.1 2009/10/02 16:47:52 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wmi_acpi.c,v 1.2 2009/10/03 15:49:21 jmcneill Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -84,7 +84,6 @@
device_t sc_dev;
struct acpi_devnode *sc_node;
struct wmi_t *sc_wmi;
- bool sc_event;
};
static SIMPLEQ_HEAD(, wmi_t) wmi_head =
@@ -121,8 +120,8 @@
#endif
static ACPI_STATUS acpi_wmi_guid_get(const u_char * const, struct wmi_t **);
-static bool acpi_wmi_event_add(struct acpi_wmi_softc *);
-static bool acpi_wmi_event_del(struct acpi_wmi_softc *);
+static void acpi_wmi_event_add(struct acpi_wmi_softc *);
+static void acpi_wmi_event_del(struct acpi_wmi_softc *);
static void acpi_wmi_event_handler(ACPI_HANDLE, uint32_t, void *);
static bool acpi_wmi_suspend(device_t PMF_FN_PROTO);
static bool acpi_wmi_resume(device_t PMF_FN_PROTO);
@@ -177,7 +176,7 @@
* registers an external event handler with us, we
* will forward events through this.
*/
- sc->sc_event = acpi_wmi_event_add(sc);
+ acpi_wmi_event_add(sc);
if (pmf_device_register(sc->sc_dev,
acpi_wmi_suspend, acpi_wmi_resume) != true)
@@ -316,8 +315,6 @@
const char *ptr;
uint8_t i;
- KASSERT(src != NULL);
-
if (ACPI_STRLEN(src) != 36)
return AE_BAD_PARAMETER;
@@ -377,7 +374,7 @@
/*
* Adds internal event handler.
*/
-static bool
+static void
acpi_wmi_event_add(struct acpi_wmi_softc *sc)
{
struct wmi_t *wmi;
@@ -389,7 +386,7 @@
if (ACPI_FAILURE(rv)) {
aprint_error_dev(sc->sc_dev, "failed to install notify "
"handler: %s\n", AcpiFormatException(rv));
- return false;
+ return;
}
/* Enable possible expensive events. */
@@ -410,27 +407,23 @@
"expensive WExx: %s\n", AcpiFormatException(rv));
}
}
-
- return true;
}
/*
* Removes the internal event handler.
*/
-static bool
+static void
acpi_wmi_event_del(struct acpi_wmi_softc *sc)
{
struct wmi_t *wmi;
ACPI_STATUS rv;
- KASSERT(sc->sc_event != false);
-
rv = AcpiRemoveNotifyHandler(sc->sc_node->ad_handle,
ACPI_DEVICE_NOTIFY, acpi_wmi_event_handler);
if (ACPI_FAILURE(rv)) {
- aprint_error_dev(sc->sc_dev, "failed to remove notify "
+ aprint_debug_dev(sc->sc_dev, "failed to remove notify "
"handler: %s\n", AcpiFormatException(rv));
- return false;
+ return;
}
SIMPLEQ_FOREACH(wmi, &wmi_head, wmi_link) {
@@ -451,8 +444,40 @@
aprint_error_dev(sc->sc_dev, "failed to disable "
"expensive WExx: %s\n", AcpiFormatException(rv));
}
+}
+/*
+ * Returns extra information possibly associated with an event.
+ */
+ACPI_STATUS
+acpi_wmi_event_get(const uint32_t event, ACPI_BUFFER *obuf)
+{
+ struct wmi_t *wmi;
+ ACPI_OBJECT_LIST arg;
+ ACPI_OBJECT obj;
- return true;
+ if (obuf == NULL)
+ return AE_BAD_PARAMETER;
+ if (wmi_handler == NULL)
+ return AE_ABORT_METHOD;
+
+ obj.Type = ACPI_TYPE_INTEGER;
+ obj.Integer.Value = event;
+
+ arg.Count = 0x01;
+ arg.Pointer = &obj;
+
+ SIMPLEQ_FOREACH(wmi, &wmi_head, wmi_link) {
+
+ if (!(wmi->guid.flags & ACPI_WMI_FLAG_EVENT))
+ continue;
+
+ if (wmi->guid.nid != event)
+ continue;
+
+ return AcpiEvaluateObject(wmi->handle, "_WED", &arg, obuf);
+ }
+
+ return AE_NOT_FOUND;
}
static void
@@ -495,11 +520,7 @@
{
struct acpi_wmi_softc *sc = device_private(self);
- if (sc->sc_event != true)
- return true;
-
- if (acpi_wmi_event_del(sc) != false)
- sc->sc_event = false;
+ acpi_wmi_event_del(sc);
return true;
}
@@ -509,13 +530,7 @@
{
struct acpi_wmi_softc *sc = device_private(self);
- if (sc->sc_event != false) {
- aprint_debug_dev(sc->sc_dev, "event handler enabled?\n");
- return true;
- }
-
- if (acpi_wmi_event_add(sc) != false)
- sc->sc_event = true;
+ acpi_wmi_event_add(sc);
return true;
}
@@ -612,6 +627,9 @@
char path[5] = "WS";
ACPI_STATUS rv;
+ if (guid == NULL || ibuf == NULL)
+ return AE_BAD_PARAMETER;
+
rv = acpi_wmi_guid_get(guid, &wmi);
if (ACPI_FAILURE(rv))
@@ -631,8 +649,6 @@
obj[0].Integer.Value = idx;
obj[0].Type = ACPI_TYPE_INTEGER;
- KASSERT(ibuf != NULL);
-
obj[1].Buffer.Length = ibuf->Length;
obj[1].Buffer.Pointer = ibuf->Pointer;
@@ -657,6 +673,9 @@
char path[5] = "WM";
ACPI_STATUS rv;
+ if (guid == NULL || ibuf == NULL || obuf == NULL)
+ return AE_BAD_PARAMETER;
+
rv = acpi_wmi_guid_get(guid, &wmi);
if (ACPI_FAILURE(rv))
@@ -677,8 +696,6 @@
obj[1].Integer.Value = mid;
obj[0].Type = obj[1].Type = ACPI_TYPE_INTEGER;
- KASSERT(ibuf != NULL);
-
obj[2].Buffer.Length = ibuf->Length;
obj[2].Buffer.Pointer = ibuf->Pointer;
diff -r c41f2d7fe0ae -r 2c1f61bc7ce5 sys/dev/acpi/wmi_acpivar.h
--- a/sys/dev/acpi/wmi_acpivar.h Sat Oct 03 13:37:27 2009 +0000
+++ b/sys/dev/acpi/wmi_acpivar.h Sat Oct 03 15:49:21 2009 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: wmi_acpivar.h,v 1.1 2009/10/02 16:47:52 jmcneill Exp $ */
+/* $NetBSD: wmi_acpivar.h,v 1.2 2009/10/03 15:49:21 jmcneill Exp $ */
/*-
* Copyright (c) 2009 Jukka Ruohonen <jruohonen%iki.fi@localhost>
@@ -30,9 +30,10 @@
#define WMI_ACPIVAR_H
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wmi_acpivar.h,v 1.1 2009/10/02 16:47:52 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wmi_acpivar.h,v 1.2 2009/10/03 15:49:21 jmcneill Exp $");
ACPI_STATUS acpi_wmi_event_register(ACPI_NOTIFY_HANDLER);
+ACPI_STATUS acpi_wmi_event_get(const uint32_t, ACPI_BUFFER *);
int acpi_wmi_guid_match(const u_char const *);
ACPI_STATUS acpi_wmi_data_query(const u_char * const, ACPI_BUFFER *);
ACPI_STATUS acpi_wmi_data_write(const u_char * const, const uint8_t,
Home |
Main Index |
Thread Index |
Old Index