]> www.infradead.org Git - users/dwmw2/linux.git/commit
i2c: designware: fix RX FIFO overrun
authorJosef Ahmad <josef.ahmad@linux.intel.com>
Fri, 19 Apr 2013 16:28:10 +0000 (17:28 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 24 May 2013 18:35:47 +0000 (11:35 -0700)
commitd66affca2391a38a0fdfea47d263da089ab23d2f
tree114a79783b50d703fefb0dadd17589e68eea2a38
parenteb3c8adad2ebf3197d6feaef84d4df7561687fd6
i2c: designware: fix RX FIFO overrun

commit e6f34cea56f5b95498070eaa9f4aa3ba4a9e4f62 upstream.

i2c_dw_xfer_msg() pushes a number of bytes to transmit/receive
to/from the bus into the TX FIFO.
For master-rx transactions, the maximum amount of data that can be
received is calculated depending solely on TX and RX FIFO load.

This is racy - TX FIFO may contain master-rx data yet to be
processed, which will eventually land into the RX FIFO. This
data is not taken into account and the function may request more
data than the controller is actually capable of storing.

This patch ensures the driver takes into account the outstanding
master-rx data in TX FIFO to prevent RX FIFO overrun.

Signed-off-by: Josef Ahmad <josef.ahmad@linux.intel.com>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/i2c/busses/i2c-designware-core.c
drivers/i2c/busses/i2c-designware-core.h