lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 005/846] HID: wacom: Reset expected and received contact counts at the same time
    Date
    From: Jason Gerecke <killertofu@gmail.com>

    commit 546e41ac994cc185ef3de610ca849a294b5df3ba upstream.

    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 f8b6a74719b5 ("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 7fb0413baa7f (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: https://github.com/linuxwacom/input-wacom/issues/288
    Fixes: f8b6a74719b5 ("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>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/hid/wacom_wac.c | 6 +++++-
    1 file changed, 5 insertions(+), 1 deletion(-)

    --- a/drivers/hid/wacom_wac.c
    +++ b/drivers/hid/wacom_wac.c
    @@ -2692,11 +2692,14 @@ static void wacom_wac_finger_pre_report(
    hid_data->cc_index >= 0) {
    struct hid_field *field = report->field[hid_data->cc_index];
    int value = field->value[hid_data->cc_value_index];
    - if (value)
    + if (value) {
    hid_data->num_expected = value;
    + hid_data->num_received = 0;
    + }
    }
    else {
    hid_data->num_expected = wacom_wac->features.touch_max;
    + hid_data->num_received = 0;
    }
    }

    @@ -2724,6 +2727,7 @@ static void wacom_wac_finger_report(stru

    input_sync(input);
    wacom_wac->hid_data.num_received = 0;
    + wacom_wac->hid_data.num_expected = 0;

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

    \
     
     \ /
      Last update: 2022-01-24 21:40    [W:4.030 / U:26.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site