]>
Commit | Line | Data |
---|---|---|
544a52ee GKH |
1 | From 05f0edadcc5fccdfc0676825b3e70e75dc0a8a84 Mon Sep 17 00:00:00 2001 |
2 | From: Sean Young <sean@mess.org> | |
3 | Date: Fri, 22 Feb 2019 04:08:05 -0500 | |
4 | Subject: media: Revert "media: rc: some events are dropped by userspace" | |
5 | ||
6 | From: Sean Young <sean@mess.org> | |
7 | ||
8 | commit 05f0edadcc5fccdfc0676825b3e70e75dc0a8a84 upstream. | |
9 | ||
10 | When an rc device is created, we do not know what key codes it will | |
11 | support, since a new keymap might be loaded at some later point. So, | |
12 | we set all keybit in the input device. | |
13 | ||
14 | The uevent for the input device includes all the key codes, of which | |
15 | there are now 768. This overflows the size of the uevent | |
16 | (UEVENT_BUFFER_SIZE) and no event is generated. | |
17 | ||
18 | Revert for now until we figure out a different solution. | |
19 | ||
20 | This reverts commit fec225a04330d0f222d24feb5bea045526031675. | |
21 | ||
22 | Cc: <stable@vger.kernel.org> # 4.20+ | |
23 | Reported-by: Christian Holpert <christian@holpert.de> | |
24 | Signed-off-by: Sean Young <sean@mess.org> | |
25 | Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> | |
26 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
27 | ||
28 | --- | |
29 | drivers/media/rc/rc-main.c | 13 ++++++++++++- | |
30 | 1 file changed, 12 insertions(+), 1 deletion(-) | |
31 | ||
32 | --- a/drivers/media/rc/rc-main.c | |
33 | +++ b/drivers/media/rc/rc-main.c | |
34 | @@ -274,6 +274,7 @@ static unsigned int ir_update_mapping(st | |
35 | unsigned int new_keycode) | |
36 | { | |
37 | int old_keycode = rc_map->scan[index].keycode; | |
38 | + int i; | |
39 | ||
40 | /* Did the user wish to remove the mapping? */ | |
41 | if (new_keycode == KEY_RESERVED || new_keycode == KEY_UNKNOWN) { | |
42 | @@ -288,9 +289,20 @@ static unsigned int ir_update_mapping(st | |
43 | old_keycode == KEY_RESERVED ? "New" : "Replacing", | |
44 | rc_map->scan[index].scancode, new_keycode); | |
45 | rc_map->scan[index].keycode = new_keycode; | |
46 | + __set_bit(new_keycode, dev->input_dev->keybit); | |
47 | } | |
48 | ||
49 | if (old_keycode != KEY_RESERVED) { | |
50 | + /* A previous mapping was updated... */ | |
51 | + __clear_bit(old_keycode, dev->input_dev->keybit); | |
52 | + /* ... but another scancode might use the same keycode */ | |
53 | + for (i = 0; i < rc_map->len; i++) { | |
54 | + if (rc_map->scan[i].keycode == old_keycode) { | |
55 | + __set_bit(old_keycode, dev->input_dev->keybit); | |
56 | + break; | |
57 | + } | |
58 | + } | |
59 | + | |
60 | /* Possibly shrink the keytable, failure is not a problem */ | |
61 | ir_resize_table(dev, rc_map, GFP_ATOMIC); | |
62 | } | |
63 | @@ -1750,7 +1762,6 @@ static int rc_prepare_rx_device(struct r | |
64 | set_bit(EV_REP, dev->input_dev->evbit); | |
65 | set_bit(EV_MSC, dev->input_dev->evbit); | |
66 | set_bit(MSC_SCAN, dev->input_dev->mscbit); | |
67 | - bitmap_fill(dev->input_dev->keybit, KEY_CNT); | |
68 | ||
69 | /* Pointer/mouse events */ | |
70 | set_bit(EV_REL, dev->input_dev->evbit); |