Message ID | 20200923201456.25912-1-jason.gerecke@wacom.com |
---|---|
State | New |
Headers | show |
Series | HID: wacom: Avoid entering wacom_wac_pen_report for pad / battery | expand |
On Wed, 23 Sep 2020, Gerecke, Jason wrote: > From: Jason Gerecke <jason.gerecke@wacom.com> > > 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> Applied. -- Jiri Kosina SUSE Labs
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c index 1c96809b51c9..b74acbd5997b 100644 --- a/drivers/hid/wacom_wac.c +++ b/drivers/hid/wacom_wac.c @@ -2773,7 +2773,9 @@ static int wacom_wac_collection(struct hid_device *hdev, struct hid_report *repo 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);