On 08/09/22, Alain Volmat wrote: > Current function stm32_i2c_message_xfer is sending a STOP > whatever the result of the transaction is. This can cause issues > such as making the bus busy since the controller itself is already > sending automatically a STOP when a NACK is generated. This can > be especially seen when the processing get slower (ex: enabling lots > of debug messages), ending up send 2 STOP (one automatically by the > controller and a 2nd one at the end of the stm32_i2c_message_xfer > function).
um I debugged this - took me a couple of days - and I proposed a fix that has just been massaged a little in this PR. IMO the best thing to do is either adding me - or to be fair yourself since you invested almost zero time on it - as a co-author. The hard bit was to find the issue in the first place. what do you think? I'll try to find some time to test this. > > Signed-off-by: Alain Volmat <alain.vol...@foss.st.com> > --- > drivers/i2c/stm32f7_i2c.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/drivers/i2c/stm32f7_i2c.c b/drivers/i2c/stm32f7_i2c.c > index 0ec67b5c12..8803979d3e 100644 > --- a/drivers/i2c/stm32f7_i2c.c > +++ b/drivers/i2c/stm32f7_i2c.c > @@ -477,16 +477,16 @@ static int stm32_i2c_message_xfer(struct stm32_i2c_priv > *i2c_priv, > if (ret) > break; > > + /* End of transfer, send stop condition */ > + mask = STM32_I2C_CR2_STOP; > + setbits_le32(®s->cr2, mask); > + > if (!stop) > /* Message sent, new message has to be sent */ > return 0; > } > } > > - /* End of transfer, send stop condition */ > - mask = STM32_I2C_CR2_STOP; > - setbits_le32(®s->cr2, mask); > - > return stm32_i2c_check_end_of_message(i2c_priv); > } > > -- > 2.25.1 >