Message ID | 20190219012447.5900-1-sxauwsk@163.com |
---|---|
State | Rejected |
Headers | show |
Series | [v2] i2c: cadence: try reset when master receive arbitration lost | expand |
On Tue, Feb 19, 2019 at 09:24:47AM +0800, Shikai Wang wrote: > When the adapter receive arbitration lost error interrupts, > cdns_i2c_master_xfer return to the caller directly instead of resetting > the adapter which resulted in the adapter being out of control. > > So when driver detect err_status such as arbitration lost, > then try to repair and fix it. Just checking because resetting looks like a big hammer to me: there is no way to gracefully recover form 'arbitration lost' interrupt?
On Sat, Feb 23, 2019 at 10:48:43AM +0100, Wolfram Sang wrote: > On Tue, Feb 19, 2019 at 09:24:47AM +0800, Shikai Wang wrote: > > When the adapter receive arbitration lost error interrupts, > > cdns_i2c_master_xfer return to the caller directly instead of resetting > > the adapter which resulted in the adapter being out of control. > > > > So when driver detect err_status such as arbitration lost, > > then try to repair and fix it. > > Just checking because resetting looks like a big hammer to me: there is > no way to gracefully recover form 'arbitration lost' interrupt? I am still wondering about this but since it is acked by the maintainer: Applied to for-current, thanks!
On Sat, Mar 09, 2019 at 10:44:52AM +0100, Wolfram Sang wrote: > On Sat, Feb 23, 2019 at 10:48:43AM +0100, Wolfram Sang wrote: > > On Tue, Feb 19, 2019 at 09:24:47AM +0800, Shikai Wang wrote: > > > When the adapter receive arbitration lost error interrupts, > > > cdns_i2c_master_xfer return to the caller directly instead of resetting > > > the adapter which resulted in the adapter being out of control. > > > > > > So when driver detect err_status such as arbitration lost, > > > then try to repair and fix it. > > > > Just checking because resetting looks like a big hammer to me: there is > > no way to gracefully recover form 'arbitration lost' interrupt? > > I am still wondering about this but since it is acked by the maintainer: > > Applied to for-current, thanks! Oops, I was mixing this up with [PATCHv4] i2c: cadence: Fix the driver in interrupt flurry case This one doesn't have an ack from Michal. Dropping it again.
Hi Shikai, On Tue, Feb 19, 2019 at 8:19 AM Shikai Wang <sxauwsk@163.com> wrote: > > When the adapter receive arbitration lost error interrupts, > cdns_i2c_master_xfer return to the caller directly instead of resetting > the adapter which resulted in the adapter being out of control. > > So when driver detect err_status such as arbitration lost, > then try to repair and fix it. > I am missing the issue that you are facing. You are having a multimaster scenario and getting arbitration lost. the current code would attempt a retry did that lead to any issues? Can you explain the issue that you are facing?
>Hi Shikai, > >On Tue, Feb 19, 2019 at 8:19 AM Shikai Wang <sxauwsk@163.com> wrote: >> >> When the adapter receive arbitration lost error interrupts, >> cdns_i2c_master_xfer return to the caller directly instead of resetting >> the adapter which resulted in the adapter being out of control. >> >> So when driver detect err_status such as arbitration lost, >> then try to repair and fix it. >> >I am missing the issue that you are facing. >You are having a multimaster scenario and getting arbitration lost. > >the current code would attempt a retry did that lead to any issues? > >Can you explain the issue that you are facing? Of cource, The following describe my situation. In my product, Touchscreen connect to zynq-7000 XC7Z010 by i2c bus( Just connect only one i2c-device of touchscreen), when user tap Touchscreen, Touchscreen interrupt send to CPU and notifyed i2c-driver to obtain location data by i2c-bus, when Tap the screen frequently, sometimes CPU get interrupt from touchscreen and try to obtain data, then detect arbitration lost, Although i2c-driver try three times, it's useless. Actually i2c clock-line and data-line keep high, that mean i2c bus free. Once this situation occur, i2c-control did't work anynay but cpu receive interrputs still. I am sorry that I have't found a good solution for this issuse;
Hi Shikai, On Tue, Nov 5, 2019 at 2:18 PM sxauwsk@163.com <sxauwsk@163.com> wrote: > > >Hi Shikai, > > > >On Tue, Feb 19, 2019 at 8:19 AM Shikai Wang <sxauwsk@163.com> wrote: > >> > >> When the adapter receive arbitration lost error interrupts, > >> cdns_i2c_master_xfer return to the caller directly instead of resetting > >> the adapter which resulted in the adapter being out of control. > >> > >> So when driver detect err_status such as arbitration lost, > >> then try to repair and fix it. > >> > >I am missing the issue that you are facing. > >You are having a multimaster scenario and getting arbitration lost. > > > >the current code would attempt a retry did that lead to any issues? > > > >Can you explain the issue that you are facing? > > Of cource, The following describe my situation. > > In my product, Touchscreen connect to zynq-7000 XC7Z010 by i2c bus( Just connect only one i2c-device of touchscreen), > when user tap Touchscreen, Touchscreen interrupt send to CPU and notifyed i2c-driver to obtain location data by i2c-bus, So it is single master single slave. > > when Tap the screen frequently, sometimes CPU get interrupt from touchscreen and try to obtain data, then detect arbitration lost, the arbitration lost is surprising in non-multimaster scenario. Is there any other master in the configuration that we may not be triggering. Or can you probe the lines? > Although i2c-driver try three times, it's useless. You get bus busy? what is the issue. > > Actually i2c clock-line and data-line keep high, that mean i2c bus free. > Once this situation occur, i2c-control did't work anynay but cpu receive interrputs still. > > I am sorry that I have't found a good solution for this issuse;
>Hi Shikai, > >On Tue, Nov 5, 2019 at 2:18 PM sxauwsk@163.com <sxauwsk@163.com> wrote: >> >> >Hi Shikai, >> > >> >On Tue, Feb 19, 2019 at 8:19 AM Shikai Wang <sxauwsk@163.com> wrote: >> >> >> >> When the adapter receive arbitration lost error interrupts, >> >> cdns_i2c_master_xfer return to the caller directly instead of resetting >> >> the adapter which resulted in the adapter being out of control. >> >> >> >> So when driver detect err_status such as arbitration lost, >> >> then try to repair and fix it. >> >> >> >I am missing the issue that you are facing. >> >You are having a multimaster scenario and getting arbitration lost. >> > >> >the current code would attempt a retry did that lead to any issues? >> > >> >Can you explain the issue that you are facing? >> >> Of cource, The following describe my situation. >> >> In my product, Touchscreen connect to zynq-7000 XC7Z010 by i2c bus( Just connect only one i2c-device of touchscreen), >> when user tap Touchscreen, Touchscreen interrupt send to CPU and notifyed i2c-driver to obtain location data by i2c-bus, > >So it is single master single slave. >> >> when Tap the screen frequently, sometimes CPU get interrupt from touchscreen and try to obtain data, then detect arbitration lost, >the arbitration lost is surprising in non-multimaster scenario. >Is there any other master in the configuration that we may not be triggering. >Or can you probe the lines? > >> Although i2c-driver try three times, it's useless. > >You get bus busy? what is the issue. >> >> Actually i2c clock-line and data-line keep high, that mean i2c bus free. >> Once this situation occur, i2c-control did't work anynay but cpu receive interrputs still. >> >> I am sorry that I have't found a good solution for this issuse; Yes, I can't believe that, Maybe caused by the hardware environment or any other well. Additionally I have't probe this issue recently.
diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c index b13605718291..595b0d56ff1a 100644 --- a/drivers/i2c/busses/i2c-cadence.c +++ b/drivers/i2c/busses/i2c-cadence.c @@ -548,10 +548,6 @@ static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg, cdns_i2c_writereg(CDNS_I2C_IXR_ALL_INTR_MASK, CDNS_I2C_IDR_OFFSET); - /* If it is bus arbitration error, try again */ - if (id->err_status & CDNS_I2C_IXR_ARB_LOST) - return -EAGAIN; - return 0; } @@ -624,6 +620,12 @@ static int cdns_i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, if (id->err_status) { cdns_i2c_master_reset(adap); + /* If it is bus arbitration error, try again */ + if (id->err_status & CDNS_I2C_IXR_ARB_LOST) { + ret = -EAGAIN; + goto out; + } + if (id->err_status & CDNS_I2C_IXR_NACK) { ret = -ENXIO; goto out;