From: Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>
To: Roel Kluin <roel.kluin-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org,
linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Mike Rapoport <mike-UTxiZqZC01RS1MOuV/RT9w@public.gmane.org>,
Eric Miao <eric.miao-eYqpPyKDWXRBDgjK7y7TUQ@public.gmane.org>
Subject: Re: [PATCH] i2c: timeouts reach -1
Date: Tue, 3 Feb 2009 20:08:19 +0100 [thread overview]
Message-ID: <20090203200819.1d63e96d@hyperion.delvare> (raw)
In-Reply-To: <49876AB7.5030100-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
On Mon, 02 Feb 2009 22:50:47 +0100, Roel Kluin wrote:
> Jean Delvare wrote:
> > On Sat, 31 Jan 2009 22:10:43 +0100, Jean Delvare wrote:
> >> Hi Roel,
> >>
> >> On Sat, 31 Jan 2009 11:22:58 +0100, Roel Kluin wrote:
> >>> With a postfix decrement these timeouts reach -1 rather than 0,
> >>> but after the loop it is tested whether they have become 0.
> >>>
> >>> Signed-off-by: Roel Kluin <roel.kluin-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> >>> (...)
> >>> diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c
> >>> index 6af6814..6379ec1 100644
> >>> --- a/drivers/i2c/busses/i2c-pxa.c
> >>> +++ b/drivers/i2c/busses/i2c-pxa.c
> >>> @@ -644,7 +644,7 @@ static int i2c_pxa_do_pio_xfer(struct pxa_i2c *i2c,
> >>>
> >>> i2c_pxa_start_message(i2c);
> >>>
> >>> - while (timeout-- && i2c->msg_num > 0) {
> >>> + while (--timeout && i2c->msg_num > 0) {
> >>> i2c_pxa_handler(0, i2c);
> >>> udelay(10);
> >>> }
> >> Good catch. Applied, thanks for reporting.
> >
> > On second thought, shouldn't the msg_num test be done first and the
> > timeout test second? With the current order, you could exit with a
> > timeout error while all the messages were successfully transferred.
>
> Thanks again for the review, How about:
>
> ----------------------------->8-----------------8<------------------------------
> With a postfix decrement these timeouts reach -1 rather than 0, but after the
> loop it is tested whether they have become 0. also test before the decrement
>
> As pointed out by Jean Delvare, the msg_num should be tested before the timeout.
> With the current order, you could exit with a timeout error while all the
> messages were successfully transferred.
>
> Signed-off-by: Roel Kluin <roel.kluin-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> ---
> diff --git a/drivers/i2c/busses/i2c-amd8111.c b/drivers/i2c/busses/i2c-amd8111.c
> index edab519..a73346b 100644
> --- a/drivers/i2c/busses/i2c-amd8111.c
> +++ b/drivers/i2c/busses/i2c-amd8111.c
> @@ -72,10 +72,10 @@ static unsigned int amd_ec_wait_write(struct amd_smbus *smbus)
> {
> int timeout = 500;
>
> - while (timeout-- && (inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_IBF))
> + while ((inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_IBF) && --timeout)
> udelay(1);
>
> - if (!timeout) {
> + if (timeout <= 0) {
See my previous mail: you're trying to fix up the confusion regarding
the value of timeout at the end of the loop. Changing the decrement
from postfix to prefix is sufficient to solve the issue. Changing the
test from == 0 to <= 0 is also sufficient. Doing both is redundant
_and_ fails to clear the confusion. The resulting code makes it look
like timeout _may_ become negative, which is not true.
So, I intend to keep only the first half of each fix, and apply that.
> dev_warn(&smbus->dev->dev,
> "Timeout while waiting for IBF to clear\n");
> return -ETIMEDOUT;
> @@ -88,10 +88,10 @@ static unsigned int amd_ec_wait_read(struct amd_smbus *smbus)
> {
> int timeout = 500;
>
> - while (timeout-- && (~inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_OBF))
> + while ((~inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_OBF) && --timeout)
> udelay(1);
>
> - if (!timeout) {
> + if (timeout <= 0) {
> dev_warn(&smbus->dev->dev,
> "Timeout while waiting for OBF to set\n");
> return -ETIMEDOUT;
> diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c
> index 6af6814..04751fa 100644
> --- a/drivers/i2c/busses/i2c-pxa.c
> +++ b/drivers/i2c/busses/i2c-pxa.c
> @@ -644,7 +644,7 @@ static int i2c_pxa_do_pio_xfer(struct pxa_i2c *i2c,
>
> i2c_pxa_start_message(i2c);
>
> - while (timeout-- && i2c->msg_num > 0) {
> + while (i2c->msg_num > 0 && --timeout) {
> i2c_pxa_handler(0, i2c);
> udelay(10);
> }
> @@ -657,7 +657,7 @@ static int i2c_pxa_do_pio_xfer(struct pxa_i2c *i2c,
> ret = i2c->msg_idx;
>
> out:
> - if (timeout == 0)
> + if (timeout <= 0)
> i2c_pxa_scream_blue_murder(i2c, "timeout");
>
> return ret;
--
Jean Delvare
prev parent reply other threads:[~2009-02-03 19:08 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-31 10:22 [PATCH] i2c: timeouts reach -1 Roel Kluin
[not found] ` <49842682.2020903-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2009-01-31 21:10 ` Jean Delvare
[not found] ` <20090131221043.23d3ecab-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2009-02-01 12:18 ` Jean Delvare
[not found] ` <20090201131854.64f54b28-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org>
2009-02-02 21:50 ` Roel Kluin
[not found] ` <49876AB7.5030100-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2009-02-03 19:08 ` Jean Delvare [this message]
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=20090203200819.1d63e96d@hyperion.delvare \
--to=khali-puyad+kwke1g9huczpvpmw@public.gmane.org \
--cc=ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org \
--cc=eric.miao-eYqpPyKDWXRBDgjK7y7TUQ@public.gmane.org \
--cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=mike-UTxiZqZC01RS1MOuV/RT9w@public.gmane.org \
--cc=roel.kluin-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox