Messages in this thread Patch in this message | | | Date | Fri, 11 Oct 2002 12:46:15 +0200 | From | Vojtech Pavlik <> | Subject | [patch] Input - Fix keyboard autorepeat ioctl [5/5] |
| |
You can import this changeset into BK by piping this whole message to: '| bk receive [path to repository]' or apply the patch as usual. 'bk pull bk://linux-input.bkbits.net/linux-input' should work as well.
===================================================================
ChangeSet@1.743, 2002-10-11 12:02:20+02:00, Andries.Brouwer@cwi.nl Since 2.5.32 the keyboard repeat code was broken. The reason Vojtech broke it was the stupid name of a field in struct kbd_repeat, namely "rate". Every sane person expects that a rate has dimension [1/sec], but here the "rate" is a time period measured in msec. So, the patch below first of all fixes the code, and secondly changes the name. Since Vojtech used PERIOD as index, I also used period as field name in the struct. Half of the stuff below is actually from Alan Stern. Andries
drivers/char/keyboard.c | 31 +++++++++++++++++++++---------- drivers/char/vt_ioctl.c | 6 ++++-- drivers/sbus/char/uctrl.c | 2 +- include/linux/kd.h | 3 ++- 4 files changed, 28 insertions(+), 14 deletions(-)
===================================================================
diff -Nru a/drivers/char/keyboard.c b/drivers/char/keyboard.c --- a/drivers/char/keyboard.c Fri Oct 11 12:43:20 2002 +++ b/drivers/char/keyboard.c Fri Oct 11 12:43:20 2002 @@ -264,23 +264,34 @@ /* * Setting the keyboard rate. */ +static inline unsigned int ms_to_jiffies(unsigned int ms) { + unsigned int j; + + j = (ms * HZ + 500) / 1000; + return (j > 0) ? j : 1; +} + int kbd_rate(struct kbd_repeat *rep) { - struct list_head * node; - - if (rep->rate < 0 || rep->delay < 0) - return -EINVAL; + struct list_head *node; + unsigned int d = 0; + unsigned int p = 0; list_for_each(node,&kbd_handler.h_list) { struct input_handle *handle = to_handle_h(node); - if (test_bit(EV_REP, handle->dev->evbit)) { - if (rep->rate > HZ) rep->rate = HZ; - handle->dev->rep[REP_PERIOD] = rep->rate ? (HZ / rep->rate) : 0; - handle->dev->rep[REP_DELAY] = rep->delay * HZ / 1000; - if (handle->dev->rep[REP_DELAY] < handle->dev->rep[REP_PERIOD]) - handle->dev->rep[REP_DELAY] = handle->dev->rep[REP_PERIOD]; + struct input_dev *dev = handle->dev; + + if (test_bit(EV_REP, dev->evbit)) { + if (rep->delay > 0) + dev->rep[REP_DELAY] = ms_to_jiffies(rep->delay); + if (rep->period > 0) + dev->rep[REP_PERIOD] = ms_to_jiffies(rep->period); + d = dev->rep[REP_DELAY] * 1000 / HZ; + p = dev->rep[REP_PERIOD] * 1000 / HZ; } } + rep->delay = d; + rep->period = p; return 0; } diff -Nru a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c --- a/drivers/char/vt_ioctl.c Fri Oct 11 12:43:20 2002 +++ b/drivers/char/vt_ioctl.c Fri Oct 11 12:43:20 2002 @@ -430,6 +430,7 @@ case KDKBDREP: { struct kbd_repeat kbrep; + int err; if (!capable(CAP_SYS_TTY_CONFIG)) return -EPERM; @@ -437,8 +438,9 @@ if (copy_from_user(&kbrep, (void *)arg, sizeof(struct kbd_repeat))) return -EFAULT; - if ((i = kbd_rate( &kbrep ))) - return i; + err = kbd_rate(&kbrep); + if (err) + return err; if (copy_to_user((void *)arg, &kbrep, sizeof(struct kbd_repeat))) return -EFAULT; diff -Nru a/drivers/sbus/char/uctrl.c b/drivers/sbus/char/uctrl.c --- a/drivers/sbus/char/uctrl.c Fri Oct 11 12:43:20 2002 +++ b/drivers/sbus/char/uctrl.c Fri Oct 11 12:43:20 2002 @@ -107,7 +107,7 @@ u8 speaker_volume; /* 0x23 */ u8 control_tft_brightness; /* 0x24 */ u8 control_kbd_repeat_delay; /* 0x28 */ - u8 control_kbd_repeat_rate; /* 0x29 */ + u8 control_kbd_repeat_period; /* 0x29 */ u8 control_screen_contrast; /* 0x2F */ }; diff -Nru a/include/linux/kd.h b/include/linux/kd.h --- a/include/linux/kd.h Fri Oct 11 12:43:20 2002 +++ b/include/linux/kd.h Fri Oct 11 12:43:20 2002 @@ -134,7 +134,8 @@ struct kbd_repeat { int delay; /* in msec; <= 0: don't change */ - int rate; /* in msec; <= 0: don't change */ + int period; /* in msec; <= 0: don't change */ + /* earlier this field was misnamed "rate" */ }; #define KDKBDREP 0x4B52 /* set keyboard delay/repeat rate; =================================================================== This BitKeeper patch contains the following changesets: 1.743 ## Wrapped with gzip_uu ##
begin 664 bkpatch1749 M'XL(`$BKICT``\58>V_;-A#_V_H4AQ;8DC212;TLV7.6M$F78`4:I&N!M2L, M6J)CV1)ED%02=]YWWU%27G;=/+9U=B!#Y-WQ=^]CGL-[Q66W=5Y,-(_'UG,X M*I3NME2IN!U_P??3HL#W]KC(>;NA:@^G[53,2FWA_@G3\1C.N53=%K7=ZQ4] MG_%NZ_3PE_=O]D\MJ]^'5V,FSO@[KJ'?MW0ASUF6J#VFQUDA;"V94#G7S(Z+ M?'%-NG`(<?#KTXY+_&!!`^)U%C%-*&4>Y0EQO##PK`;87@-[B9\22BDAU'$6 M;M0AU#H`:G<\%XC3IJ1-*5"G2YRN0U[@DQ#8%XE,N;)?RJ*\X'(OODAMD<$+ M#W:(]1+^7>ROK!C>I2+FX-B^[3J@QQRF?#XLF$Q`\AEG&N(BX7#!%`QE,>7" M1I[?D$QRI@H!'VKUZTU(=45IQ"A=SM($!,LY%"-@,$IYEB!S*G!/EK&&Z3`9 MU(=L5W39')Y)IODS&^`0W3H'Q02'&3JX$,C)+V<\UD8\PF)@2&&,QR5ISH5* M$<TGVE8\_KP-PU+#F$MNH"!G+192A6P:J8W,M$@@1R5*R1,#*D=.HYRQ2;%= MZ3"KPFG(L^("X4NE*TVR#%\N>:VFL<XVLC"1``HH1():Q)4?:@*CF'UMYRMS M8;`D<')X>OSV`%"#5"3\<AN.4;@JZLT:H9&L:M/5ID2@M76-!1NX1RP;&62- MV4>C!K)1-]8E`I[#2!8Y[&=,P#O-I6@XFVBS?@4W<J/0.KG)%&OGD1_+(HQ8 MN_>$*)YG$K:-)I+M<VW'MT+5(\1;!"[FS,(/@L`=,>HSCU#FKLN+97&#M(AU MU@AM<L^AWL*+"(D>A^TJ#581^GY$HP7WXH3P8.@D(SX:N<&#$"X)O860>AX- M'HQ0#<M&(D:!S)8P4BPV3N0[BRB,8RP[H<N"P`^=Z#Z,7Q=["Z7OX>=>E!CI M69GP=I:*\K(]3>SQ[7H4>61!?>J'"R\9AF[HCX8D]I@7N.O@K9%W&U<8=(*J MTJ\Q]_UU_Q\Y?Z4+?-OK)#1?ERP(!J97]00:+;<$ZMW3$AP*._2_:0JOT\M; M?<#46<6U3L69C:6B#M6WL",OJC],_9-U=G]"%3EV@@`ZEM),IZ9;H-<YE%C? MST15J#56ZH$N!I-TA'51;2QM;<*?5NO.VJ1G_6&U)M"'C5S!%AQ]A!?@$[() M;4!?D)[5DER74L#&!'8!UW^&"72!]JR_D//`"2+P$%;'`==J-;TK2Y4>C#E+ M8$M@"^@MG9G@:61Y<58O'CB=``(4&%*(K-:5Q&JL&23\'+;,HX^M#9L)W]G% MMTJ#5CJ"#<WQW&&J-PX_#$X/3[8!=W=V^3DN;5:JUV385@UCQN:51F:Y55'B MQB?D&QP<OMG__3.><M>8-WR;O3NRFH;Y=6%U(ULCK>:LQ1FS?`T&>L5X`AUR M]+$BG"T37AUQAQ!-Z()CW'>MK>'K-2L-YC[,>JNUX:99/+(V/+QI61.5YGDA MU%[.+B]XEMF<292?BJDM,!^_U;Q(1#LT=#JNO_`Z/JT'1QH^NDC@W.A\_Q)1 M]]MOE8@;=9]2(CR<5:G)",PJ+B7FE.<1C(1C+$TF25NXB'ZO!DR$MO'#=(@1 M4<6@B6C<K:*X2?M*PNT`6>F##P^1)W9F2Y9*S_?,,R[DS(BT67F?U`Z-2$"I M'V%C=E"(B9'']Q'31KY_B-2CQ)H06='W"4%R@,,!!LEQ_=,J0YS5A99%-KBY M=PSJ$M&#]A:02QR0MMI5(*Q.'/='P%.G'NM+.IOQ;*_BV\F#<&H7\FRM.!^] MWJ$X1:#/`]^M?.X]?G;X?WQ>C6E+/E]5]$G.=CN5L_$'&T+5;6O7MM"US>VN M!S]A`^Y"4H@?=7-),Q['2H!$6)NSE$N\1:57-RYSE\U392Y>R=4=TD3(U3\: 7XC&/IZK,^\Q+T$1#8OT-CH##&-40```` ` end - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |