HID: wacom: Fix poor prox handling in 'wacom_pl_irq'
Subsystems (2)
PATCH 1/1 HID: wacom: Fix poor prox handling in 'wacom_pl_irq'
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.
--- drivers/hid/wacom_wac.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-)
drivers/hid/wacom_wac.c +15 -13
@@ -166,19 +166,21 @@ static int wacom_pl_irq(struct wacom_wac *wacom) 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 ; - -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 )); +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_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 ;
Signature · 1 line
2.11.0
Quoted 9 lines · Jason Gerecke
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.
Quoted 7 lines
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_MISCevents 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 <[email protected]>
Cheers,
Ping
P.S., this patch has been tested by users at linuxwacom.sf.net
Quoted 46 lines
--- drivers/hid/wacom_wac.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-)drivers/hid/wacom_wac.c +15
-14@@ -166,19 +166,21 @@ static int wacom_pl_irq(struct wacom_wac *wacom) 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 ; - -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 )); +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_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 ; --2.11.0
Quoted 9 lines · Jason Gerecke
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.
Quoted 7 lines
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_MISCevents 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 <[email protected]>
Applied, thanks.
Signature · 2 lines
Jiri Kosina SUSE Labs