From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-sn1nam01on0105.outbound.protection.outlook.com ([104.47.32.105]:60007 "EHLO NAM01-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S966085AbeCHFEF (ORCPT ); Thu, 8 Mar 2018 00:04:05 -0500 From: Sasha Levin To: "linux-kernel@vger.kernel.org" , "stable@vger.kernel.org" CC: Shawn Nematbakhsh , Brian Norris , Benson Leung , Sasha Levin Subject: [PATCH AUTOSEL for 4.9 166/190] platform/chrome: Use proper protocol transfer function Date: Thu, 8 Mar 2018 05:00:06 +0000 Message-ID: <20180308045810.8041-166-alexander.levin@microsoft.com> References: <20180308045810.8041-1-alexander.levin@microsoft.com> In-Reply-To: <20180308045810.8041-1-alexander.levin@microsoft.com> Content-Language: en-US Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Sender: stable-owner@vger.kernel.org List-ID: From: Shawn Nematbakhsh [ Upstream commit d48b8c58c57f6edbe2965f0a5f62c5cf9593ca96 ] pkt_xfer should be used for protocol v3, and cmd_xfer otherwise. We had one instance of these functions correct, but not the second, fall-back case. We use the fall-back only when the first command returns an IN_PROGRESS status, which is only used on some EC firmwares where we don't want to constantly poll the bus, but instead back off and sleep/retry for a little while. Fixes: 2c7589af3c4d ("mfd: cros_ec: add proto v3 skeleton") Signed-off-by: Shawn Nematbakhsh Signed-off-by: Brian Norris Reviewed-by: Javier Martinez Canillas Signed-off-by: Benson Leung Signed-off-by: Sasha Levin --- drivers/platform/chrome/cros_ec_proto.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chr= ome/cros_ec_proto.c index 04053fe1e980..cfa3e850c49f 100644 --- a/drivers/platform/chrome/cros_ec_proto.c +++ b/drivers/platform/chrome/cros_ec_proto.c @@ -60,12 +60,14 @@ static int send_command(struct cros_ec_device *ec_dev, struct cros_ec_command *msg) { int ret; + int (*xfer_fxn)(struct cros_ec_device *ec, struct cros_ec_command *msg); =20 if (ec_dev->proto_version > 2) - ret =3D ec_dev->pkt_xfer(ec_dev, msg); + xfer_fxn =3D ec_dev->pkt_xfer; else - ret =3D ec_dev->cmd_xfer(ec_dev, msg); + xfer_fxn =3D ec_dev->cmd_xfer; =20 + ret =3D (*xfer_fxn)(ec_dev, msg); if (msg->result =3D=3D EC_RES_IN_PROGRESS) { int i; struct cros_ec_command *status_msg; @@ -88,7 +90,7 @@ static int send_command(struct cros_ec_device *ec_dev, for (i =3D 0; i < EC_COMMAND_RETRIES; i++) { usleep_range(10000, 11000); =20 - ret =3D ec_dev->cmd_xfer(ec_dev, status_msg); + ret =3D (*xfer_fxn)(ec_dev, status_msg); if (ret < 0) break; =20 --=20 2.14.1