Received: by 10.223.176.46 with SMTP id f43csp1449680wra; Fri, 19 Jan 2018 11:43:52 -0800 (PST) X-Google-Smtp-Source: ACJfBouv6Q2ssQGMJSapwjggVyBRttyHvS7wqadlFCcyYYcWfTLh33z63j+i5T0FwEVGJ2RADxDt X-Received: by 10.98.46.2 with SMTP id u2mr23846308pfu.30.1516391032137; Fri, 19 Jan 2018 11:43:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516391032; cv=none; d=google.com; s=arc-20160816; b=TY/+uz+xBSPAJv/7NylIOuSAfDxoR1Gk7flsmct/1Vvxg3lC5+4a8MREciRIB8TWVd ci48lOf33ykgP9gDGou8xytyBXYALpfFe78PZCr0n1mmfny5X7qpdwPoj7okNTTzToCF NfZ4azmTK5BVc4abeoGj06SyZyni/75Y37sn+iHv6+sitcwNt3kZQ96Mb+JWKfe1uFZj gEDQMVL3VYtYRFSXaiZz+B915OE2YvIWb2Ia74zpFxMFq7EdHPM3636QM/oZWX9Pi0I/ SHuKDzn5m6yXmQ6RWf3GoA07e2nZ6ueQKUroiJtsfLR3sFM53dFNa6RzjeP/8CV+jgyc y/Zg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=HnR8wwizJifxhp47CgHE6ZYLB1qcybaH7Ck4ivgv2O8=; b=f3q16kME56URxc4OugpurNma4T8LbsqZkYoJyqkKmCdJo+2bXbHiyiqm5n4VyVvm0t W0a68e1RFSzchZEzf1sx4u0n45ErnLqNP0yJIvdjPlK33GEajcNifJ7ZWD1CUxfFo79r MHwDGhAKDMSWDsjnHJ6R76mnGENgdYYS0TCxMhudnXbarw4p1evmzrto6KO2Xs1v0Dra XjFjLXmvOfDfGmKys7W32QsHmCyWURcF013FW34Uh3oGRuDqoNNk5yWdqyt8P0px0MYM hAKgtOJFnQJwZJ4sG9VdEv4bZRzPrOHmIBI9KCzR4fehINJO0fVNftOfHGy2JZzJoHtv n3zw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=C8kMKb66; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l14si8665389pgc.42.2018.01.19.11.43.38; Fri, 19 Jan 2018 11:43:52 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=C8kMKb66; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756594AbeASTmt (ORCPT + 99 others); Fri, 19 Jan 2018 14:42:49 -0500 Received: from mail-pg0-f66.google.com ([74.125.83.66]:36195 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756251AbeASTlW (ORCPT ); Fri, 19 Jan 2018 14:41:22 -0500 Received: by mail-pg0-f66.google.com with SMTP id k68so2176379pga.3; Fri, 19 Jan 2018 11:41:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HnR8wwizJifxhp47CgHE6ZYLB1qcybaH7Ck4ivgv2O8=; b=C8kMKb66Oz8gQc3sY97uVJqWiy45Q98l+39vhxChiWHo7F1fNMQuWxAOoarf4XjT5a S3xll/2ejNB1fuXnN7wDzkaGyiGIeNk5JBL4NqZjMkJIm7GuI8S/c+05xOGNaEh+iwUh A2rZu9xWhjhdB2/VpOncw85lPx5kKBAV+OGftBWLT4xPOJkWCpc+lglrmQqheE4Hb7g+ +Lknglev6XM3WnIa1xUvyqHqv1xj8Vp9C/PeBzp26d7CYCn7zt9NkPcDlZLzzxOwmvHL PNg6l6a22loSDAx16daZL3LnmYs8CjItfpExPmoRxZna89VOH5nEurfrKyRJYSQMJMeJ sLJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HnR8wwizJifxhp47CgHE6ZYLB1qcybaH7Ck4ivgv2O8=; b=kqoQzUpo5nuabBGvbQPmUn70XLVm465AnsCPS0Q1HOifYspWlshC9X9tYf3FFJNQL5 p3cMKNcGeHokT7pJcDfeooKj2dV0P9kSzMV60NIMDGRDy/5F6vyIidlqCzd+vTfQeADN ueLWqnm9+Twz8E1D68e6Y7QMPxbWo/RINdA+B2T2Nue5uPG509MxjMv7ClS6q2yjgd1f +lyYNfAAUa2gKMvTA6gvVGk+2t+dgJRpNOSHX35ZJSex/GzyYn+mD/olXPRsS/R0rk56 3C2M4cp3bUynIKu023Mm1Jj73C+GHQf9UK5HWGf4muDvJbA1FT6lRkQe16C2aDy4tSH7 8c1A== X-Gm-Message-State: AKwxytdFtrfoDemJ5MLHS1FbjvFujWj0CjwRtKWOf6/Rfi7JuSAtn+yW 2hWB8/1WtsQXnIBdnd9/WzK3qvAU X-Received: by 10.98.69.209 with SMTP id n78mr34131163pfi.6.1516390882034; Fri, 19 Jan 2018 11:41:22 -0800 (PST) Received: from dtor-ws.mtv.corp.google.com ([2620:0:1000:1611:da80:8749:c06f:9515]) by smtp.gmail.com with ESMTPSA id p1sm18947830pgr.44.2018.01.19.11.41.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Jan 2018 11:41:21 -0800 (PST) From: Dmitry Torokhov To: Benjamin Tissoires , Hans de Goede , Lyude Paul Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 7/7] Input: libps2 - relax command byte ACK handling Date: Fri, 19 Jan 2018 11:41:11 -0800 Message-Id: <20180119194111.185590-8-dmitry.torokhov@gmail.com> X-Mailer: git-send-email 2.16.0.rc1.238.g530d649a79-goog In-Reply-To: <20180119194111.185590-1-dmitry.torokhov@gmail.com> References: <20180119194111.185590-1-dmitry.torokhov@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When we probe PS/2 devices we first issue "Get ID" command and only if we receive what we consider a valid keyboard or mouse ID we disable the device and continue with protocol detection. That means that the device may be transmitting motion or keystroke data, while we expect ACK response. Instead of signaling failure if we see anything but ACK/NAK let's ignore "garbage" response until we see ACK for the command byte (first byte). The checks for subsequent ACKs of command parameters will continue be strict. Signed-off-by: Dmitry Torokhov --- drivers/input/serio/libps2.c | 25 ++++++++++++++++++++++--- include/linux/libps2.h | 1 + 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/drivers/input/serio/libps2.c b/drivers/input/serio/libps2.c index f05c407b31f3d..e6a07e68d1ff6 100644 --- a/drivers/input/serio/libps2.c +++ b/drivers/input/serio/libps2.c @@ -256,16 +256,23 @@ int __ps2_command(struct ps2dev *ps2dev, u8 *param, unsigned int command) for (i = 0; i < receive; i++) ps2dev->cmdbuf[(receive - 1) - i] = param[i]; + /* Signal that we are sending the command byte */ + ps2dev->flags |= PS2_FLAG_ACK_CMD; + /* * Some devices (Synaptics) peform the reset before * ACKing the reset command, and so it can take a long * time before the ACK arrives. */ - rc = ps2_do_sendbyte(ps2dev, command & 0xff, - command == PS2_CMD_RESET_BAT ? 1000 : 200, 2); + timeout = command == PS2_CMD_RESET_BAT ? 1000 : 200; + + rc = ps2_do_sendbyte(ps2dev, command & 0xff, timeout, 2); if (rc) goto out_reset_flags; + /* Now we are sending command parameters, if any */ + ps2dev->flags &= ~PS2_FLAG_ACK_CMD; + for (i = 0; i < send; i++) { rc = ps2_do_sendbyte(ps2dev, param[i], 200, 2); if (rc) @@ -416,7 +423,19 @@ bool ps2_handle_ack(struct ps2dev *ps2dev, u8 data) } /* Fall through */ default: - return false; + /* + * Do not signal errors if we get unexpected reply while + * waiting for an ACK to the initial (first) command byte: + * the device might not be quiesced yet and continue + * delivering data. + * Note that we reset PS2_FLAG_WAITID flag, so the workaround + * for mice not acknowledging the Get ID command only triggers + * on the 1st byte; if device spews data we really want to see + * a real ACK from it. + */ + dev_dbg(&ps2dev->serio->dev, "unexpected %#02x\n", data); + ps2dev->flags &= ~PS2_FLAG_WAITID; + return ps2dev->flags & PS2_FLAG_ACK_CMD; } if (!ps2dev->nak) { diff --git a/include/linux/libps2.h b/include/linux/libps2.h index cd4454502a042..8b8139337e552 100644 --- a/include/linux/libps2.h +++ b/include/linux/libps2.h @@ -27,6 +27,7 @@ #define PS2_FLAG_CMD1 BIT(2) /* Waiting for the first byte of command response */ #define PS2_FLAG_WAITID BIT(3) /* Command executing is GET ID */ #define PS2_FLAG_NAK BIT(4) /* Last transmission was NAKed */ +#define PS2_FLAG_ACK_CMD BIT(5) /* Waiting to ACK the command (first) byte */ struct ps2dev { struct serio *serio; -- 2.16.0.rc1.238.g530d649a79-goog