Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp3563294pxb; Mon, 24 Jan 2022 12:17:53 -0800 (PST) X-Google-Smtp-Source: ABdhPJxORxmdJosDURfMxT9ajkicjf8qjAxInLBXCvVSLqKNTtA7LHsrDuOHM1hWcbW2bEM29ew7 X-Received: by 2002:a17:902:a3c7:b0:14a:d8bf:4e09 with SMTP id q7-20020a170902a3c700b0014ad8bf4e09mr16200150plb.62.1643055472918; Mon, 24 Jan 2022 12:17:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643055472; cv=none; d=google.com; s=arc-20160816; b=eElkFyeC/NA9gGF7+E4o2CY4I50C/zQte+onYriNR48Nobm7khZAUEplSmI4YmYctc PUGU6pu+bkPJXR6AhfewcTuC6p3gtNLTG1pZuwRpOGuqVioOWdz12qppqMSHOMidhxP8 P/PRb0yWnvswNCHLOAqLSv550M4RTgxOevhV4fxvSJ888rGUPoZH9LFsUgymRmBZebJs av+uFyzLE9ty5m9NQBbe0bO968FQJW/vWDiDXL2s7+VAXDD73zugiqME14Pi6Hq0q7v4 H2wFt+Qs+LaANiA3HeQMAowU9jh/aLIF1vLq7K418hPVmfWYCwFF1vG+3rGcYYZprzlf 2BRQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=SQ9+vvd+14Fi8R8QzAKrK7CqjBEXy9kOvyW1cNvV8Xo=; b=1GiB6pFfxMmTHinHe2IKgOPgQxkuekPClYAn9pkWx5DXrUPAxdFuqxyQBFtrE1o1TJ N9UfgmUQ81H6kdcqPXumAzlqA74zX5g6KU6fKD1eReS4VAI9AxR6Jb31djvmSEVID40c SlIDhNcUysTqd3VAeg8uRtwNhavTNpLmkwL/RK5h07n/g268z/b5dZYa8zrGk+q5MO3Q DRVD8vQA4mwz37Jm8znBSZfZQqyEwCzqg9coE4GJ5s7Aibxc48rWhUEKZ9GsJHQHEzZd BDuaKmY2Cxzj82bRWWRyMnjGEvjO5W5lp1+bnWg4D4WcquoL0mIhlaDQGR9sn53s7Zmp UWtQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=A7NCoslj; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id pg13si355132pjb.9.2022.01.24.12.17.39; Mon, 24 Jan 2022 12:17:52 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=A7NCoslj; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348890AbiAXTTw (ORCPT + 99 others); Mon, 24 Jan 2022 14:19:52 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48002 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1343901AbiAXTLO (ORCPT ); Mon, 24 Jan 2022 14:11:14 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F0A68C061368; Mon, 24 Jan 2022 11:03:03 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 967BAB81229; Mon, 24 Jan 2022 19:03:03 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A776DC340E5; Mon, 24 Jan 2022 19:03:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1643050982; bh=FcXJOa7bHUqybc6OliOtg4d1gBGX7CtOJSWvToOBRD0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=A7NCosljaeGHOF2lvubczr8C3tRGddlfQvNQAU9Bct9J/4+/1s/Po6L8JVyMKg7YI Cm2MWhSvxwSgQX4BsKCriApin3jG9GAF9bQiErwGYWHCudU7qZE+QFfnrY+uxkcA+7 FwCM97fE9VIjNVhVam7pxwTF5Z9NulakTbbjTx88= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jason Gerecke , Ping Cheng , Jiri Kosina Subject: [PATCH 4.14 017/186] HID: wacom: Ignore the confidence flag when a touch is removed Date: Mon, 24 Jan 2022 19:41:32 +0100 Message-Id: <20220124183937.670548203@linuxfoundation.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220124183937.101330125@linuxfoundation.org> References: <20220124183937.101330125@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Jason Gerecke commit df03e9bd6d4806619b4cdc91a3d7695818a8e2b7 upstream. AES hardware may internally re-classify a contact that it thought was intentional as a palm. Intentional contacts are reported as "down" with the confidence bit set. When this re-classification occurs, however, the state transitions to "up" with the confidence bit cleared. This kind of transition appears to be legal according to Microsoft docs, but we do not handle it correctly. Because the confidence bit is clear, we don't call `wacom_wac_finger_slot` and update userspace. This causes hung touches that confuse userspace and interfere with pen arbitration. This commit adds a special case to ignore the confidence flag if a contact is reported as removed. This ensures we do not leave a hung touch if one of these re-classification events occured. Ideally we'd have some way to also let userspace know that the touch has been re-classified as a palm and needs to be canceled, but that's not possible right now :) Link: https://github.com/linuxwacom/input-wacom/issues/288 Fixes: 7fb0413baa7f (HID: wacom: Use "Confidence" flag to prevent reporting invalid contacts) CC: stable@vger.kernel.org Signed-off-by: Jason Gerecke Reviewed-by: Ping Cheng Signed-off-by: Jiri Kosina Signed-off-by: Greg Kroah-Hartman --- drivers/hid/wacom_wac.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) --- a/drivers/hid/wacom_wac.c +++ b/drivers/hid/wacom_wac.c @@ -2424,6 +2424,24 @@ static void wacom_wac_finger_slot(struct } } +static bool wacom_wac_slot_is_active(struct input_dev *dev, int key) +{ + struct input_mt *mt = dev->mt; + struct input_mt_slot *s; + + if (!mt) + return false; + + for (s = mt->slots; s != mt->slots + mt->num_slots; s++) { + if (s->key == key && + input_mt_get_value(s, ABS_MT_TRACKING_ID) >= 0) { + return true; + } + } + + return false; +} + static void wacom_wac_finger_event(struct hid_device *hdev, struct hid_field *field, struct hid_usage *usage, __s32 value) { @@ -2466,9 +2484,14 @@ static void wacom_wac_finger_event(struc if (usage->usage_index + 1 == field->report_count) { - if (equivalent_usage == wacom_wac->hid_data.last_slot_field && - wacom_wac->hid_data.confidence) - wacom_wac_finger_slot(wacom_wac, wacom_wac->touch_input); + if (equivalent_usage == wacom_wac->hid_data.last_slot_field) { + bool touch_removed = wacom_wac_slot_is_active(wacom_wac->touch_input, + wacom_wac->hid_data.id) && !wacom_wac->hid_data.tipswitch; + + if (wacom_wac->hid_data.confidence || touch_removed) { + wacom_wac_finger_slot(wacom_wac, wacom_wac->touch_input); + } + } } }