Updated per Andrea's suggestions...
-- 
Jeff Garzik                    | The difference between laziness and
Building 1024                  | prioritization is the end result.
MandrakeSoft                   |
diff -urN vanilla/linux-2.4.0-test10-pre4/drivers/char/pc_keyb.c 
linux_2_3/drivers/char/pc_keyb.c
--- vanilla/linux-2.4.0-test10-pre4/drivers/char/pc_keyb.c      Wed Oct 18 19:03:57 
2000
+++ linux_2_3/drivers/char/pc_keyb.c    Wed Oct 18 20:20:14 2000
@@ -65,7 +65,7 @@
 static void __aux_write_ack(int val);
 #endif
 
-spinlock_t kbd_controller_lock = SPIN_LOCK_UNLOCKED;
+static spinlock_t kbd_controller_lock = SPIN_LOCK_UNLOCKED;
 static unsigned char handle_kbd_event(void);
 
 /* used only by send_data - set by keyboard_interrupt */
@@ -448,7 +448,7 @@
        unsigned char status = kbd_read_status();
        unsigned int work = 10000;
 
-       while (status & KBD_STAT_OBF) {
+       while ((--work > 0) && (status & KBD_STAT_OBF)) {
                unsigned char scancode;
 
                scancode = kbd_read_input();
@@ -467,13 +467,10 @@
                }
 
                status = kbd_read_status();
-               
-               if (!--work) {
-                       printk(KERN_ERR "pc_keyb: controller jammed (0x%02X).\n",
-                               status);
-                       break;
-               }
        }
+               
+       if (!work)
+               printk(KERN_ERR "pc_keyb: controller jammed (0x%02X).\n", status);
 
        return status;
 }
@@ -481,14 +478,13 @@
 
 static void keyboard_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
-       unsigned long flags;
-
 #ifdef CONFIG_VT
        kbd_pt_regs = regs;
 #endif
-       spin_lock_irqsave(&kbd_controller_lock, flags);
+
+       spin_lock_irq(&kbd_controller_lock);
        handle_kbd_event();
-       spin_unlock_irqrestore(&kbd_controller_lock, flags);
+       spin_unlock_irq(&kbd_controller_lock);
 }
 
 /*
diff -urN vanilla/linux-2.4.0-test10-pre4/drivers/char/q40_keyb.c 
linux_2_3/drivers/char/q40_keyb.c
--- vanilla/linux-2.4.0-test10-pre4/drivers/char/q40_keyb.c     Wed Sep  8 14:51:22 
1999
+++ linux_2_3/drivers/char/q40_keyb.c   Wed Oct 18 20:20:14 2000
@@ -94,7 +94,7 @@
 };
 
 
-spinlock_t kbd_controller_lock = SPIN_LOCK_UNLOCKED;
+static spinlock_t kbd_controller_lock = SPIN_LOCK_UNLOCKED;
 
 
 /*
@@ -340,11 +340,10 @@
 
 static void keyboard_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
-       unsigned long flags;
        unsigned char status;
 
        disable_keyboard();
-       spin_lock_irqsave(&kbd_controller_lock, flags);
+       spin_lock(&kbd_controller_lock);
        kbd_pt_regs = regs;
 
        status = IRQ_KEYB_MASK & master_inb(INTERRUPT_REG);
@@ -386,7 +385,7 @@
              keyup=1;
          }
 exit:
-       spin_unlock_irqrestore(&kbd_controller_lock, flags);
+       spin_unlock(&kbd_controller_lock);
        master_outb(-1,KEYBOARD_UNLOCK_REG); /* keyb ints reenabled herewith */
        enable_keyboard();
 }

Reply via email to