| From d9216d753b2b1406b801243b12aaf00a5ce5b861 Mon Sep 17 00:00:00 2001 |
| From: Jason Gerecke <jason.gerecke@wacom.com> |
| Date: Wed, 23 Sep 2020 13:14:56 -0700 |
| Subject: HID: wacom: Avoid entering wacom_wac_pen_report for pad / battery |
| |
| From: Jason Gerecke <jason.gerecke@wacom.com> |
| |
| commit d9216d753b2b1406b801243b12aaf00a5ce5b861 upstream. |
| |
| It has recently been reported that the "heartbeat" report from devices |
| like the 2nd-gen Intuos Pro (PTH-460, PTH-660, PTH-860) or the 2nd-gen |
| Bluetooth-enabled Intuos tablets (CTL-4100WL, CTL-6100WL) can cause the |
| driver to send a spurious BTN_TOUCH=0 once per second in the middle of |
| drawing. This can result in broken lines while drawing on Chrome OS. |
| |
| The source of the issue has been traced back to a change which modified |
| the driver to only call `wacom_wac_pad_report()` once per report instead |
| of once per collection. As part of this change, pad-handling code was |
| removed from `wacom_wac_collection()` under the assumption that the |
| `WACOM_PEN_FIELD` and `WACOM_TOUCH_FIELD` checks would not be satisfied |
| when a pad or battery collection was being processed. |
| |
| To be clear, the macros `WACOM_PAD_FIELD` and `WACOM_PEN_FIELD` do not |
| currently check exclusive conditions. In fact, most "pad" fields will |
| also appear to be "pen" fields simply due to their presence inside of |
| a Digitizer application collection. Because of this, the removal of |
| the check from `wacom_wac_collection()` just causes pad / battery |
| collections to instead trigger a call to `wacom_wac_pen_report()` |
| instead. The pen report function in turn resets the tip switch state |
| just prior to exiting, resulting in the observed BTN_TOUCH=0 symptom. |
| |
| To correct this, we restore a version of the `WACOM_PAD_FIELD` check |
| in `wacom_wac_collection()` and return early. This effectively prevents |
| pad / battery collections from being reported until the very end of the |
| report as originally intended. |
| |
| Fixes: d4b8efeb46d9 ("HID: wacom: generic: Correct pad syncing") |
| Cc: stable@vger.kernel.org # v4.17+ |
| Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com> |
| Reviewed-by: Ping Cheng <ping.cheng@wacom.com> |
| Tested-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 | 4 +++- |
| 1 file changed, 3 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/hid/wacom_wac.c |
| +++ b/drivers/hid/wacom_wac.c |
| @@ -2773,7 +2773,9 @@ static int wacom_wac_collection(struct h |
| if (report->type != HID_INPUT_REPORT) |
| return -1; |
| |
| - if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input) |
| + if (WACOM_PAD_FIELD(field)) |
| + return 0; |
| + else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input) |
| wacom_wac_pen_report(hdev, report); |
| else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input) |
| wacom_wac_finger_report(hdev, report); |