0be87af99d
Not canceling the I2C timeout watch dog immediately after finishing all I2C transactions in interrupt context can lead to a race condition due to nxsem_wait(&priv->wait) in lpc17_40_i2c_start() not resuming execution fast enough (this can be easily triggered if another task / thread is using a lot of cpu time). Falling to cancel the watchdog up to time will cause the priv->wait semaphore to be incremented twice (first by lpc17_40_i2c_stop() then by lpc17_40_i2c_timeout()), so all I2C transactions after that will return immediately and priv->msgs will hold pointers to memory it doesn't own anymore. Canceling the priv->timeout watch dog in lpc17_40_i2c_stop() prevents this as it is executed from the I2C interrupt handler. arch/arm/src/lpc17xx_40xx/lpc17_40_i2c.c: Fix timeout calculation For each byte received / transmitted, an acknowledge bit is also transmitted / received, requiring effectively 9 bits for each byte. |
||
---|---|---|
.. | ||
include | ||
src | ||
Kconfig |