From owner-freebsd-acpi@FreeBSD.ORG Thu Nov 4 13:18:48 2004 Return-Path: Delivered-To: freebsd-acpi@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 4117116A4CE; Thu, 4 Nov 2004 13:18:48 +0000 (GMT) Received: from mail.struchtrup.de (mail.struchtrup.de [80.190.247.172]) by mx1.FreeBSD.org (Postfix) with ESMTP id 545B943D45; Thu, 4 Nov 2004 13:18:44 +0000 (GMT) (envelope-from sebastian@struchtrup.de) Received: from p5087c351.dip0.t-ipconnect.de ([80.135.195.81] helo=[10.0.0.198]) by mail.struchtrup.de with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.42 (FreeBSD)) id 1CPhV8-000DZW-Ul; Thu, 04 Nov 2004 13:18:07 +0000 Message-ID: <418A2C34.1090103@struchtrup.de> Date: Thu, 04 Nov 2004 14:18:44 +0100 From: Sebastian Schulze Struchtrup User-Agent: Mozilla Thunderbird 0.8 (X11/20041027) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Philip Paeps References: <418636C1.8000801@struchtrup.de> <20041104112757.GA31494@fasolt.home.paeps.cx> In-Reply-To: <20041104112757.GA31494@fasolt.home.paeps.cx> Content-Type: multipart/mixed; boundary="------------020603070606090906090205" X-Struchtrup-MailScanner-Information: Please contact the ISP for more information X-Struchtrup-MailScanner: Found to be clean X-MailScanner-From: sebastian@struchtrup.de cc: acpi@freebsd.org cc: FreeBSD-gnats-submit@freebsd.org Subject: Re: i386/73380: [patch] kldload acpi_asus.ko causes page fault on Samsung P35 X-BeenThere: freebsd-acpi@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: ACPI and power management development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 04 Nov 2004 13:18:48 -0000 This is a multi-part message in MIME format. --------------020603070606090906090205 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Philip Paeps wrote: >On 2004-11-01 14:14:41 (+0100), Sebastian Schulze Struchtrup 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 ;-) > > Not yet. It is rather Obj->String.Pointer which is NULL, not Obj itself. After changing this, it works. I think I have had both checks in my patch, with the one being redundant. Thanks for handling this! The corrected patch is attached. --------------020603070606090906090205 Content-Type: text/plain; name="acpi_asus.c.patch-2" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="acpi_asus.c.patch-2" Index: acpi_asus.c =================================================================== RCS file: /home/ncvs/src/sys/i386/acpica/acpi_asus.c,v retrieving revision 1.12 diff -u -p -r1.12 acpi_asus.c --- acpi_asus.c 2 Nov 2004 13:02:22 -0000 1.12 +++ acpi_asus.c 4 Nov 2004 13:13:29 -0000 @@ -102,7 +102,10 @@ struct acpi_asus_softc { 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 @@ static struct acpi_asus_model acpi_asus_ .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 @@ acpi_asus_probe(device_t dev) 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->String.Pointer == 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 @@ acpi_asus_probe(device_t dev) } sbuf_printf(sb, "Unsupported Asus laptop detected: %s\n", - Obj->String.Pointer); + Obj->String.Pointer); sbuf_finish(sb); device_printf(dev, sbuf_data(sb)); --------------020603070606090906090205--