Commit c362c06a authored by Vojtech Pavlik's avatar Vojtech Pavlik

input: Disable the AUX LoopBack command in i8042.c on Compaq ProLiant

       8-way Xeon ProFusion systems, as it causes crashes and reboots
       on these machines. DMI data is used for determining if the
       workaround should be enabled.
Signed-off-by: default avatarVojtech Pavlik <vojtech@suse.cz>
parent dfc2505c
...@@ -15,6 +15,9 @@ ...@@ -15,6 +15,9 @@
unsigned long dmi_broken; unsigned long dmi_broken;
EXPORT_SYMBOL(dmi_broken); EXPORT_SYMBOL(dmi_broken);
unsigned int i8042_dmi_noloop = 0;
EXPORT_SYMBOL(i8042_dmi_noloop);
int is_sony_vaio_laptop; int is_sony_vaio_laptop;
int is_unsafe_smbus; int is_unsafe_smbus;
int es7000_plat = 0; int es7000_plat = 0;
...@@ -400,6 +403,17 @@ static __init int sony_vaio_laptop(struct dmi_blacklist *d) ...@@ -400,6 +403,17 @@ static __init int sony_vaio_laptop(struct dmi_blacklist *d)
return 0; return 0;
} }
/*
* Several HP Proliant (and maybe other OSB4/ProFusion) systems
* shouldn't use the AUX LoopBack command, or they crash or reboot.
*/
static __init int set_8042_noloop(struct dmi_blacklist *d)
{
i8042_dmi_noloop = 1;
return 0;
}
/* /*
* This bios swaps the APM minute reporting bytes over (Many sony laptops * This bios swaps the APM minute reporting bytes over (Many sony laptops
* have this problem). * have this problem).
...@@ -875,6 +889,23 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={ ...@@ -875,6 +889,23 @@ static __initdata struct dmi_blacklist dmi_blacklist[]={
NO_MATCH, NO_MATCH, NO_MATCH, NO_MATCH,
} }, } },
/*
* Several HP Proliant (and maybe other OSB4/ProFusion) systems
* can't use i8042 in mux mode, or they crash or reboot.
*/
{ set_8042_noloop, "Compaq Proliant 8500", {
MATCH(DMI_SYS_VENDOR, "Compaq"),
MATCH(DMI_PRODUCT_NAME , "ProLiant"),
MATCH(DMI_PRODUCT_VERSION, "8500"),
NO_MATCH }},
{ set_8042_noloop, "Compaq Proliant DL760", {
MATCH(DMI_SYS_VENDOR, "Compaq"),
MATCH(DMI_PRODUCT_NAME , "ProLiant"),
MATCH(DMI_PRODUCT_VERSION, "DL760"),
NO_MATCH }},
#ifdef CONFIG_ACPI_BOOT #ifdef CONFIG_ACPI_BOOT
/* /*
* If your system is blacklisted here, but you find that acpi=force * If your system is blacklisted here, but you find that acpi=force
......
/* /*
* i8042 keyboard and mouse controller driver for Linux * i8042 keyboard and mouse controller driver for Linux
* *
* Copyright (c) 1999-2002 Vojtech Pavlik * Copyright (c) 1999-2004 Vojtech Pavlik
*/ */
/* /*
...@@ -52,6 +52,8 @@ static unsigned int i8042_dumbkbd; ...@@ -52,6 +52,8 @@ static unsigned int i8042_dumbkbd;
module_param_named(dumbkbd, i8042_dumbkbd, bool, 0); module_param_named(dumbkbd, i8042_dumbkbd, bool, 0);
MODULE_PARM_DESC(dumbkbd, "Pretend that controller can only read data from keyboard"); MODULE_PARM_DESC(dumbkbd, "Pretend that controller can only read data from keyboard");
static unsigned int i8042_noloop;
__obsolete_setup("i8042_noaux"); __obsolete_setup("i8042_noaux");
__obsolete_setup("i8042_nomux"); __obsolete_setup("i8042_nomux");
__obsolete_setup("i8042_unlock"); __obsolete_setup("i8042_unlock");
...@@ -154,6 +156,9 @@ static int i8042_command(unsigned char *param, int command) ...@@ -154,6 +156,9 @@ static int i8042_command(unsigned char *param, int command)
unsigned long flags; unsigned long flags;
int retval = 0, i = 0; int retval = 0, i = 0;
if (i8042_noloop && command == I8042_CMD_AUX_LOOP)
return -1;
spin_lock_irqsave(&i8042_lock, flags); spin_lock_irqsave(&i8042_lock, flags);
retval = i8042_wait_write(); retval = i8042_wait_write();
...@@ -955,6 +960,13 @@ int __init i8042_init(void) ...@@ -955,6 +960,13 @@ int __init i8042_init(void)
if (i8042_dumbkbd) if (i8042_dumbkbd)
i8042_kbd_port.write = NULL; i8042_kbd_port.write = NULL;
#ifdef __i386__
if (i8042_dmi_noloop) {
printk(KERN_INFO "i8042.c: AUX LoopBack command disabled by DMI.\n");
i8042_noloop = 1;
}
#endif
if (!i8042_noaux && !i8042_check_aux(&i8042_aux_values)) { if (!i8042_noaux && !i8042_check_aux(&i8042_aux_values)) {
if (!i8042_nomux && !i8042_check_mux(&i8042_aux_values)) if (!i8042_nomux && !i8042_check_mux(&i8042_aux_values))
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment