Skip to contentSkip to conversation

keyboard repeat speed went nuts since 2.6.0-test5, even in 2.6.0-test6-mm4

DISCUSSION Jurriaan 3 participants 5 messages Oct 7, 2003 – Oct 13, 2003 Input drivers

lore
Share & tools
lore

Jurriaan

author
#0 lore raw

I like my keyboard fast (must be from playing a lot of angband).

In 2.6.0-test5, after '/sbin/kbdrate -r 30 -d 250', I get some 2000 characters in a minute (pressing n continuously, stopwatch in hand). In 2.6.0-test6 and 2.6.0-test6-mm4, after '/sbin/kbdrate -r 30 -d 250', I get some 820 characters in a minute.

30 cps != 800/60 s, that's more like half that rate.

Booting with or without atkbd_softrepeat=1 on the kernel commandline makes no difference at all.

It's not only the repeat-speed that has gone down, the delay before repeat kicks in is notably slower as well. This is perhaps even more frustrating, but harder to measure :-(

This is on a plain Chicony KB-7903 PS/2 keyboard. It is connected via a Vista Rose KVM to a VIA KT400 chipset motherboard.

Any patches to test are very welcome here.

Thanks,
Jurriaan

Signature · 5 lines
She'd put a lot of work and practice into that glare, and it had always
served her well in the past. It suggested she was one hundred percent
crazy, barely under control, and violent with it.
	Simon R Green - Guard against Dishonour
Debian (Unstable) GNU/Linux 2.6.0-test5 4276 bogomips 0.33 0.14
#1 lore raw
Quoted 11 lines · Jurriaan

I like my keyboard fast (must be from playing a lot of angband).

In 2.6.0-test5, after '/sbin/kbdrate -r 30 -d 250', I get some 2000 characters in a minute (pressing n continuously, stopwatch in hand). In 2.6.0-test6 and 2.6.0-test6-mm4, after '/sbin/kbdrate -r 30 -d 250', I get some 820 characters in a minute.

30 cps != 800/60 s, that's more like half that rate.

Booting with or without atkbd_softrepeat=1 on the kernel commandline makes no difference at all.

It's a bug. I have a fix, it went through LKML already, but Linus didn't merge it yet. I'll be resending it.

Quoted 8 lines

It's not only the repeat-speed that has gone down, the delay before repeat kicks in is notably slower as well. This is perhaps even more frustrating, but harder to measure :-(

This is on a plain Chicony KB-7903 PS/2 keyboard. It is connected via a Vista Rose KVM to a VIA KT400 chipset motherboard.

Any patches to test are very welcome here.

Fix attached.

Signature · 2 lines
Vojtech Pavlik
SuSE Labs, SuSE CR

You can pull this changeset from:
bk://kernel.bkbits.net/vojtech/input

===================================================================

[email protected], 2003-09-29 17:00:25+02:00, [email protected]
input: Fix AT keyboard repeat rate setting, also make rate selection
in finer steps.

 atkbd.c |   19 ++++++++++---------
 1 files changed, 10 insertions(+), 9 deletions(-)

===================================================================

drivers/input/keyboard/atkbd.c +10 -9
diff -Nru a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
@@ -370,10 +370,11 @@
 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;
 
@@ -407,11 +408,11 @@
 			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;
author
#2 lore raw

From: Vojtech Pavlik <[email protected]>
Date: Tue, Oct 07, 2003 at 10:40:56PM +0200

Quoted 20 lines · Jurriaan
Quoted 11 lines

I like my keyboard fast (must be from playing a lot of angband).

In 2.6.0-test5, after '/sbin/kbdrate -r 30 -d 250', I get some 2000 characters in a minute (pressing n continuously, stopwatch in hand). In 2.6.0-test6 and 2.6.0-test6-mm4, after '/sbin/kbdrate -r 30 -d 250', I get some 820 characters in a minute.

30 cps != 800/60 s, that's more like half that rate.

Booting with or without atkbd_softrepeat=1 on the kernel commandline makes no difference at all.

It's a bug. I have a fix, it went through LKML already, but Linus didn't merge it yet. I'll be resending it.

Quoted 4 lines

It's not only the repeat-speed that has gone down, the delay before repeat kicks in is notably slower as well. This is perhaps even more frustrating, but harder to measure :-(

Quoted 7 lines
Quoted 4 lines

This is on a plain Chicony KB-7903 PS/2 keyboard. It is connected via a Vista Rose KVM to a VIA KT400 chipset motherboard.

Any patches to test are very welcome here.

Fix attached.

Sorry, but that fix is already in 2.6.0-test6-mm4; that's why I tested that version...

Anyway, I added some printk's like this:

                case EV_REP:

                        printk( KERN_INFO "atkbd: atkbd_softrepeat %d\n", atkbd_softrepeat);
                        if (atkbd_softrepeat) return 0;

                        i = j = 0;
                        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];
                        printk( KERN_INFO "atkbd: period %d delay %d\n", period[i], delay[j]);
                        param[0] = i | (j << 5);
                        atkbd_command(atkbd, param, ATKBD_CMD_SETREP);

                        return 0;

And even if my command-line for the kernel looks like this:

Kernel command line: root=/dev/md3 video=matroxfb:xres:1600,yres:1360,depth:16,pixclock:4116,left:304,right:64,upper:46,lower:1,hslen :192,vslen:3,fv:90,hwcursor=off hdb=scsi apm=power-off atkbd_softrepeat=1

I still see this:

:kbdrate -r 50 -d 100
atkbd: atkbd_softrepeat 0
atkbd: period 33 delay 250
atkbd: atkbd_softrepeat 0
atkbd: period 33 delay 250
Typematic Rate set to 30.3 cps (delay = 250 ms)

and I still get only 800 cpm, which means 14 cps or so. Why it atkbd_softrepeat still 0 with this command-line?

Kind regards,
Jurriaan

Signature · 4 lines
How should I know if it works?  That's what beta testers are for.  I
only coded it.
	Attributed to Linus Torvalds, somewhere in a posting
Debian (Unstable) GNU/Linux 2.6.0-test6-mm4 4276 bogomips 0.27 0.14
#3 lore raw
Quoted 25 lines · Jurriaan

From: Vojtech Pavlik <[email protected]>
Date: Tue, Oct 07, 2003 at 10:40:56PM +0200

Quoted 23 lines · Jurriaan
Quoted 11 lines

I like my keyboard fast (must be from playing a lot of angband).

In 2.6.0-test5, after '/sbin/kbdrate -r 30 -d 250', I get some 2000 characters in a minute (pressing n continuously, stopwatch in hand). In 2.6.0-test6 and 2.6.0-test6-mm4, after '/sbin/kbdrate -r 30 -d 250', I get some 820 characters in a minute.

30 cps != 800/60 s, that's more like half that rate.

Booting with or without atkbd_softrepeat=1 on the kernel commandline makes no difference at all.

It's a bug. I have a fix, it went through LKML already, but Linus didn't merge it yet. I'll be resending it.

Quoted 7 lines

It's not only the repeat-speed that has gone down, the delay before repeat kicks in is notably slower as well. This is perhaps even more frustrating, but harder to measure :-(

This is on a plain Chicony KB-7903 PS/2 keyboard. It is connected via a Vista Rose KVM to a VIA KT400 chipset motherboard.

Quoted 6 lines
Quoted 4 lines
Quoted 1 line

Any patches to test are very welcome here.

Fix attached.

Sorry, but that fix is already in 2.6.0-test6-mm4; that's why I tested that version...

Yet another bug. Fix attached, too.

Signature · 2 lines
Vojtech Pavlik
SuSE Labs, SuSE CR

You can pull this changeset from:
bk://kernel.bkbits.net/vojtech/input

===================================================================

[email protected], 2003-09-28 18:48:05+02:00, [email protected]
input: Fix atkbd_softrepeat kernel command line parameter.

 atkbd.c |    8 ++++++++
 1 files changed, 8 insertions(+)

===================================================================

drivers/input/keyboard/atkbd.c +8 -0
diff -Nru a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
@@ -707,9 +707,17 @@
         if (ints[0] > 0) atkbd_reset = ints[1];
         return 1;
 }
+static int __init atkbd_setup_softrepeat(char *str)
+{
+        int ints[4];
+        str = get_options(str, ARRAY_SIZE(ints), ints);
+        if (ints[0] > 0) atkbd_softrepeat = ints[1];
+        return 1;
+}
 
 __setup("atkbd_set=", atkbd_setup_set);
 __setup("atkbd_reset", atkbd_setup_reset);
+__setup("atkbd_softrepeat=", atkbd_setup_softrepeat);
 #endif
 
 int __init atkbd_init(void)
#4 lore raw
Quoted 7 lines · Vojtech Pavlik

+static int __init atkbd_setup_softrepeat(char *str)
+{

 +        int ints[4];
 +        str = get_options(str, ARRAY_SIZE(ints), ints);
 +        if (ints[0] > 0) atkbd_softrepeat = ints[1];
 +        return 1;
Quoted 5 lines

+}

__setup("atkbd_set=", atkbd_setup_set); __setup("atkbd_reset", atkbd_setup_reset);
+__setup("atkbd_softrepeat=", atkbd_setup_softrepeat);

Could we please try to keep Documentation/kernel-parameters.txt in sync with the code?

Thanks.