Commit bdd82e81 authored by James Blackwell's avatar James Blackwell Committed by Petr Vandrovec

[PATCH] Toshiba.c IRQ Patch (Christoph Hellwig eats people?)

Somewhere around 2.5.31 the method for setting and clearing interrupts
changed:

From-                     To-
save_flags(flags);        local_irq_save(flags);
cli();

restore_flags(flags);     local_irq_restore(flags);


Though bordering on trivial, including toshiba support with stock 2.5.34
fails to compile, which this patch seems to fix. This patch fixes this
issue and has worked reliably for me under 2.5.31, though it is untested on
2.5.32 and 2.5.33 because I didn't manage to get those to work.

A note to those that are a bit rough on kernel patch newbies.... submitting
a kernel patch for the very first time is a rather intimidating experience
so please don't chew my head off unless its absolutely necessary.

See my point? I was so worried that Cristoph Hellwig is going to come to
my house and eat me I forgot to include the patch itself. :)
parent 0d961969
...@@ -114,11 +114,10 @@ static int tosh_fn_status(void) ...@@ -114,11 +114,10 @@ static int tosh_fn_status(void)
if (tosh_fn!=0) { if (tosh_fn!=0) {
scan = inb(tosh_fn); scan = inb(tosh_fn);
} else { } else {
save_flags(flags); local_irq_save(flags);
cli();
outb(0x8e, 0xe4); outb(0x8e, 0xe4);
scan = inb(0xe5); scan = inb(0xe5);
restore_flags(flags); local_irq_restore(flags);
} }
return (int) scan; return (int) scan;
...@@ -141,35 +140,32 @@ static int tosh_emulate_fan(SMMRegisters *regs) ...@@ -141,35 +140,32 @@ static int tosh_emulate_fan(SMMRegisters *regs)
if (tosh_id==0xfccb) { if (tosh_id==0xfccb) {
if (eax==0xfe00) { if (eax==0xfe00) {
/* fan status */ /* fan status */
save_flags(flags); local_irq_save(flags);
cli();
outb(0xbe, 0xe4); outb(0xbe, 0xe4);
al = inb(0xe5); al = inb(0xe5);
restore_flags(flags); local_irq_restore(flags);
regs->eax = 0x00; regs->eax = 0x00;
regs->ecx = (unsigned int) (al & 0x01); regs->ecx = (unsigned int) (al & 0x01);
} }
if ((eax==0xff00) && (ecx==0x0000)) { if ((eax==0xff00) && (ecx==0x0000)) {
/* fan off */ /* fan off */
save_flags(flags); local_irq_save(flags);
cli();
outb(0xbe, 0xe4); outb(0xbe, 0xe4);
al = inb(0xe5); al = inb(0xe5);
outb(0xbe, 0xe4); outb(0xbe, 0xe4);
outb (al | 0x01, 0xe5); outb (al | 0x01, 0xe5);
restore_flags(flags); local_irq_restore(flags);
regs->eax = 0x00; regs->eax = 0x00;
regs->ecx = 0x00; regs->ecx = 0x00;
} }
if ((eax==0xff00) && (ecx==0x0001)) { if ((eax==0xff00) && (ecx==0x0001)) {
/* fan on */ /* fan on */
save_flags(flags); local_irq_save(flags);
cli();
outb(0xbe, 0xe4); outb(0xbe, 0xe4);
al = inb(0xe5); al = inb(0xe5);
outb(0xbe, 0xe4); outb(0xbe, 0xe4);
outb(al & 0xfe, 0xe5); outb(al & 0xfe, 0xe5);
restore_flags(flags); local_irq_restore(flags);
regs->eax = 0x00; regs->eax = 0x00;
regs->ecx = 0x01; regs->ecx = 0x01;
} }
...@@ -180,33 +176,30 @@ static int tosh_emulate_fan(SMMRegisters *regs) ...@@ -180,33 +176,30 @@ static int tosh_emulate_fan(SMMRegisters *regs)
if (tosh_id==0xfccc) { if (tosh_id==0xfccc) {
if (eax==0xfe00) { if (eax==0xfe00) {
/* fan status */ /* fan status */
save_flags(flags); local_irq_save(flags);
cli();
outb(0xe0, 0xe4); outb(0xe0, 0xe4);
al = inb(0xe5); al = inb(0xe5);
restore_flags(flags); local_irq_restore(flags);
regs->eax = 0x00; regs->eax = 0x00;
regs->ecx = al & 0x01; regs->ecx = al & 0x01;
} }
if ((eax==0xff00) && (ecx==0x0000)) { if ((eax==0xff00) && (ecx==0x0000)) {
/* fan off */ /* fan off */
save_flags(flags); local_irq_save(flags);
cli();
outb(0xe0, 0xe4); outb(0xe0, 0xe4);
al = inb(0xe5); al = inb(0xe5);
outw(0xe0 | ((al & 0xfe) << 8), 0xe4); outw(0xe0 | ((al & 0xfe) << 8), 0xe4);
restore_flags(flags); local_irq_restore(flags);
regs->eax = 0x00; regs->eax = 0x00;
regs->ecx = 0x00; regs->ecx = 0x00;
} }
if ((eax==0xff00) && (ecx==0x0001)) { if ((eax==0xff00) && (ecx==0x0001)) {
/* fan on */ /* fan on */
save_flags(flags); local_irq_save(flags);
cli();
outb(0xe0, 0xe4); outb(0xe0, 0xe4);
al = inb(0xe5); al = inb(0xe5);
outw(0xe0 | ((al | 0x01) << 8), 0xe4); outw(0xe0 | ((al | 0x01) << 8), 0xe4);
restore_flags(flags); local_irq_restore(flags);
regs->eax = 0x00; regs->eax = 0x00;
regs->ecx = 0x01; regs->ecx = 0x01;
} }
......
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