From: Jon Hunter <jonathanh@nvidia.com>
To: Shawn N <shawnn@chromium.org>
Cc: Olof Johansson <olof@lixom.net>,
Benson Leung <bleung@chromium.org>,
"Lee Jones" <lee.jones@linaro.org>,
<linux-kernel@vger.kernel.org>,
Doug Anderson <dianders@chromium.org>,
Brian Norris <computersforpeace@gmail.com>,
"Brian Norris" <briannorris@chromium.org>,
Gwendal Grignou <gwendal@chromium.org>,
Enric Balletbo <enric.balletbo@collabora.co.uk>,
Tomeu Vizoso <tomeu.vizoso@collabora.com>,
"linux-tegra@vger.kernel.org" <linux-tegra@vger.kernel.org>
Subject: Re: [PATCH v3] platform/chrome: Use proper protocol transfer function
Date: Tue, 26 Sep 2017 16:40:37 +0100 [thread overview]
Message-ID: <d8aff55f-796b-4e8d-edf3-b8d55a65eda0@nvidia.com> (raw)
In-Reply-To: <CALaWCOM87ikjzK-zFJ7WT37L_w58AwZwC_nq0hNXuzh5x87n5w@mail.gmail.com>
On 26/09/17 00:15, Shawn N wrote:
> On Wed, Sep 20, 2017 at 1:22 PM, Shawn N <shawnn@google.com> wrote:
>> On Tue, Sep 19, 2017 at 11:13 PM, Brian Norris <briannorris@chromium.org> wrote:
>>> Hi,
>>>
>>> On Tue, Sep 19, 2017 at 11:05:38PM -0700, Shawn N wrote:
>>>> This is failing because our EC_CMD_GET_PROTOCOL_INFO host command is
>>>> getting messed up, or the reply buffer is getting corrupted somehow.
>>>>
>>>> ec_dev->proto_version =
>>>> min(EC_HOST_REQUEST_VERSION,
>>>> fls(proto_info->protocol_versions) - 1);
>>>>
>>
>> Checking this closer, the first host command we send after we boot the
>> kernel (EC_CMD_GET_PROTOCOL_INFO) is failing due to protocol error
>> (see 'SPI rx bad data' / 'SPI not ready' on the EC console). Since
>> this doesn't seem to happen on the Chromium OS nyan_big release
>> kernel, I suggest to hook up a logic analyzer and see if the SPI
>> master is doing something bad.
>>
>> The error handling in cros_ec_cmd_xfer_spi() is completely wrong and
>> we return -EAGAIN / EC_RES_IN_PROGRESS, which the caller interprets
>> "the host command was received by the EC and is currently being
>> handled, poll status until completion". So the caller polls status
>> with EC_CMD_GET_COMMS_STATUS, sees no host command is in progress
>> (which is interpreted to mean "the host command I sent previously has
>> now successfully completed"), and returns success. The problem here is
>> that the initial host command was never received at all, and no reply
>> was ever received, so our reply data is all zero.
>>
>> Two things need to be fixed here:
>>
>> 1) Find out why the first host command after boot is failing. Probe
>> SPI pins and see what's going on.
Yes, I will see if I can look into this.
>> 2) Fix error handling so we properly return an error (or properly
>> retry the entire command) when a protocol error occurs (I made some
>> attempt in https://chromium-review.googlesource.com/385080/, probably
>> I should revisit that).
>
> The below patch will fix error handling and will make things mostly
> work on nyan_big, because we'll fall back to V2 protocol after the
> initial failure. But we should still investigate why we're getting
> errors on the first host command. We aren't seeing these errors when
> we send commands from firmware, so I suspect something is wrong in
> kernel SPI HW initialization that causes the first command to fail.
>
> From: Shawn Nematbakhsh <shawnn@chromium.org>
> Date: Mon, 25 Sep 2017 14:32:38 -0700
> Subject: [PATCH] mfd: cros ec: spi: Fix "in progress" error signaling
>
> For host commands that take a long time to process, cros ec can return
> early by signaling a EC_RES_IN_PROGRESS result. The host must then poll
> status with EC_CMD_GET_COMMS_STATUS until completion of the command.
>
> None of the above applies when data link errors are encountered. When
> errors such as EC_SPI_PAST_END are encountered during command
> transmission, it usually means the command was not received by the EC.
> Treating such errors as if they were 'EC_RES_IN_PROGRESS' results is
> almost always the wrong decision, and can result in host commands
> silently being lost.
>
> Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
> ---
> drivers/mfd/cros_ec_spi.c | 26 ++++++++++++--------------
> 1 file changed, 12 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/mfd/cros_ec_spi.c b/drivers/mfd/cros_ec_spi.c
> index c9714072e224..d33e3847e11e 100644
> --- a/drivers/mfd/cros_ec_spi.c
> +++ b/drivers/mfd/cros_ec_spi.c
> @@ -377,6 +377,7 @@ static int cros_ec_pkt_xfer_spi(struct
> cros_ec_device *ec_dev,
> u8 *ptr;
> u8 *rx_buf;
> u8 sum;
> + u8 rx_byte;
> int ret = 0, final_ret;
>
> len = cros_ec_prepare_tx(ec_dev, ec_msg);
> @@ -421,25 +422,22 @@ static int cros_ec_pkt_xfer_spi(struct
> cros_ec_device *ec_dev,
> if (!ret) {
> /* Verify that EC can process command */
> for (i = 0; i < len; i++) {
> - switch (rx_buf[i]) {
> - case EC_SPI_PAST_END:
> - case EC_SPI_RX_BAD_DATA:
> - case EC_SPI_NOT_READY:
> - ret = -EAGAIN;
> - ec_msg->result = EC_RES_IN_PROGRESS;
> - default:
> + rx_byte = rx_buf[i];
> + if (rx_byte == EC_SPI_PAST_END ||
> + rx_byte == EC_SPI_RX_BAD_DATA ||
> + rx_byte == EC_SPI_NOT_READY) {
> + ret = -EREMOTEIO;
> break;
> }
> - if (ret)
> - break;
> }
> - if (!ret)
> - ret = cros_ec_spi_receive_packet(ec_dev,
> - ec_msg->insize + sizeof(*response));
> - } else {
> - dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret);
> }
>
> + if (!ret)
> + ret = cros_ec_spi_receive_packet(ec_dev,
> + ec_msg->insize + sizeof(*response));
> + else
> + dev_err(ec_dev->dev, "spi transfer failed: %d\n", ret);
> +
> final_ret = terminate_request(ec_dev);
>
> spi_bus_unlock(ec_spi->spi->master);
>
Thanks! Works for me ...
Tested-by: Jon Hunter <jonathanh@nvidia.com>
Cheers
Jon
--
nvpublic
next prev parent reply other threads:[~2017-09-26 15:43 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-08 20:50 Brian Norris
2017-09-11 19:48 ` Benson Leung
2017-09-19 13:44 ` Jon Hunter
2017-09-19 14:09 ` Shawn N
2017-09-19 16:39 ` Jon Hunter
2017-09-19 17:03 ` Shawn N
2017-09-19 17:14 ` Brian Norris
2017-09-20 6:05 ` Shawn N
2017-09-20 6:13 ` Brian Norris
2017-09-20 20:22 ` Shawn N
2017-09-25 23:15 ` Shawn N
2017-09-26 15:40 ` Jon Hunter [this message]
2017-11-14 15:56 ` Jon Hunter
2017-11-14 15:59 ` Shawn N
2017-10-10 13:35 ` Jon Hunter
2017-10-10 15:33 ` Shawn N
2017-10-10 16:52 ` Doug Anderson
2017-11-07 11:28 ` Jon Hunter
2017-11-07 17:22 ` Doug Anderson
2017-11-08 10:20 ` Jon Hunter
2017-11-08 16:45 ` Doug Anderson
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=d8aff55f-796b-4e8d-edf3-b8d55a65eda0@nvidia.com \
--to=jonathanh@nvidia.com \
--cc=bleung@chromium.org \
--cc=briannorris@chromium.org \
--cc=computersforpeace@gmail.com \
--cc=dianders@chromium.org \
--cc=enric.balletbo@collabora.co.uk \
--cc=gwendal@chromium.org \
--cc=lee.jones@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=olof@lixom.net \
--cc=shawnn@chromium.org \
--cc=tomeu.vizoso@collabora.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome