All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tzung-Bi Shih <tzungbi@kernel.org>
To: bleung@chromium.org, groeck@chromium.org
Cc: chrome-platform@lists.linux.dev, tzungbi@kernel.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH v2 06/10] platform/chrome: cros_ec_proto: separate cros_ec_wait_until_complete()
Date: Mon, 18 Jul 2022 05:09:10 +0000	[thread overview]
Message-ID: <20220718050914.2267370-7-tzungbi@kernel.org> (raw)
In-Reply-To: <20220718050914.2267370-1-tzungbi@kernel.org>

EC returns EC_RES_IN_PROGRESS if the host command needs more time to
complete.  Whenever receives the return code, cros_ec_send_command()
sends EC_CMD_GET_COMMS_STATUS to query the command status.

Separate cros_ec_wait_until_complete() from cros_ec_send_command().
It sends EC_CMD_GET_COMMS_STATUS and waits until the previous command
was completed, or encountered error, or timed out.

Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
---
Changes from v1:
- Allocate buffer in cros_ec_wait_until_complete() statically.
- Use `return ret` instead of `break` to make the intent explicit.

 drivers/platform/chrome/cros_ec_proto.c | 74 ++++++++++++-------------
 1 file changed, 35 insertions(+), 39 deletions(-)

diff --git a/drivers/platform/chrome/cros_ec_proto.c b/drivers/platform/chrome/cros_ec_proto.c
index 0cec013be3d3..a6ad7f7956e6 100644
--- a/drivers/platform/chrome/cros_ec_proto.c
+++ b/drivers/platform/chrome/cros_ec_proto.c
@@ -134,56 +134,52 @@ static int cros_ec_xfer_command(struct cros_ec_device *ec_dev, struct cros_ec_co
 	return ret;
 }
 
-static int cros_ec_send_command(struct cros_ec_device *ec_dev, struct cros_ec_command *msg)
+static int cros_ec_wait_until_complete(struct cros_ec_device *ec_dev, uint32_t *result)
 {
-	int ret = cros_ec_xfer_command(ec_dev, msg);
+	struct {
+		struct cros_ec_command msg;
+		struct ec_response_get_comms_status status;
+	} __packed buf;
+	struct cros_ec_command *msg = &buf.msg;
+	struct ec_response_get_comms_status *status = &buf.status;
+	int ret = 0, i;
 
-	if (msg->result == EC_RES_IN_PROGRESS) {
-		int i;
-		struct cros_ec_command *status_msg;
-		struct ec_response_get_comms_status *status;
+	msg->version = 0;
+	msg->command = EC_CMD_GET_COMMS_STATUS;
+	msg->insize = sizeof(*status);
+	msg->outsize = 0;
 
-		status_msg = kmalloc(sizeof(*status_msg) + sizeof(*status),
-				     GFP_KERNEL);
-		if (!status_msg)
-			return -ENOMEM;
+	/* Query the EC's status until it's no longer busy or we encounter an error. */
+	for (i = 0; i < EC_COMMAND_RETRIES; ++i) {
+		usleep_range(10000, 11000);
 
-		status_msg->version = 0;
-		status_msg->command = EC_CMD_GET_COMMS_STATUS;
-		status_msg->insize = sizeof(*status);
-		status_msg->outsize = 0;
+		ret = cros_ec_xfer_command(ec_dev, msg);
+		if (ret == -EAGAIN)
+			continue;
+		if (ret < 0)
+			return ret;
 
-		/*
-		 * Query the EC's status until it's no longer busy or
-		 * we encounter an error.
-		 */
-		for (i = 0; i < EC_COMMAND_RETRIES; i++) {
-			usleep_range(10000, 11000);
-
-			trace_cros_ec_request_start(status_msg);
-			ret = (*xfer_fxn)(ec_dev, status_msg);
-			trace_cros_ec_request_done(status_msg, ret);
-			if (ret == -EAGAIN)
-				continue;
-			if (ret < 0)
-				break;
-
-			msg->result = status_msg->result;
-			if (status_msg->result != EC_RES_SUCCESS)
-				break;
-
-			status = (struct ec_response_get_comms_status *)
-				 status_msg->data;
-			if (!(status->flags & EC_COMMS_STATUS_PROCESSING))
-				break;
-		}
+		*result = msg->result;
+		if (msg->result != EC_RES_SUCCESS)
+			return ret;
 
-		kfree(status_msg);
+		if (!(status->flags & EC_COMMS_STATUS_PROCESSING))
+			return ret;
 	}
 
 	return ret;
 }
 
+static int cros_ec_send_command(struct cros_ec_device *ec_dev, struct cros_ec_command *msg)
+{
+	int ret = cros_ec_xfer_command(ec_dev, msg);
+
+	if (msg->result == EC_RES_IN_PROGRESS)
+		ret = cros_ec_wait_until_complete(ec_dev, &msg->result);
+
+	return ret;
+}
+
 /**
  * cros_ec_prepare_tx() - Prepare an outgoing message in the output buffer.
  * @ec_dev: Device to register.
-- 
2.37.0.170.g444d1eabd0-goog


  parent reply	other threads:[~2022-07-18  5:10 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-18  5:09 [PATCH v2 00/10] platform/chrome: Kunit tests and refactor for cros_ec_cmd_xfer() Tzung-Bi Shih
2022-07-18  5:09 ` [PATCH v2 01/10] platform/chrome: cros_kunit_util: add default value for `msg->result` Tzung-Bi Shih
2022-07-18 13:35   ` Guenter Roeck
2022-07-19  4:00     ` Tzung-Bi Shih
2022-07-19 21:27       ` Guenter Roeck
2022-07-20  1:00         ` Tzung-Bi Shih
2022-07-18  5:09 ` [PATCH v2 02/10] platform/chrome: cros_ec_proto: add "cros_ec_" prefix to send_command() Tzung-Bi Shih
2022-07-18  5:09 ` [PATCH v2 03/10] platform/chrome: cros_ec_proto: add Kunit tests for cros_ec_cmd_xfer() Tzung-Bi Shih
2022-07-18  5:09 ` [PATCH v2 04/10] platform/chrome: cros_ec_proto: add Kunit tests for cros_ec_send_command() Tzung-Bi Shih
2022-07-18  5:09 ` [PATCH v2 05/10] platform/chrome: cros_ec_proto: separate cros_ec_xfer_command() Tzung-Bi Shih
2022-07-18  5:09 ` Tzung-Bi Shih [this message]
2022-07-18 13:32   ` [PATCH v2 06/10] platform/chrome: cros_ec_proto: separate cros_ec_wait_until_complete() Guenter Roeck
2022-07-18  5:09 ` [PATCH v2 07/10] platform/chrome: cros_ec_proto: change Kunit expectation when timed out Tzung-Bi Shih
2022-07-18  5:09 ` [PATCH v2 08/10] platform/chrome: cros_ec_proto: return -EAGAIN when retries " Tzung-Bi Shih
2022-07-18 13:33   ` Guenter Roeck
2022-07-18  5:09 ` [PATCH v2 09/10] platform/chrome: cros_ec_proto: add Kunit test for empty payload Tzung-Bi Shih
2022-07-18 13:36   ` Guenter Roeck
2022-07-18  5:09 ` [PATCH v2 10/10] platform/chrome: cros_ec_proto: return -EPROTO if " Tzung-Bi Shih
2022-07-20  1:30 ` [PATCH v2 00/10] platform/chrome: Kunit tests and refactor for cros_ec_cmd_xfer() patchwork-bot+chrome-platform
2022-07-21  8:50 ` patchwork-bot+chrome-platform

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220718050914.2267370-7-tzungbi@kernel.org \
    --to=tzungbi@kernel.org \
    --cc=bleung@chromium.org \
    --cc=chrome-platform@lists.linux.dev \
    --cc=groeck@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.