public inbox for linux-i2c@vger.kernel.org
 help / color / mirror / Atom feed
From: Andrew Jeffery <andrew@codeconstruct.com.au>
To: Quan Nguyen <quan@os.amperecomputing.com>,
	Wolfram Sang <wsa@kernel.org>,
	Jian Zhang <zhangjian.3032@bytedance.com>
Cc: Andi Shyti <andi.shyti@kernel.org>,
	"moderated list:ARM/ASPEED MACHINE SUPPORT" 
	<linux-aspeed@lists.ozlabs.org>,
	andrew@aj.id.au,
	"moderated list:ARM/ASPEED I2C DRIVER" <openbmc@lists.ozlabs.org>,
	yulei.sh@bytedance.com, open list <linux-kernel@vger.kernel.org>,
	Tommy Huang <tommy_huang@aspeedtech.com>,
	"open list:ARM/ASPEED I2C DRIVER" <linux-i2c@vger.kernel.org>,
	brendan.higgins@linux.dev, joel@jms.id.au,
	zhangjian3032@gmail.com,
	"moderated list:ARM/ASPEED MACHINE SUPPORT" 
	<linux-arm-kernel@lists.infradead.org>,
	xiexinnan@bytedance.com
Subject: Re: [PATCH v2] i2c: aspeed: Fix i2c bus hang in slave read
Date: Fri, 06 Oct 2023 10:49:55 +1030	[thread overview]
Message-ID: <9407cee639b3eeb715a953c33b26a9a3830a64f8.camel@codeconstruct.com.au> (raw)
In-Reply-To: <052ccd48-2541-1ef3-1f33-75b7d49611ad@os.amperecomputing.com>

On Thu, 2023-10-05 at 14:55 +0700, Quan Nguyen wrote:
> 
> On 04/10/2023 13:08, Andrew Jeffery wrote:
> > On Fri, 2023-09-29 at 09:39 +0200, Wolfram Sang wrote:
> > > On Wed, Sep 27, 2023 at 11:42:43PM +0800, Jian Zhang wrote:
> > > > When the `CONFIG_I2C_SLAVE` option is enabled and the device operates
> > > > as a slave, a situation arises where the master sends a START signal
> > > > without the accompanying STOP signal. This action results in a
> > > > persistent I2C bus timeout. The core issue stems from the fact that
> > > > the i2c controller remains in a slave read state without a timeout
> > > > mechanism. As a consequence, the bus perpetually experiences timeouts.
> > > > 
> > > > In this case, the i2c bus will be reset, but the slave_state reset is
> > > > missing.
> > > > 
> > > > Fixes: fee465150b45 ("i2c: aspeed: Reset the i2c controller when timeout occurs")
> > > > Signed-off-by: Jian Zhang <zhangjian.3032@bytedance.com>
> > > 
> > > Somebody wants to add tags here? I think it should go to my pull request
> > > this week.
> > > 
> > 
> > I've tested this patch applied on top of fee465150b45 on an AST2600 and
> > the the system behaviour doesn't seem worse. However, I can still lock
> > the bus up and trigger a hung task panic by surprise-unplugging things.
> > I'll poke around to see if I can get to the bottom of that.
> > 
> > Resetting the slave state makes sense, so with the above observation
> > aside:
> > 
> > Tested-by: Andrew Jeffery <andrew@codeconstruct.com.au>
> > Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
> > 
> > That said I do wonder whether we should update the slave state in the
> > same place we're updating the hardware state. It would cover off the
> > gap identified by Jian if it were to ever occur anywhere else.
> > Something like:
> > 
> > diff --git a/drivers/i2c/busses/i2c-aspeed.c b/drivers/i2c/busses/i2c-
> > aspeed.c
> > index 5a416b39b818..28e2a5fc4528 100644
> > --- a/drivers/i2c/busses/i2c-aspeed.c
> > +++ b/drivers/i2c/busses/i2c-aspeed.c
> > @@ -749,6 +749,8 @@ static void __aspeed_i2c_reg_slave(struct
> > aspeed_i2c_bus *bus, u16 slave_addr)
> >          func_ctrl_reg_val = readl(bus->base + ASPEED_I2C_FUN_CTRL_REG);
> >          func_ctrl_reg_val |= ASPEED_I2CD_SLAVE_EN;
> >          writel(func_ctrl_reg_val, bus->base + ASPEED_I2C_FUN_CTRL_REG);
> > +
> > +       bus->slave_state = ASPEED_I2C_SLAVE_INACTIVE;
> >   }
> >   
> >   static int aspeed_i2c_reg_slave(struct i2c_client *client)
> > @@ -765,7 +767,6 @@ static int aspeed_i2c_reg_slave(struct i2c_client
> > *client)
> >          __aspeed_i2c_reg_slave(bus, client->addr);
> >   
> >          bus->slave = client;
> > -       bus->slave_state = ASPEED_I2C_SLAVE_INACTIVE;
> >          spin_unlock_irqrestore(&bus->lock, flags);
> >   
> >          return 0;
> > 
> > 
> 
> We tested both Jian's patch and Andrew's patch on our MCTP-i2c bus 
> (ast2600 based BMC) and see both patches work well.
> 
> We currently use upstream i2c-aspeed.c driver with the commit [1] 
> backported. Without that commit, we frequently experienced the bus hang 
> (due to bus arbitration) and it is unable to recover.
> 
> But, by reverting that commit and with Jian or Andrew's patch, we see 
> the bus could be able to recover so we think both changes are good.
> 
> [1] 
> https://github.com/AspeedTech-BMC/linux/commit/11a94e5918aa0f87c828d63fd254dd60ab2505e5
> 
> Anyway, I would prefer Andrew's way because the bus->slave_state must 
> always be reset to ASPEED_I2C_SLAVE_INACTIVE everytime 
> __aspeed_i2c_reg_slave() is called.

Jian, what's your preference? Are you happy to do a v3 along the lines
of my suggestion above?

Otherwise Wolfram can take v2 and we can always do the cleanup in a
follow-up patch.

Andrew

  reply	other threads:[~2023-10-06  0:20 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-27 15:42 [PATCH v2] i2c: aspeed: Fix i2c bus hang in slave read Jian Zhang
2023-09-28 14:51 ` Andi Shyti
2023-09-28 15:04   ` [External] " Jian Zhang
2023-10-03 22:54     ` Andi Shyti
2023-09-29  7:39 ` Wolfram Sang
2023-10-04  6:08   ` Andrew Jeffery
2023-10-05  7:55     ` Quan Nguyen
2023-10-06  0:19       ` Andrew Jeffery [this message]
2023-10-06  2:25         ` [External] " Jian Zhang

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=9407cee639b3eeb715a953c33b26a9a3830a64f8.camel@codeconstruct.com.au \
    --to=andrew@codeconstruct.com.au \
    --cc=andi.shyti@kernel.org \
    --cc=andrew@aj.id.au \
    --cc=brendan.higgins@linux.dev \
    --cc=joel@jms.id.au \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-aspeed@lists.ozlabs.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=openbmc@lists.ozlabs.org \
    --cc=quan@os.amperecomputing.com \
    --cc=tommy_huang@aspeedtech.com \
    --cc=wsa@kernel.org \
    --cc=xiexinnan@bytedance.com \
    --cc=yulei.sh@bytedance.com \
    --cc=zhangjian.3032@bytedance.com \
    --cc=zhangjian3032@gmail.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