Date: Thu, 4 Nov 2004 12:27:57 +0100 From: Philip Paeps <philip@freebsd.org> To: Sebastian Schulze Struchtrup <sebastian@struchtrup.de> Cc: FreeBSD-gnats-submit@freebsd.org Subject: Re: i386/73380: [patch] kldload acpi_asus.ko causes page fault on Samsung P35 Message-ID: <20041104112757.GA31494@fasolt.home.paeps.cx> In-Reply-To: <418636C1.8000801@struchtrup.de> References: <E1CObmK-000D37-02@notebook.intranet.struchtrup.com> <418636C1.8000801@struchtrup.de>
next in thread | previous in thread | raw e-mail | index | archive | help
On 2004-11-01 14:14:41 (+0100), Sebastian Schulze Struchtrup <sebastian@struchtrup.de> wrote:
> Well, the patch got lost.
> Here it is.
Does this patch work for you? I think it's a bit simpler than yours, and it
should accomplish the same thing. It also doesn't break style(9) quite so
dramatically ;-)
Index: acpi_asus.c
===================================================================
RCS file: /home/freebsd/FreeBSD-CVS/src/sys/i386/acpica/acpi_asus.c,v
retrieving revision 1.12
diff -u -r1.12 acpi_asus.c
--- acpi_asus.c 2 Nov 2004 13:02:22 -0000 1.12
+++ acpi_asus.c 4 Nov 2004 09:14:47 -0000
@@ -102,7 +102,10 @@
int s_lcd;
};
-/* Models we know about */
+/*
+ * We can identify Asus laptops from the string they return
+ * as a result of calling the ATK0100 'INIT' method.
+ */
static struct acpi_asus_model acpi_asus_models[] = {
{
.name = "L2D",
@@ -174,6 +177,15 @@
.disp_set = "SDSP",
.disp_get = "\\SSTE"
},
+
+ { .name = NULL }
+};
+
+/*
+ * Samsung P30/P35 laptops have an Asus ATK0100 gadget interface,
+ * but they can't be probed quite the same way as Asus laptops.
+ */
+static struct acpi_asus_model acpi_samsung_models[] = {
{
.name = "P30",
.wled_set = "WLED",
@@ -254,13 +266,48 @@
Buf.Length = ACPI_ALLOCATE_BUFFER;
AcpiEvaluateObject(sc->handle, "INIT", &Args, &Buf);
-
Obj = Buf.Pointer;
+ /*
+ * The Samsung P30 returns a null-pointer from INIT, we
+ * can identify it from the 'ODEM' string in the DSDT.
+ */
+ if (Obj == NULL) {
+ ACPI_STATUS status;
+ ACPI_TABLE_HEADER th;
+
+ status = AcpiGetTableHeader(ACPI_TABLE_DSDT, 1, &th);
+ if (ACPI_FAILURE(status)) {
+ sbuf_printf(sb, "Unsupported laptop\n");
+ sbuf_finish(sb);
+
+ device_printf(dev, sbuf_data(sb));
+
+ sbuf_delete(sb);
+ AcpiOsFree(Buf.Pointer);
+ return (ENXIO);
+ }
+
+ if (strncmp("ODEM", th.OemTableId, 4) == 0) {
+ sbuf_printf(sb, "Samsung P30 Laptop Extras");
+ sbuf_finish(sb);
+
+ sc->model = &acpi_samsung_models[0];
+ device_set_desc(dev, sbuf_data(sb));
+
+ sbuf_delete(sb);
+ AcpiOsFree(Buf.Pointer);
+ return (0);
+ }
+ }
+
+ /*
+ * Asus laptops are simply identified by name, easy!
+ */
for (model = acpi_asus_models; model->name != NULL; model++)
if (strcmp(Obj->String.Pointer, model->name) == 0) {
sbuf_printf(sb, "Asus %s Laptop Extras",
- Obj->String.Pointer);
+ Obj->String.Pointer);
sbuf_finish(sb);
sc->model = model;
@@ -272,7 +319,7 @@
}
sbuf_printf(sb, "Unsupported Asus laptop detected: %s\n",
- Obj->String.Pointer);
+ Obj->String.Pointer);
sbuf_finish(sb);
device_printf(dev, sbuf_data(sb));
- Philip
--
Philip Paeps Made from non-edible parts
philip@freebsd.org
BOFH Excuse #228:
That function is not currently supported, but Bill Gates assures us it
will be featured in the next upgrade.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20041104112757.GA31494>
