lkml.org 
[lkml]   [2017]   [Feb]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 45/66] HID: wacom: Fix poor prox handling in wacom_pl_irq
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Jason Gerecke <killertofu@gmail.com>

    commit 282e4637bc1c0b338708bcebd09d31c69abec070 upstream.

    Commit 025bcc1 performed cleanup work on the 'wacom_pl_irq' function, making
    it follow the standards used in the rest of the codebase. The change
    unintiontionally allowed the function to send input events from reports
    that are not marked as being in prox. This can cause problems as the
    report values for X, Y, etc. are not guaranteed to be correct. In
    particular, occasionally the tablet will send a report with these values
    set to zero. If such a report is received it can caus an unexpected jump
    in the XY position.

    This patch surrounds more of the processing code with a proximity check,
    preventing these zeroed reports from overwriting the current state. To
    be safe, only the tool type and ABS_MISC events should be reported when
    the pen is marked as being out of prox.

    Fixes: 025bcc1540 ("HID: wacom: Simplify 'wacom_pl_irq'")
    Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
    Reviewed-by: Ping Cheng <pingc@wacom.com>
    Signed-off-by: Jiri Kosina <jkosina@suse.cz>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/hid/wacom_wac.c | 24 +++++++++++++-----------
    1 file changed, 13 insertions(+), 11 deletions(-)

    --- a/drivers/hid/wacom_wac.c
    +++ b/drivers/hid/wacom_wac.c
    @@ -164,19 +164,21 @@ static int wacom_pl_irq(struct wacom_wac
    wacom->id[0] = STYLUS_DEVICE_ID;
    }

    - pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1));
    - if (features->pressure_max > 255)
    - pressure = (pressure << 1) | ((data[4] >> 6) & 1);
    - pressure += (features->pressure_max + 1) / 2;
    + if (prox) {
    + pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1));
    + if (features->pressure_max > 255)
    + pressure = (pressure << 1) | ((data[4] >> 6) & 1);
    + pressure += (features->pressure_max + 1) / 2;

    - input_report_abs(input, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14));
    - input_report_abs(input, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14));
    - input_report_abs(input, ABS_PRESSURE, pressure);
    + input_report_abs(input, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14));
    + input_report_abs(input, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14));
    + input_report_abs(input, ABS_PRESSURE, pressure);

    - input_report_key(input, BTN_TOUCH, data[4] & 0x08);
    - input_report_key(input, BTN_STYLUS, data[4] & 0x10);
    - /* Only allow the stylus2 button to be reported for the pen tool. */
    - input_report_key(input, BTN_STYLUS2, (wacom->tool[0] == BTN_TOOL_PEN) && (data[4] & 0x20));
    + input_report_key(input, BTN_TOUCH, data[4] & 0x08);
    + input_report_key(input, BTN_STYLUS, data[4] & 0x10);
    + /* Only allow the stylus2 button to be reported for the pen tool. */
    + input_report_key(input, BTN_STYLUS2, (wacom->tool[0] == BTN_TOOL_PEN) && (data[4] & 0x20));
    + }

    if (!prox)
    wacom->id[0] = 0;

    \
     
     \ /
      Last update: 2017-02-07 14:10    [W:2.059 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site