From: Corey Minyard <minyard@acm.org>

Ignore the bottom bit of the base address from the DMI data.  It is
supposed to be set to 1 if it is I/O space.  Few systems do this, but this
enables the ones that do set it to work properly.

Signed-off-by: Corey Minyard <minyard@acm.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 drivers/char/ipmi/ipmi_si_intf.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletion(-)

diff -puN drivers/char/ipmi/ipmi_si_intf.c~ipmi-fix-for-handling-bad-dmi-data drivers/char/ipmi/ipmi_si_intf.c
--- 25/drivers/char/ipmi/ipmi_si_intf.c~ipmi-fix-for-handling-bad-dmi-data	2005-04-26 19:59:50.507164120 -0700
+++ 25-akpm/drivers/char/ipmi/ipmi_si_intf.c	2005-04-26 19:59:50.512163360 -0700
@@ -1623,7 +1623,13 @@ static int decode_dmi(dmi_header_t *dm, 
 		}
 	} else {
 		/* Old DMI spec. */
-		ipmi_data->base_addr = base_addr;
+		/* Note that technically, the lower bit of the base
+		 * address should be 1 if the address is I/O and 0 if
+		 * the address is in memory.  So many systems get that
+		 * wrong (and all that I have seen are I/O) so we just
+		 * ignore that bit and assume I/O.  Systems that use
+		 * memory should use the newer spec, anyway. */
+		ipmi_data->base_addr = base_addr & 0xfffe;
 		ipmi_data->addr_space = IPMI_IO_ADDR_SPACE;
 		ipmi_data->offset = 1;
 	}
_