Patchwork [v2,1/2] HID: wacom: Properly report negative values from Intuos Pro 2 Bluetooth

login
register
mail settings
Submitter Jason Gerecke
Date Aug. 30, 2017, 10:13 p.m.
Message ID <20170830221326.15877-1-killertofu@gmail.com>
Download mbox | patch
Permalink /patch/9930911/
State New
Headers show

Comments

Jason Gerecke - Aug. 30, 2017, 10:13 p.m.
The wacom driver's IRQ handler for Bluetooth reports from the 2nd-gen
Intuos Pro does not correctly process negative numbers. Values for
tilt and rotation (which can go negative) are instead interpreted as
unsigned and so jump to very large values when the data should be
negative. This commit properly casts the data to ensure we report
negative numbers when necessary.

Fixes: 4922cd2 ("HID: wacom: Support 2nd-gen Intuos Pro's Bluetooth classic interface")
Cc: stable@vger.kernel.org # v4.11
Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
---
Changes from v1:
  * Patch introduced.

 drivers/hid/wacom_wac.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
Jiri Kosina - Sept. 6, 2017, 9:02 a.m.
On Wed, 30 Aug 2017, Jason Gerecke wrote:

> The wacom driver's IRQ handler for Bluetooth reports from the 2nd-gen
> Intuos Pro does not correctly process negative numbers. Values for
> tilt and rotation (which can go negative) are instead interpreted as
> unsigned and so jump to very large values when the data should be
> negative. This commit properly casts the data to ensure we report
> negative numbers when necessary.
> 
> Fixes: 4922cd2 ("HID: wacom: Support 2nd-gen Intuos Pro's Bluetooth classic interface")
> Cc: stable@vger.kernel.org # v4.11
> Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>

Both patches applied to for-4.14/upstream-fixes.

Patch

diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index bb17d7bbefd3..d7ca1eb9d559 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -1229,9 +1229,9 @@  static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
 		if (range) {
 			input_report_abs(pen_input, ABS_X, get_unaligned_le16(&frame[1]));
 			input_report_abs(pen_input, ABS_Y, get_unaligned_le16(&frame[3]));
-			input_report_abs(pen_input, ABS_TILT_X, frame[7]);
-			input_report_abs(pen_input, ABS_TILT_Y, frame[8]);
-			input_report_abs(pen_input, ABS_Z, get_unaligned_le16(&frame[9]));
+			input_report_abs(pen_input, ABS_TILT_X, (char)frame[7]);
+			input_report_abs(pen_input, ABS_TILT_Y, (char)frame[8]);
+			input_report_abs(pen_input, ABS_Z, (int16_t)get_unaligned_le16(&frame[9]));
 			input_report_abs(pen_input, ABS_WHEEL, get_unaligned_le16(&frame[11]));
 		}
 		input_report_abs(pen_input, ABS_PRESSURE, get_unaligned_le16(&frame[5]));