Make this work again, now that ACPI_TYPE_ANY returns NULL objects
after recent ACPICA update. Applied patch from Geoff Wing on current-users@.
This commit is contained in:
parent
035163789f
commit
2930df439c
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: aiboost.c,v 1.22 2008/02/01 23:12:30 xtraeme Exp $ */
|
/* $NetBSD: aiboost.c,v 1.23 2008/04/17 19:57:27 xtraeme Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2007 Juan Romero Pardines
|
* Copyright (c) 2007 Juan Romero Pardines
|
||||||
|
@ -28,7 +28,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: aiboost.c,v 1.22 2008/02/01 23:12:30 xtraeme Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: aiboost.c,v 1.23 2008/04/17 19:57:27 xtraeme Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
@ -309,12 +309,19 @@ aiboost_getcomp(ACPI_HANDLE *h, const char *name, struct aiboost_comp **comp)
|
||||||
ACPI_BUFFER buf, buf2;
|
ACPI_BUFFER buf, buf2;
|
||||||
ACPI_OBJECT *o, *elem, *subobj, *myobj;
|
ACPI_OBJECT *o, *elem, *subobj, *myobj;
|
||||||
ACPI_STATUS status;
|
ACPI_STATUS status;
|
||||||
|
ACPI_HANDLE h1;
|
||||||
struct aiboost_comp *c = NULL;
|
struct aiboost_comp *c = NULL;
|
||||||
int i;
|
int i, num;
|
||||||
const char *str = NULL;
|
const char *str = NULL;
|
||||||
size_t length, clen = 0;
|
size_t length, clen = 0;
|
||||||
|
|
||||||
status = acpi_eval_struct(h, name, &buf);
|
status = AcpiGetHandle(h, name, &h1);
|
||||||
|
if (ACPI_FAILURE(status)) {
|
||||||
|
DPRINTF(("%s: AcpiGetHandle\n", __func__));
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = acpi_eval_struct(h1, NULL, &buf);
|
||||||
if (ACPI_FAILURE(status)) {
|
if (ACPI_FAILURE(status)) {
|
||||||
DPRINTF(("%s: acpi_eval_struct\n", __func__));
|
DPRINTF(("%s: acpi_eval_struct\n", __func__));
|
||||||
return status;
|
return status;
|
||||||
|
@ -331,40 +338,66 @@ aiboost_getcomp(ACPI_HANDLE *h, const char *name, struct aiboost_comp **comp)
|
||||||
DPRINTF(("%s: elem->Type != ACPI_TYPE_INTEGER\n", __func__));
|
DPRINTF(("%s: elem->Type != ACPI_TYPE_INTEGER\n", __func__));
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
num = (int)elem[0].Integer.Value;
|
||||||
|
if (num != o->Package.Count - 1) {
|
||||||
|
DPRINTF(("%s: bad Package.Count/element[0].value\n", __func__));
|
||||||
|
}
|
||||||
|
|
||||||
clen = sizeof(struct aiboost_comp) + sizeof(struct aiboost_elem) *
|
clen = sizeof(struct aiboost_comp) + sizeof(struct aiboost_elem) * num;
|
||||||
(o->Package.Count - 1);
|
|
||||||
c = kmem_zalloc(clen, KM_NOSLEEP);
|
c = kmem_zalloc(clen, KM_NOSLEEP);
|
||||||
if (!c)
|
if (!c)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
*comp = c;
|
*comp = c;
|
||||||
c->num = o->Package.Count - 1;
|
c->num = num;
|
||||||
|
|
||||||
for (i = 1; i < o->Package.Count; i++) {
|
DPRINTF(("%s, %d subitems\n", acpi_name(h1), num));
|
||||||
elem = &o->Package.Elements[i];
|
#ifdef AIBOOST_DEBUG
|
||||||
if (elem->Type != ACPI_TYPE_ANY) {
|
for (i = 0; i < num; i++) {
|
||||||
DPRINTF(("%s: elem->Type != ACPI_TYPE_ANY\n",
|
elem = &o->Package.Elements[i+1];
|
||||||
|
DPRINTF(("elem[%d]->Type = %x\n", i+1, elem->Type));
|
||||||
|
if (elem->Type == ACPI_TYPE_PACKAGE) {
|
||||||
|
int j;
|
||||||
|
|
||||||
|
j = elem->Package.Elements[0].Integer.Value;
|
||||||
|
DPRINTF((" subelem->Type = %x, %d\n",
|
||||||
|
elem->Package.Elements[0].Type, j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
for (i = 0; i < num; i++) {
|
||||||
|
elem = &o->Package.Elements[i+1];
|
||||||
|
if (elem->Type == ACPI_TYPE_PACKAGE) {
|
||||||
|
subobj = elem;
|
||||||
|
buf2.Pointer = NULL;
|
||||||
|
} else if (elem->Type == ACPI_TYPE_LOCAL_REFERENCE) {
|
||||||
|
c->elem[i].h = elem->Reference.Handle;
|
||||||
|
status = acpi_eval_struct(c->elem[i].h, NULL, &buf2);
|
||||||
|
if (ACPI_FAILURE(status)) {
|
||||||
|
DPRINTF(("%s: fetching object in buf2\n",
|
||||||
|
__func__));
|
||||||
|
if (buf2.Pointer)
|
||||||
|
AcpiOsFree(buf2.Pointer);
|
||||||
|
buf2.Pointer = NULL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
subobj = buf2.Pointer;
|
||||||
|
} else {
|
||||||
|
DPRINTF(("%s: elem->Type cannot be processed\n",
|
||||||
__func__));
|
__func__));
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
c->elem[i - 1].h = elem->Reference.Handle;
|
|
||||||
status = acpi_eval_struct(c->elem[i - 1].h, NULL, &buf2);
|
|
||||||
if (ACPI_FAILURE(status)) {
|
|
||||||
DPRINTF(("%s; fetching object in buf2\n",
|
|
||||||
__func__));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
subobj = buf2.Pointer;
|
|
||||||
myobj = &subobj->Package.Elements[0];
|
myobj = &subobj->Package.Elements[0];
|
||||||
|
|
||||||
/* Get UID */
|
/* Get UID */
|
||||||
if (myobj == NULL || myobj->Type != ACPI_TYPE_INTEGER)
|
if (myobj == NULL || myobj->Type != ACPI_TYPE_INTEGER) {
|
||||||
|
DPRINTF(("%s: wrong type for element %d\n", __func__,
|
||||||
|
i + 1));
|
||||||
goto error;
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
c->elem[i - 1].id = myobj->Integer.Value;
|
c->elem[i].id = myobj->Integer.Value;
|
||||||
|
|
||||||
/* Get string */
|
/* Get string */
|
||||||
myobj = &subobj->Package.Elements[1];
|
myobj = &subobj->Package.Elements[1];
|
||||||
|
@ -387,9 +420,9 @@ aiboost_getcomp(ACPI_HANDLE *h, const char *name, struct aiboost_comp **comp)
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINTF(("%s: id=%d str=%s\n", __func__,
|
DPRINTF(("%s: id=%d str=%s\n", __func__,
|
||||||
c->elem[i - 1].id, str));
|
c->elem[i].id, str));
|
||||||
|
|
||||||
(void)memcpy(c->elem[i - 1].desc, str, length);
|
(void)memcpy(c->elem[i].desc, str, length);
|
||||||
|
|
||||||
if (buf2.Pointer)
|
if (buf2.Pointer)
|
||||||
AcpiOsFree(buf2.Pointer);
|
AcpiOsFree(buf2.Pointer);
|
||||||
|
|
Loading…
Reference in New Issue