On Wed, May 22, 2013 at 10:03:11AM -0000, Mika Westerberg wrote: > If a process receives signal while it is waiting for I2C transfer to > complete, an error is returned to the caller and the transfer is aborted. > This can cause the driver to fail subsequent transfers. Also according to > commit d295a86eab2 (i2c: mv64xxx: work around signals causing I2C > transactions to be aborted) I2C drivers aren't supposed to abort > transactions on signals. > > To prevent this switch to use wait_for_completion_timeout() instead of > wait_for_completion_interruptible_timeout() in the designware I2C driver. > > Signed-off-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx> Reviewed-by: Christian Ruppert <christian.ruppert@xxxxxxxxxx> > > --- > drivers/i2c/busses/i2c-designware-core.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c > index c41ca63..db20a28 100644 > --- a/drivers/i2c/busses/i2c-designware-core.c > +++ b/drivers/i2c/busses/i2c-designware-core.c > @@ -580,14 +580,13 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) > i2c_dw_xfer_init(dev); > > /* wait for tx to complete */ > - ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete, HZ); > + ret = wait_for_completion_timeout(&dev->cmd_complete, HZ); > if (ret == 0) { > dev_err(dev->dev, "controller timed out\n"); > i2c_dw_init(dev); > ret = -ETIMEDOUT; > goto done; > - } else if (ret < 0) > - goto done; > + } > > if (dev->msg_err) { > ret = dev->msg_err; -- Christian Ruppert , <christian.ruppert@xxxxxxxxxx> /| Tel: +41/(0)22 816 19-42 //| 3, Chemin du Pré-Fleuri _// | bilis Systems CH-1228 Plan-les-Ouates -- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html