public inbox for linux-acpi@vger.kernel.org
 help / color / mirror / Atom feed
From: Ducrot Bruno <ducrot-kk6yZipjEM5g9hUCZPvPmw@public.gmane.org>
To: x545 <x545-hi6Y0CQ0nG0@public.gmane.org>
Cc: Ducrot Bruno <ducrot-kk6yZipjEM5g9hUCZPvPmw@public.gmane.org>,
	Dominik Bartenstein <dom-K271P2BsTd0@public.gmane.org>,
	acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
Subject: thinkpad workaround v2.
Date: Mon, 20 Jan 2003 15:09:26 +0100	[thread overview]
Message-ID: <20030120140926.GA11487@poup.poupinou.org> (raw)
In-Reply-To: <200301201442.27358.x545-hi6Y0CQ0nG0@public.gmane.org>

[-- Attachment #1: Type: text/plain, Size: 782 bytes --]

On Mon, Jan 20, 2003 at 02:42:27PM +0100, x545 wrote:
> I get many Errors, all the same in osl.c, line 
> 234,241,243,244,248,250,251,266,290: dereferencing pointer to incomplete 
> type
> Can you please give short instructions what's wrong or send a complete 
> working diff?

in short, 'struct acpi_table_ecdt' is now in include/linux/acpi.h

Then replace
#include "acpi.h"

by
#include <linux/acpi.h>
(which include drivers/acpi/include/acpi.h btw)

in the file drivers/acpi/osl.c

Here goes the complete patch to be make things cleaner.

my big apologies for this mistake by me..

A final note though: I don't have a thinkpad to play with
so that I can not test myself this workaround.  

-- 
Ducrot Bruno

--  Which is worse:  ignorance or apathy?
--  Don't know.  Don't care.

[-- Attachment #2: thinkpad_ecdt_workaround-v2.diff --]
[-- Type: text/plain, Size: 2928 bytes --]

--- linux-2.4/drivers/acpi/osl.c	2003/01/20 11:26:31	1.1
+++ linux-2.4/drivers/acpi/osl.c	2003/01/20 12:40:54
@@ -25,6 +25,9 @@
  *
  */
 
+/* Define this if you are a Thinkpad owner. */
+/* #define CONFIG_ACPI_IBM_ECDT_WORKAROUND */
+
 #include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/slab.h>
@@ -35,7 +38,11 @@
 #include <linux/delay.h>
 #include <asm/io.h>
 #include "acpi_bus.h"
+#ifdef CONFIG_ACPI_IBM_ECDT_WORKAROUND
+#include <linux/acpi.h>
+#else
 #include "acpi.h"
+#endif
 
 #ifdef CONFIG_ACPI_EFI
 #include <linux/efi.h>
@@ -201,6 +208,94 @@
 	return AE_OK;
 }
 
+#ifdef CONFIG_ACPI_IBM_ECDT_WORKAROUND
+static          u8
+compute_checksum(struct acpi_table_header * h)
+{
+	int             i;
+	u8             *p;
+	u8              cs;
+
+	p = (u8 *) h;
+	cs = 0;
+	for (i = 0; i < h->length; i++)
+		cs += *p++;
+	return cs;
+}
+
+static          acpi_status
+try_to_replace_ibm_ecdt(struct acpi_table_ecdt * old,
+			struct acpi_table_ecdt ** new)
+{
+	u32             len;
+	u8             *p;
+	struct acpi_table_ecdt *ecdt;
+
+	*new = NULL;
+
+	len = old->header.length;
+	ecdt = kmalloc(len + 1, GFP_KERNEL);
+	if (!ecdt)
+		return AE_NO_MEMORY;
+
+	memcpy(ecdt, old, len);
+
+	ecdt->header.length = len + 1;
+
+	for (p = (u8 *) ecdt + ecdt->header.length - 1;
+	     p != (u8 *) & ecdt->ec_id;
+	     --p) {
+		*p = *(p - 1);
+	}
+	ecdt->ec_id[1] = '_';
+
+	ecdt->header.checksum = 0;
+	ecdt->header.checksum = -compute_checksum((struct acpi_table_header *) ecdt);
+
+	*new = ecdt;
+
+	printk(KERN_WARNING "acpi: IBM's ECDT TABLE sucessfully replaced by a corrected one.\n");
+
+	return AE_OK;
+}
+
+
+static          acpi_status
+verify_ibm_ecdt(struct acpi_table_ecdt * existing_table,
+		struct acpi_table_ecdt ** new_table)
+{
+	const char     *const ec_id =
+	((struct acpi_table_ecdt *) existing_table)->ec_id;
+
+	if (ec_id[0] == '\\' && ec_id[1] == 'S') {
+		printk(KERN_WARNING "acpi: Found bad ACPI ECDT table from IBM in the firmware\n");
+		return (try_to_replace_ibm_ecdt(existing_table, new_table));
+	}
+	return AE_OK;
+}
+
+
+
+acpi_status
+acpi_os_table_override(struct acpi_table_header * existing_table,
+		       struct acpi_table_header ** new_table)
+{
+	if (!existing_table || !new_table)
+		return AE_BAD_PARAMETER;
+
+	*new_table = NULL;
+
+	if (!memcmp(existing_table->signature, "ECDT", 4)) {
+		struct acpi_table_ecdt *old = (struct acpi_table_ecdt *) existing_table;
+		struct acpi_table_ecdt **new = (struct acpi_table_ecdt **) new_table;
+
+		if (!memcmp(old->header.oem_id, "IBM", 3))
+			return (verify_ibm_ecdt(old, new));
+	}
+	return AE_OK;
+}
+
+#else	/* CONFIG_ACPI_IBM_ECDT_WORKAROUND */
 acpi_status
 acpi_os_table_override (struct acpi_table_header *existing_table,
 			struct acpi_table_header **new_table)
@@ -211,6 +306,7 @@
 	*new_table = NULL;
 	return AE_OK;
 }
+#endif
 
 static void
 acpi_irq(int irq, void *dev_id, struct pt_regs *regs)

  parent reply	other threads:[~2003-01-20 14:09 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-01-17 18:47 IBM Thinkpad A31 | News Dominik Bartenstein
     [not found] ` <200301172111.15037.dom@wahuu.at>
     [not found]   ` <20030117210321.GC12516@poup.poupinou.org>
     [not found]     ` <200301172204.52963.dom@wahuu.at>
     [not found]       ` <200301172204.52963.dom-K271P2BsTd0@public.gmane.org>
2003-01-18 16:45         ` Ducrot Bruno
     [not found]           ` <20030118164525.GD12516-j6u/t2rXLliUoIHC/UFpr9i2O/JbrIOy@public.gmane.org>
2003-01-18 17:08             ` WARN: please read if you applyied 00_thinkpad_workaround.diff (Re: IBM Thinkpad A31 | News) Ducrot Bruno
     [not found]               ` <20030118170844.GE12516-j6u/t2rXLliUoIHC/UFpr9i2O/JbrIOy@public.gmane.org>
2003-01-20 13:42                 ` x545
     [not found]                   ` <200301201442.27358.x545-hi6Y0CQ0nG0@public.gmane.org>
2003-01-20 14:09                     ` Ducrot Bruno [this message]
     [not found]                       ` <20030120140926.GA11487-j6u/t2rXLliUoIHC/UFpr9i2O/JbrIOy@public.gmane.org>
2003-01-20 14:30                         ` thinkpad workaround v2 Dominik Bartenstein
     [not found]                           ` <20030120144413.GD11487@poup.poupinou.org>
     [not found]                             ` <200301201554.13984.dom@wahuu.at>
     [not found]                               ` <200301201554.13984.dom-K271P2BsTd0@public.gmane.org>
2003-01-20 15:40                                 ` Ducrot Bruno
     [not found]                                   ` <20030120154043.GI11487-j6u/t2rXLliUoIHC/UFpr9i2O/JbrIOy@public.gmane.org>
2003-01-20 17:15                                     ` apologizes (was Re: Re: thinkpad workaround v2.) Ducrot Bruno
2003-01-20 15:17                         ` thinkpad workaround v2 x545
     [not found] ` <200301171947.54174.dom-K271P2BsTd0@public.gmane.org>
2003-01-21  7:25   ` IBM Thinkpad A31 | News Christian Zoz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20030120140926.GA11487@poup.poupinou.org \
    --to=ducrot-kk6yzipjem5g9huczpvpmw@public.gmane.org \
    --cc=acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
    --cc=dom-K271P2BsTd0@public.gmane.org \
    --cc=x545-hi6Y0CQ0nG0@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox