* [patch] Input - HID - fix find_next_zero usage [1/5]
@ 2002-10-11 10:44 Vojtech Pavlik
2002-10-11 10:44 ` [patch] Input - Fix atkbd.c oops on Alpha [2/5] Vojtech Pavlik
0 siblings, 1 reply; 5+ messages in thread
From: Vojtech Pavlik @ 2002-10-11 10:44 UTC (permalink / raw)
To: torvalds, linux-kernel
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.733.3.1, 2002-10-10 01:22:17-03:00, acme@dhcp197.conectiva
o hid-input: fix find_next_zero_bit usage
It was swapping the parameters, using the bitfield size for the
offset and the offset for the bitfield size. With this the mouse
buttons in my wireless USB keyboard finally works 8) 2.4 has the
same problem.
hid-input.c | 2 +-
1 files changed, 1 insertion(+), 1 deletion(-)
===================================================================
diff -Nru a/drivers/usb/input/hid-input.c b/drivers/usb/input/hid-input.c
--- a/drivers/usb/input/hid-input.c Fri Oct 11 12:42:52 2002
+++ b/drivers/usb/input/hid-input.c Fri Oct 11 12:42:52 2002
@@ -348,7 +348,7 @@
set_bit(usage->type, input->evbit);
while (usage->code <= max && test_and_set_bit(usage->code, bit)) {
- usage->code = find_next_zero_bit(bit, max + 1, usage->code);
+ usage->code = find_next_zero_bit(bit, usage->code, max + 1);
}
if (usage->code > max) return;
===================================================================
This BitKeeper patch contains the following changesets:
1.733.3.1
## Wrapped with gzip_uu ##
begin 664 bkpatch1632
M'XL(`"RKICT``^U56V^;,!1^CG_%D?JRJ@W8AD!@2I6UG;9NDU:UJO88&6R"
M%\`(FZ2I^/%S:):N6U9UT_HVL(6.S\7G\GWB`&ZT:.+!4GTU(LW1`;Q7VL0#
MW6KAI'=6OE+*RFZN2N%NK=QDX<JJ;@VR^DMFTAR6HM'Q@#C>[L2L:Q$/KMZ^
MN_GTY@JAR03.<E;-Q;4P,)D@HYHE*[B>,I,7JG),PRI="L.<5)7=SK2C&%/[
MCDCHX5'0D0#[89<23@CSB>"8^N/`1^=L*?GL@\@RT:RGC+/:YKDG$L$XHA3[
M'NY(%'@4G0-Q0L]S/(<`IB[!=@$F,:4Q"8?8BS$&EI9BRO.T)E%H8U8B-7+)
MX(C`$*-3^+>5G*$4%.22#_L.QY#)6[LK/JO$K9G=B4;-$FF@U6PNK*U=%P96
M3(->L;J6U1Q,+J!F#;,YV*D<6]/OI]8QDZ+@H.6=@$PUF]/-A5FF[5A8Q7NS
MK;C5/_9RX(LT=KJYU+VR5!8I-D32&J,J#;*"<@TKV8A":`TWUZ>P$.M$L89O
MRF!%8;6J66@8'P)U?,B9WF:A;<90-RHI1.F@CT`BCQ)T^8`;-/S#!R',,#JQ
MW;"(W#\?WL@-=MU6)^ZNZTZZFQ;%9.R1CHZLT$4^SP(^#CPQ#KV`>[^!QJ.@
M?<!?0A-LH>C;&\*.1GX4]`1YTFU#FI>J`VV)/34K6<AY;IPV75GZ/Z,0'-(1
M(:.`^MM"-HPB/Y$)Q_099"+_R?1R9+H?SF<8-JM^67)</@VXOV#;N3<B0-#%
M_6<PZ/LZ/$D5%S#9T_A7=A_##U;'4+);.`)R^/KAWY+F(EWHMIQP/,:92"+T
)#4&:=1RV!@``
`
end
^ permalink raw reply [flat|nested] 5+ messages in thread* [patch] Input - Fix atkbd.c oops on Alpha [2/5] 2002-10-11 10:44 [patch] Input - HID - fix find_next_zero usage [1/5] Vojtech Pavlik @ 2002-10-11 10:44 ` Vojtech Pavlik 2002-10-11 10:45 ` [patch] Input - Fixes in Active PS/2 Multiplexing support [3/5] Vojtech Pavlik 0 siblings, 1 reply; 5+ messages in thread From: Vojtech Pavlik @ 2002-10-11 10:44 UTC (permalink / raw) To: Vojtech Pavlik; +Cc: torvalds, linux-kernel 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.733.2.4, 2002-10-10 17:28:04-07:00, rth@dot.sfbay.redhat.com Avoid oops on systems that set atkbd_reset. atkbd.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) =================================================================== diff -Nru a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c --- a/drivers/input/keyboard/atkbd.c Fri Oct 11 12:42:59 2002 +++ b/drivers/input/keyboard/atkbd.c Fri Oct 11 12:42:59 2002 @@ -244,8 +244,9 @@ while (atkbd->cmdcnt && timeout--) udelay(10); - for (i = 0; i < receive; i++) - param[i] = atkbd->cmdbuf[(receive - 1) - i]; + if (param) + for (i = 0; i < receive; i++) + param[i] = atkbd->cmdbuf[(receive - 1) - i]; if (atkbd->cmdcnt) return (atkbd->cmdcnt = 0) - 1; =================================================================== This BitKeeper patch contains the following changesets: 1.733.2.4 ## Wrapped with gzip_uu ## begin 664 bkpatch1661 M'XL(`#.KICT``[64;4_;,!#'7\>?XB3>@%`2/Z5NPXI@;-JF30(Q\0JAR8E= MXK6)*]LMZI0//S=4H$ECL&DD5I2S+^>[^__B/;CRVI7)VGX/NF[0'GRT/I2) M7WF=U3^B?6EMM//&MCK?>>75/#?=<A507+^0H6Y@K9TO$Y*QAYFP6>HRN7S_ MX>K+Z25"TRF<-;*[U5]U@.D4!>O6<J'\B0S-PG99<++SK0XRJVW;/[CV%&,: M[X((AHM13T:8B[XFBA#)B5:8\O&((Q>:$V5#YF>5W&1.JT:&WP0BF&",B>"L M)VS""O0.2"88RVC&`=.<X#B`B)*.2\Q3+$J,X:G8<$@@Q>@M_-]2SE`-IVMK M%%B[]&`[\!L?=.LAQ(W!Q_;),*_4-Z?C>X8^`^&"<W3QV%^4_N6%$)88'<-. MWY-P9Q;FM@G9JKZ+%/3*F:W`]Z+G<[VIK'0J'_+(ZOO"!&:$X3''/9F,">FK M2DTTQ5H1-IH(]F0;7Q(\ZA:%HZ*@/:=X-!EP^O-W6\9>L9R'V+L?Y655X`F) MRA>XYX2,V4`?+7X%3Y0%?18\!BE]%?#.6Q,1BW$UF"Y86$HG6S`SB-/&0[=: M++;$W8MP#JF[&T8DZ.(9/?Z!R7>4"Z#H4TP/&$IB%OM#/@<H26;6P;Z!*>`C M,/`&G*YUW#X:AX?;]63PO#8WT67((#VN6U6M9M?[.U=(@1S$A[DY>CS&ZD;7 4<[]JIUHH/E(S@GX"1ADK_R$%```` ` end ^ permalink raw reply [flat|nested] 5+ messages in thread
* [patch] Input - Fixes in Active PS/2 Multiplexing support [3/5] 2002-10-11 10:44 ` [patch] Input - Fix atkbd.c oops on Alpha [2/5] Vojtech Pavlik @ 2002-10-11 10:45 ` Vojtech Pavlik 2002-10-11 10:45 ` [patch] Input - Fixes in uinput.c [4/5] Vojtech Pavlik 0 siblings, 1 reply; 5+ messages in thread From: Vojtech Pavlik @ 2002-10-11 10:45 UTC (permalink / raw) To: Vojtech Pavlik; +Cc: torvalds, linux-kernel 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.740, 2002-10-11 11:24:16+02:00, vojtech@suse.cz Fixes in i8042.c Active Multiplexing support. i8042.c | 48 +++++++++++++++++++++++++++++++----------------- 1 files changed, 31 insertions(+), 17 deletions(-) =================================================================== diff -Nru a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c --- a/drivers/input/serio/i8042.c Fri Oct 11 12:43:06 2002 +++ b/drivers/input/serio/i8042.c Fri Oct 11 12:43:06 2002 @@ -26,14 +26,16 @@ MODULE_LICENSE("GPL"); MODULE_PARM(i8042_noaux, "1i"); +MODULE_PARM(i8042_nomux, "1i"); MODULE_PARM(i8042_unlock, "1i"); MODULE_PARM(i8042_reset, "1i"); MODULE_PARM(i8042_direct, "1i"); MODULE_PARM(i8042_dumbkbd, "1i"); +static int i8042_reset; static int i8042_noaux; +static int i8042_nomux; static int i8042_unlock; -static int i8042_reset; static int i8042_direct; static int i8042_dumbkbd; @@ -220,7 +222,6 @@ return retval; } - /* * i8042_open() is called when a port is open by the higher layer. * It allocates the interrupt and enables in in the chip. @@ -323,8 +324,8 @@ static struct i8042_values i8042_mux_values[4]; static struct serio i8042_mux_port[4]; -static char i8042_mux_names[4][16]; -static char i8042_mux_short[4][8]; +static char i8042_mux_names[4][32]; +static char i8042_mux_short[4][16]; static char i8042_mux_phys[4][32]; /* @@ -364,15 +365,15 @@ dfl = ((str & I8042_STR_PARITY) ? SERIO_PARITY : 0) | ((str & I8042_STR_TIMEOUT) ? SERIO_TIMEOUT : 0); - if (i8042_mux_values[0].exists && (buffer[i].str & I8042_STR_AUXDATA)) { + if (i8042_mux_values[0].exists && (str & I8042_STR_AUXDATA)) { - if (buffer[i].str & I8042_STR_MUXERR) { - switch (buffer[i].data) { + if (str & I8042_STR_MUXERR) { + switch (data) { case 0xfd: case 0xfe: dfl = SERIO_TIMEOUT; break; case 0xff: dfl = SERIO_PARITY; break; } - buffer[i].data = 0xfe; + data = 0xfe; } else dfl = 0; dbg("%02x <- i8042 (interrupt, aux%d, %d%s%s)", @@ -380,8 +381,7 @@ dfl & SERIO_PARITY ? ", bad parity" : "", dfl & SERIO_TIMEOUT ? ", timeout" : ""); - if (i8042_mux_values[(str >> 6)].exists) - serio_interrupt(i8042_mux_port + (str >> 6), buffer[i].data, dfl); + serio_interrupt(i8042_mux_port + ((str >> 6) & 3), data, dfl); continue; } @@ -390,8 +390,8 @@ dfl & SERIO_PARITY ? ", bad parity" : "", dfl & SERIO_TIMEOUT ? ", timeout" : ""); - if (i8042_aux_values.exists && (buffer[i].str & I8042_STR_AUXDATA)) { - serio_interrupt(&i8042_aux_port, buffer[i].data, dfl); + if (i8042_aux_values.exists && (str & I8042_STR_AUXDATA)) { + serio_interrupt(&i8042_aux_port, data, dfl); continue; } @@ -602,8 +602,14 @@ if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param == 0x5b) return -1; - printk(KERN_INFO "i8042.c: Detected active multiplexing controller, rev%d.%d.\n", - ~param >> 4, ~param & 0xf); + printk(KERN_INFO "i8042.c: Detected active multiplexing controller, rev %d.%d.\n", + (~param >> 4) & 0xf, ~param & 0xf); + +/* + * In MUX mode the keyboard translation seems to be always off. + */ + + i8042_direct = 1; /* * Disable all muxed ports by disabling AUX. @@ -742,6 +748,12 @@ static int __init i8042_setup_noaux(char *str) { i8042_noaux = 1; + i8042_nomux = 1; + return 1; +} +static int __init i8042_setup_nomux(char *str) +{ + i8042_nomux = 1; return 1; } static int __init i8042_setup_unlock(char *str) @@ -762,6 +774,7 @@ __setup("i8042_reset", i8042_setup_reset); __setup("i8042_noaux", i8042_setup_noaux); +__setup("i8042_nomux", i8042_setup_nomux); __setup("i8042_unlock", i8042_setup_unlock); __setup("i8042_direct", i8042_setup_direct); __setup("i8042_dumbkbd", i8042_setup_dumbkbd); @@ -796,6 +809,7 @@ sprintf(i8042_mux_short[index], "AUX%d", index); port->name = i8042_mux_names[index]; port->phys = i8042_mux_phys[index]; + port->driver = values; values->name = i8042_mux_short[index]; values->mux = index; } @@ -809,8 +823,8 @@ if (i8042_platform_init()) return -EBUSY; - i8042_aux_values.irq = I8042_AUX_IRQ; - i8042_kbd_values.irq = I8042_KBD_IRQ; + i8042_aux_values.irq = I8042_AUX_IRQ; + i8042_kbd_values.irq = I8042_KBD_IRQ; if (i8042_controller_init()) return -ENODEV; @@ -821,7 +835,7 @@ for (i = 0; i < 4; i++) i8042_init_mux_values(i8042_mux_values + i, i8042_mux_port + i, i); - if (!i8042_noaux && !i8042_check_mux(&i8042_aux_values)) + if (!i8042_nomux && !i8042_check_mux(&i8042_aux_values)) for (i = 0; i < 4; i++) i8042_port_register(i8042_mux_values + i, i8042_mux_port + i); else =================================================================== This BitKeeper patch contains the following changesets: 1.740 ## Wrapped with gzip_uu ## begin 664 bkpatch1691 M'XL(`#JKICT``[56?V_:2!#]V_LIIE0704+,[GJQ#1%1:4FO*$V3HXU4J8V0 M8R_!!6QNO<Z/*W>?_6;7)$%)VMZ=KF!YL6?F[9N9-RN>PVDA5=>YS+]H&4_) M<WB3%[KK%&4AW?@/?![E.3ZWIOE"MM9>K?-9*\V6I29H/XET/(5+J8JNPUSO M[HV^6<JN,SKX]?1M?T1(KP>OIE%V(=]+#;T>T;FZC.9)\2+2TWF>N5I%6;&0 M.G+C?+&Z<UUQ2CE^VRSP:-M?,9^*8!6SA+%(,)E0+D)?D#6Q%VO:#^(998SZ M@GMBY87M=D@&P-Q`4*"\Q6B+,6"LRT67^3N4=RF%!W"PPV"7DI?P_Y)^16)X MG5[+`M(,TI`*[L;0CW5Z*>&HG.MT.9?7:78!1;E<YDJ[Y!"0O_#(R7TMR>Z_ M_!!"(TKV[W+45^D\O9AJMXRO3.D2E9IF5@UNH3C2O+4F5^454(_QML_\E8>5 MY:N`FI0B%DLJV(0F#ZOW0T3;G@X7C*]\O'M6+-\),O+Y:>P?2>G'[&F'!HRU MVROA!UQ8<?''VN+?TI:'XF+!3U37)%=/R<K(J:KW,>RJ*WNA/$Z^5_K_H+8A M#X&1H^/!Z=N#\4E_=%2W6.,L7Y373:BQM-;8(T//0Z]"1SJ-<1QT-0]C)0NI MC54\9;40>V3@^6@=<&X@!A[W@6,$#W!9A\332*UC,&*<10M9?!)GGSQ^MO<- MGV**$V=\F']FMP@0?%@MCI-.H'[OBUTK$9">N5C80A>PM07U0BO8@J%U>O]A M-.Z??AST/_0;#?AJX#J69$!Q<2J\AP%'IQ\/1B/CC@Y.<96:4[6>1#JJ((*V M9607XV$LT`-Z/9&&<.C9'4)1F6T;QU@[J52YU!OLS=$".U"W!/;WP6\@#:_1 M!`.(]\F\8?`Z%5Y'6,;W!8CN"O!/LW^"S=8]EJ'S8&^?MLW>/O4A),Y28=RL M?G@P>C<>OGM]#+6U.+LPD#A:6B8057)?;)ZB<9YIE<_G4C5!R4OX)7'Q^IS5 MFLBH_M<R4M'"Y"],_EC%)JS?V2?D\9FTM@ELPS`#[`TL\D2"GDJ8R9OS/%() MV(&=HYKR#`HI%P6.-)Q+B.97T4T!^63B8GR+`'&J?)-4(5]L&D.-!T*`?VNQ MTJX,CI*Z5)GY^>?F#(RQ?NGM*."8E,LJJFZ5O(T=:)"O3^`-`]]H8ES%U&L; M#K7F8S@SG$''S+!C6K.[7QT/B%5U'?L3,F[Z$S(C$>>1+%+U.WI76D`=C(>C MW_9NW6;GR5-NAR\'E=L@Y(;LL%JL[)YM9H1:6S_'4QG/C*`WQ51!-QKW?U2L 36U$N>N*<<43EY&]6@L^@`PD````` ` end ^ permalink raw reply [flat|nested] 5+ messages in thread
* [patch] Input - Fixes in uinput.c [4/5] 2002-10-11 10:45 ` [patch] Input - Fixes in Active PS/2 Multiplexing support [3/5] Vojtech Pavlik @ 2002-10-11 10:45 ` Vojtech Pavlik 2002-10-11 10:46 ` [patch] Input - Fix keyboard autorepeat ioctl [5/5] Vojtech Pavlik 0 siblings, 1 reply; 5+ messages in thread From: Vojtech Pavlik @ 2002-10-11 10:45 UTC (permalink / raw) To: Vojtech Pavlik; +Cc: torvalds, linux-kernel 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.741, 2002-10-11 11:50:35+02:00, zw@superlucidity.net Several fixes in the uinput.c userspace input driver. Size of fifo, handling of flag bits, etc. drivers/input/misc/uinput.c | 132 +++++++++++++++++++++++++++----------------- include/linux/uinput.h | 4 - 2 files changed, 83 insertions(+), 53 deletions(-) =================================================================== diff -Nru a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c --- a/drivers/input/misc/uinput.c Fri Oct 11 12:43:13 2002 +++ b/drivers/input/misc/uinput.c Fri Oct 11 12:43:13 2002 @@ -49,7 +49,7 @@ udev = (struct uinput_device *)dev->private; - udev->head = (udev->head + 1) & 0xF; + udev->head = (udev->head + 1) % UINPUT_BUFFER_SIZE; udev->buff[udev->head].type = type; udev->buff[udev->head].code = code; udev->buff[udev->head].value = value; @@ -87,14 +87,14 @@ input_register_device(udev->dev); - udev->state |= UIST_CREATED; + set_bit(UIST_CREATED, &(udev->state)); return 0; } static int uinput_destroy_device(struct uinput_device *udev) { - if (!(udev->state & UIST_CREATED)) { + if (!test_bit(UIST_CREATED, &(udev->state))) { printk(KERN_WARNING "%s: create the device first\n", UINPUT_NAME); return -EINVAL; } @@ -135,6 +135,39 @@ return -ENOMEM; } +static int uinput_validate_absbits(struct input_dev *dev) +{ + unsigned int cnt; + int retval = 0; + + for (cnt = 0; cnt < ABS_MAX; cnt++) { + if (!test_bit(cnt, dev->absbit)) + continue; + + if (/*!dev->absmin[cnt] || !dev->absmax[cnt] || */ + (dev->absmax[cnt] <= dev->absmin[cnt])) { + printk(KERN_DEBUG + "%s: invalid abs[%02x] min:%d max:%d\n", + UINPUT_NAME, cnt, + dev->absmin[cnt], dev->absmax[cnt]); + retval = -EINVAL; + break; + } + + if ((dev->absflat[cnt] < dev->absmin[cnt]) || + (dev->absflat[cnt] > dev->absmax[cnt])) { + printk(KERN_DEBUG + "%s: absflat[%02x] out of range: %d " + "(min:%d/max:%d)\n", + UINPUT_NAME, cnt, dev->absflat[cnt], + dev->absmin[cnt], dev->absmax[cnt]); + retval = -EINVAL; + break; + } + } + return retval; +} + static int uinput_alloc_device(struct file *file, const char *buffer, size_t count) { struct uinput_user_dev user_dev; @@ -145,14 +178,17 @@ retval = count; + udev = (struct uinput_device *)file->private_data; + dev = udev->dev; + if (copy_from_user(&user_dev, buffer, sizeof(struct uinput_user_dev))) { retval = -EFAULT; goto exit; } - udev = (struct uinput_device *)file->private_data; - dev = udev->dev; - + if (NULL != dev->name) + kfree(dev->name); + size = strnlen(user_dev.name, UINPUT_MAX_NAME_SIZE); dev->name = kmalloc(size + 1, GFP_KERNEL); if (!dev->name) { @@ -168,7 +204,7 @@ dev->id.version = user_dev.id.version; dev->ff_effects_max = user_dev.ff_effects_max; - size = sizeof(unsigned long) * NBITS(ABS_MAX + 1); + size = sizeof(int) * (ABS_MAX + 1); memcpy(dev->absmax, user_dev.absmax, size); memcpy(dev->absmin, user_dev.absmin, size); memcpy(dev->absfuzz, user_dev.absfuzz, size); @@ -177,33 +213,20 @@ /* check if absmin/absmax/absfuzz/absflat are filled as * told in Documentation/input/input-programming.txt */ if (test_bit(EV_ABS, dev->evbit)) { - unsigned int cnt; - for (cnt = 1; cnt < ABS_MAX; cnt++) - if (test_bit(cnt, dev->absbit) && - (!dev->absmin[cnt] || - !dev->absmax[cnt] || - !dev->absfuzz[cnt] || - !dev->absflat[cnt])) { - printk(KERN_DEBUG "%s: set abs fields " - "first\n", UINPUT_NAME); - retval = -EINVAL; - goto free_name; - } + retval = uinput_validate_absbits(dev); + if (retval < 0) + kfree(dev->name); } exit: return retval; -free_name: - kfree(dev->name); - goto exit; } static int uinput_write(struct file *file, const char *buffer, size_t count, loff_t *ppos) { struct uinput_device *udev = file->private_data; - - if (udev->state & UIST_CREATED) { + if (test_bit(UIST_CREATED, &(udev->state))) { struct input_event ev; if (copy_from_user(&ev, buffer, sizeof(struct input_event))) @@ -220,23 +243,28 @@ { struct uinput_device *udev = file->private_data; int retval = 0; + + if (!test_bit(UIST_CREATED, &(udev->state))) + return -ENODEV; - if (udev->head == udev->tail && (udev->state & UIST_CREATED) && (file->f_flags & O_NONBLOCK)) + if ((udev->head == udev->tail) && (file->f_flags & O_NONBLOCK)) return -EAGAIN; retval = wait_event_interruptible(udev->waitq, - udev->head != udev->tail && (udev->state & UIST_CREATED)); - + (udev->head != udev->tail) || + !test_bit(UIST_CREATED, &(udev->state))); + if (retval) return retval; - if (!(udev->state & UIST_CREATED)) + if (!test_bit(UIST_CREATED, &(udev->state))) return -ENODEV; - while (udev->head != udev->tail && retval + sizeof(struct uinput_device) <= count) { + while ((udev->head != udev->tail) && + (retval + sizeof(struct uinput_device) <= count)) { if (copy_to_user(buffer + retval, &(udev->buff[udev->tail]), sizeof(struct input_event))) return -EFAULT; - udev->tail = (udev->tail + 1) % (UINPUT_BUFFER_SIZE - 1); + udev->tail = (udev->tail + 1) % UINPUT_BUFFER_SIZE; retval += sizeof(struct input_event); } @@ -245,7 +273,7 @@ static unsigned int uinput_poll(struct file *file, poll_table *wait) { - struct uinput_device *udev = file->private_data; + struct uinput_device *udev = file->private_data; poll_wait(file, &udev->waitq, wait); @@ -257,7 +285,7 @@ static int uinput_burn_device(struct uinput_device *udev) { - if (udev->state & UIST_CREATED) + if (test_bit(UIST_CREATED, &(udev->state))) uinput_destroy_device(udev); kfree(udev->dev); @@ -282,50 +310,52 @@ udev = (struct uinput_device *)file->private_data; - if (cmd >= UI_SET_EVBIT && (udev->state & UIST_CREATED)) + /* device attributes can not be changed after the device is created */ + if (cmd >= UI_SET_EVBIT && test_bit(UIST_CREATED, &(udev->state))) return -EINVAL; switch (cmd) { case UI_DEV_CREATE: retval = uinput_create_device(udev); - break; + case UI_DEV_DESTROY: retval = uinput_destroy_device(udev); - break; + + case UI_SET_EVBIT: set_bit(arg, udev->dev->evbit); - - break; + break; + case UI_SET_KEYBIT: set_bit(arg, udev->dev->keybit); - - break; + break; + case UI_SET_RELBIT: set_bit(arg, udev->dev->relbit); - - break; + break; + case UI_SET_ABSBIT: set_bit(arg, udev->dev->absbit); - - break; + break; + case UI_SET_MSCBIT: set_bit(arg, udev->dev->mscbit); - - break; + break; + case UI_SET_LEDBIT: set_bit(arg, udev->dev->ledbit); - - break; + break; + case UI_SET_SNDBIT: set_bit(arg, udev->dev->sndbit); - - break; + break; + case UI_SET_FFBIT: set_bit(arg, udev->dev->ffbit); - - break; + break; + default: retval = -EFAULT; } diff -Nru a/include/linux/uinput.h b/include/linux/uinput.h --- a/include/linux/uinput.h Fri Oct 11 12:43:13 2002 +++ b/include/linux/uinput.h Fri Oct 11 12:43:13 2002 @@ -29,9 +29,9 @@ #define UINPUT_MINOR 223 #define UINPUT_NAME "uinput" #define UINPUT_BUFFER_SIZE 16 -#define U_MAX_NAME_SIZE 50 -#define UIST_CREATED 1 +/* state flags => bit index for {set|clear|test}_bit ops */ +#define UIST_CREATED 0 struct uinput_device { struct input_dev *dev; =================================================================== This BitKeeper patch contains the following changesets: 1.741 ## Wrapped with gzip_uu ## begin 664 bkpatch1720 M'XL(`$&KICT``[U8;5/;.!#^;/^*I1V8!/(BR2^)0\,42-K+E`:&D,[-M9V, ML17BDMB,K0!MT_]^*\DA0'(YZ+47,G8L[:Z>?;2[6O,2^AE/&\9U\D7P8&2^ MA#^23#2,;)KQ2O`-GT^3!)^KHV3"J[E4]?RR&L574V'B_(DO@A%<\S1K&+1B MW8V(KU>\89RVW_:/]D]-L]F$PY$?7_`>%]!LFB))K_UQF+WVQ6B<Q!61^G$V MX<*O!,ED=B<Z8X0P_'-HS2*..Z,NL6NS@(:4^C;E(6%VW;7-'-CK'/8C?4HH M)1ZSJ3NSZHYMF2V@E9I-@;`J)55*@=*&0QJ6LT-8@Q#X=H.6KG@ZG@91&(FO ME1A![S`H$_,`?BWR0S.`'D?Z_#$,HUN>012#&'&8*H8K`:!+:7;E!QS4"(1I MA.(5Z$7?."1#U!HF);2""X?C*+Y08V/_`LXCD96`BZ!BO@.K7O>8>;+8!+/\ MS(]I$I^8>S#G6MQ$X^AB)"K3X$9R'L7!>!KR*F*8WE9S^"--0XU:E-H4"2`U MYCHS)V2>.[1#&G`>4K::\746]98ZQ*(SQ_%H?0TNS5>F(W9N)7B("P,#P5FS MT'<<2GRO%OBNRQR^&M=#BY,H"QZ:O0?.MNNUFHK^-4HR'WX'^J6T^'?@Q$/P MS$%6F>/EB;*4)G1MFM0IE!WZ^Q-%1K6F]QC*Z8WZ8I2>K&/Z)X*^Y3"@9D== M#8S&Z_+>B/LA-*%P[VD':!$VH=_IGO3/!@?]-V_:IX->YZ_VKMGRB#2@KD;& MQ0#SLM#O],X&AZ?M_;-VJP1;N:E,^((7BU*GIG3DU8B&4-@0/'N"9A&^FQUJ MU<"R3#D4!5@T1%Y+!K@;48AR`_\\D\6AD(ET&@A=5P9H![;Q4C2_HZ-Q%EW$ M/%3J02QV$0;^2KE`(^@[P0'3&"8I%'!6#4@Q>`7[![W!^_T_U>/.C@1D//(` M)TJ@4&L<B!IEC"")!28Z1\M&KE/=WIC+3:+X(RI^AMD,%H/^[=W@=A65`#^% MI=E737ALIJB!&5<ING59>-<^[0Y:[8/^6P7%>+&9-=!U11B@VL=-PFX_`VHW M-D-`PWC[%+\H*>%\T[O[[]LE4,ZIX<=++GR>`RM*5XT[3LOM3O?#_I$:/$^Y M?RE__3`_Y63<^87%7>2.+?N%5#SF82&_MPSA"3S,36@.$CR"\(1)9?8V`-EX MH24+FIRJ)J>XAITE7*5?RI?\HLPTC?-PW34EB1TLD6#I%);)F\?^]"[X(SQA MMXO#:,S+>TC'M4P4S!8?K6H5G6EXV45S+>I8:*Y#'4=:E1O4[1\=P48>:[$_ MX2JN+X<IYX7%F`KO%JU1F>#Z9F3R*&^"O"7#`NY$$;:AD&>2JBU8$F@=*PA# M'8_*%1<\_%-VRUS>S8,G%WX%I"CI6@;5HIZ+9EM8AP$78<2=EYYG5![&F(3V MO)*E79';56YWCUOM#PB&,5O2HV\Z^N^7WOE>"#\:%V%K"PIZVX8#V?ADL`7' M@^YQ]^#H^/`=+H#FZLHIYBGFC/O&-AX:PTHB)9X*7I;!%K,LA5;=GN<[ZKI: MUT6$QLT(_7CH[,:2LZ9.[WQ+=^9ALRJ@B[+V!<DT%FJ#<#5/KR9OAK$PO#C. MU-.ZXPR/8V5#W8S5:90GV:ID:C%7G8?Z]IP(0]6ZHU3K,D:-ZC;DZ_E"I-'Y M%.U`X,<0)P+..02JP\#Z/10\53UU+AZA&-8+@7/RU)`0@DD(>TUT>-!KGPW: M'PXZ9Y+JIR/S5#XS3[4),L.9I[%Z<F,_R8K!/$]&H86=$WM0LU#:(I:>LU?- MU?1<?<4<=F5RCK)5<XZ><U?-:2QL%1:FL;!56)C&PI:QR"9W=<>^KK_]+V\- M/V<4NUO;<@F3+:Y-5(MK/[/%Q3=!]O\TN/KEYE&#N]J]G^EM+1FN+4L56TMN M-^:4"FK0A;2Y)]\B<<&0WX+L]KYC`SL+QMQ/9S(W?LCD@.0JDXGT,N3#*.9P ?/U<,@RS^21",>'"932=-.R2AC[%G_@VLXD3-?Q`````` ` end ^ permalink raw reply [flat|nested] 5+ messages in thread
* [patch] Input - Fix keyboard autorepeat ioctl [5/5] 2002-10-11 10:45 ` [patch] Input - Fixes in uinput.c [4/5] Vojtech Pavlik @ 2002-10-11 10:46 ` Vojtech Pavlik 0 siblings, 0 replies; 5+ messages in thread From: Vojtech Pavlik @ 2002-10-11 10:46 UTC (permalink / raw) To: Vojtech Pavlik; +Cc: torvalds, linux-kernel 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 ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2002-10-11 10:41 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2002-10-11 10:44 [patch] Input - HID - fix find_next_zero usage [1/5] Vojtech Pavlik 2002-10-11 10:44 ` [patch] Input - Fix atkbd.c oops on Alpha [2/5] Vojtech Pavlik 2002-10-11 10:45 ` [patch] Input - Fixes in Active PS/2 Multiplexing support [3/5] Vojtech Pavlik 2002-10-11 10:45 ` [patch] Input - Fixes in uinput.c [4/5] Vojtech Pavlik 2002-10-11 10:46 ` [patch] Input - Fix keyboard autorepeat ioctl [5/5] Vojtech Pavlik
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®