Skip to content

Commit 546e41a

Browse files
jigpuJiri Kosina
authored andcommitted
HID: wacom: Reset expected and received contact counts at the same time
These two values go hand-in-hand and must be valid for the driver to behave correctly. We are currently lazy about updating the values and rely on the "expected" code flow to take care of making sure they're valid at the point they're needed. The "expected" flow changed somewhat with commit f8b6a74 ("HID: wacom: generic: Support multiple tools per report"), however. This led to problems with the DTH-2452 due (in part) to *all* contacts being fully processed -- even those past the expected contact count. Specifically, the received count gets reset to 0 once all expected fingers are processed, but not the expected count. The rest of the contacts in the report are then *also* processed since now the driver thinks we've only processed 0 of N expected contacts. Later commits such as 7fb0413 (HID: wacom: Use "Confidence" flag to prevent reporting invalid contacts) worked around the DTH-2452 issue by skipping the invalid contacts at the end of the report, but this is not a complete fix. The confidence flag cannot be relied on when a contact is removed (see the following patch), and dealing with that condition re-introduces the DTH-2452 issue unless we also address this contact count laziness. By resetting expected and received counts at the same time we ensure the driver understands that there are 0 more contacts expected in the report. Similarly, we also make sure to reset the received count if for some reason we're out of sync in the pre-report phase. Link: linuxwacom/input-wacom#288 Fixes: f8b6a74 ("HID: wacom: generic: Support multiple tools per report") CC: stable@vger.kernel.org Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com> Reviewed-by: Ping Cheng <ping.cheng@wacom.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
1 parent c8e7ff4 commit 546e41a

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

drivers/hid/wacom_wac.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2692,11 +2692,14 @@ static void wacom_wac_finger_pre_report(struct hid_device *hdev,
26922692
hid_data->cc_index >= 0) {
26932693
struct hid_field *field = report->field[hid_data->cc_index];
26942694
int value = field->value[hid_data->cc_value_index];
2695-
if (value)
2695+
if (value) {
26962696
hid_data->num_expected = value;
2697+
hid_data->num_received = 0;
2698+
}
26972699
}
26982700
else {
26992701
hid_data->num_expected = wacom_wac->features.touch_max;
2702+
hid_data->num_received = 0;
27002703
}
27012704
}
27022705

@@ -2724,6 +2727,7 @@ static void wacom_wac_finger_report(struct hid_device *hdev,
27242727

27252728
input_sync(input);
27262729
wacom_wac->hid_data.num_received = 0;
2730+
wacom_wac->hid_data.num_expected = 0;
27272731

27282732
/* keep touch state for pen event */
27292733
wacom_wac->shared->touch_down = wacom_wac_finger_count_touches(wacom_wac);

0 commit comments

Comments
 (0)