On 04/20/2016 02:43 PM, Wolfram Sang wrote:
On Mon, Apr 11, 2016 at 05:28:39PM +0200, Jan Glauber wrote:
[...]
+ */ +static int octeon_i2c_hlc_wait(struct octeon_i2c *i2c) +{ + int time_left; + + octeon_i2c_hlc_int_enable(i2c); + time_left = wait_event_interruptible_timeout(i2c->queue, + octeon_i2c_hlc_test_ready(i2c), + i2c->adap.timeout);Have you tested signal handling thoroughly? Most driver dropped the _interruptible after a while. Mostly they found out that the state machine of the interrupt handler couldn't gracefully deal with it and nobody really needed the interruptible. Just saying.
Good point. We know that exiting with a signal leaves us in an undefined state.
We will have to think on this point.
+ octeon_i2c_int_disable(i2c); + if (!time_left) { + octeon_i2c_hlc_int_clear(i2c); + dev_dbg(i2c->dev, "%s: timeout\n", __func__); + return -ETIMEDOUT; + } + + if (time_left < 0) { + dev_dbg(i2c->dev, "%s: wait interrupted\n", __func__); + return time_left; + } + return 0; +}Drop the debug messages? I can't say much about the HW details, of course. Didn't spot anything suspicious there.

