From: Vojtech Pavlik <vojtech@suse.cz>

On Sun, Sep 28, 2003 at 10:59:02AM +0200, Roger Luethi wrote:

> With test6, keyboard repeat takes very noticably longer to kick in after X
> has been started (for both X and console). In test5, starting X makes no
> difference.

Bug in repeat rate setting code. Thanks for reporting, this should fix
it:



 25-akpm/drivers/input/keyboard/atkbd.c |   19 ++++++++++---------
 1 files changed, 10 insertions(+), 9 deletions(-)

diff -puN drivers/input/keyboard/atkbd.c~keyboard-repeat-rate-setting-fix drivers/input/keyboard/atkbd.c
--- 25/drivers/input/keyboard/atkbd.c~keyboard-repeat-rate-setting-fix	Mon Sep 29 12:15:01 2003
+++ 25-akpm/drivers/input/keyboard/atkbd.c	Mon Sep 29 12:15:01 2003
@@ -369,10 +369,11 @@ static int atkbd_command(struct atkbd *a
 static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
 {
 	struct atkbd *atkbd = dev->private;
-	struct { int p; u8 v; } period[] =	
-		{ {30, 0x00}, {25, 0x02}, {20, 0x04}, {15, 0x08}, {10, 0x0c}, {7, 0x10}, {5, 0x14}, {0, 0x14} };
-	struct { int d; u8 v; } delay[] =
-        	{ {1000, 0x60}, {750, 0x40}, {500, 0x20}, {250, 0x00}, {0, 0x00} };
+	const short period[32] =
+		{ 33,  37,  42,  46,  50,  54,  58,  63,  67,  75,  83,  92, 100, 109, 116, 125,
+		 133, 149, 167, 182, 200, 217, 232, 250, 270, 303, 333, 370, 400, 435, 470, 500 };
+	const short delay[4] =
+		{ 250, 500, 750, 1000 };
 	char param[2];
 	int i, j;
 
@@ -406,11 +407,11 @@ static int atkbd_event(struct input_dev 
 			if (atkbd_softrepeat) return 0;
 
 			i = j = 0;
-			while (period[i].p > dev->rep[REP_PERIOD]) i++;
-			while (delay[j].d > dev->rep[REP_DELAY]) j++;
-			dev->rep[REP_PERIOD] = period[i].p;
-			dev->rep[REP_DELAY] = delay[j].d;
-			param[0] = period[i].v | delay[j].v;
+			while (i < 32 && period[i] < dev->rep[REP_PERIOD]) i++;
+			while (j < 4 && delay[j] < dev->rep[REP_DELAY]) j++;
+			dev->rep[REP_PERIOD] = period[i];
+			dev->rep[REP_DELAY] = delay[j];
+			param[0] = i | (j << 5);
 			atkbd_command(atkbd, param, ATKBD_CMD_SETREP);
 
 			return 0;

_