| From foo@baz Thu Mar 22 14:57:33 CET 2018 |
| From: Shawn Nematbakhsh <shawnn@chromium.org> |
| Date: Fri, 8 Sep 2017 13:50:11 -0700 |
| Subject: platform/chrome: Use proper protocol transfer function |
| |
| From: Shawn Nematbakhsh <shawnn@chromium.org> |
| |
| |
| [ 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 <shawnn@chromium.org> |
| Signed-off-by: Brian Norris <briannorris@chromium.org> |
| Reviewed-by: Javier Martinez Canillas <javier@osg.samsung.com> |
| Signed-off-by: Benson Leung <bleung@chromium.org> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/platform/chrome/cros_ec_proto.c | 8 +++++--- |
| 1 file changed, 5 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/platform/chrome/cros_ec_proto.c |
| +++ b/drivers/platform/chrome/cros_ec_proto.c |
| @@ -59,12 +59,14 @@ static int send_command(struct cros_ec_d |
| struct cros_ec_command *msg) |
| { |
| int ret; |
| + int (*xfer_fxn)(struct cros_ec_device *ec, struct cros_ec_command *msg); |
| |
| if (ec_dev->proto_version > 2) |
| - ret = ec_dev->pkt_xfer(ec_dev, msg); |
| + xfer_fxn = ec_dev->pkt_xfer; |
| else |
| - ret = ec_dev->cmd_xfer(ec_dev, msg); |
| + xfer_fxn = ec_dev->cmd_xfer; |
| |
| + ret = (*xfer_fxn)(ec_dev, msg); |
| if (msg->result == EC_RES_IN_PROGRESS) { |
| int i; |
| struct cros_ec_command *status_msg; |
| @@ -87,7 +89,7 @@ static int send_command(struct cros_ec_d |
| for (i = 0; i < EC_COMMAND_RETRIES; i++) { |
| usleep_range(10000, 11000); |
| |
| - ret = ec_dev->cmd_xfer(ec_dev, status_msg); |
| + ret = (*xfer_fxn)(ec_dev, status_msg); |
| if (ret < 0) |
| break; |
| |