Calling wait_event_interruptible_timeout() in I2C wait functions
Timur Tabi
timur at freescale.com
Wed Feb 4 06:37:30 EST 2009
In i2c-mpc.c, the i2c_wait() function has this:
} else {
/* Interrupt mode */
result = wait_event_interruptible_timeout(i2c->queue,
(i2c->interrupt & CSR_MIF), timeout * HZ);
if (unlikely(result < 0)) {
pr_debug("I2C: wait interrupted\n");
writeccr(i2c, 0);
} else if (unlikely(!(i2c->interrupt & CSR_MIF))) {
That is, the driver calls wait_event_interruptible_timeout() to wait for
a response from the I2C controller after a read or write operation.
However, it appears that this is not common behavior for I2C driver. In
fact, only these six drivers ever call wait_event_interruptible_timeout():
i2c-cpm.c
i2c-ibm_iic.c
i2c-mpc.c
i2c-taos-evm.c
i2c-iop3xx.c
i2c-mv64xxx.c
Although one would think that calling wait_event_interruptible_timeout()
is a good idea, it fails in one situation: when the abrupt termination
of a process causes an I2C operation to occur. That is, you press ^C in
your application, and the driver issues a final I2C operation to shut
down the device. In this situation, wait_event_interruptible_timeout()
returns -ERESTARTSYS, which is then passed up through
i2c_smbus_write_byte_data().
So my question is, is i2c-mpc.c wrong in using
wait_event_interruptible_timeout()?
--
Timur Tabi
Linux kernel developer at Freescale
More information about the Linuxppc-dev
mailing list