Simon Lindgren 6721f28a26 i2c: at91: Fix a race condition during signal handling in at91_do_twi_xfer.
There is a race condition in at91_do_twi_xfer when signals arrive.
If a signal is recieved while waiting for a transfer to complete
wait_for_completion_interruptible_timeout() will return -ERESTARTSYS.
This is not handled correctly resulting in interrupts still being
enabled and a transfer being in flight when we return.

Symptoms include a range of oopses and bus lockups. Oopses can happen
when the transfer completes because the interrupt handler will corrupt
the stack. If a new transfer is started before the interrupt fires
the controller will start a new transfer in the middle of the old one,
resulting in confused slaves and a locked bus.

To avoid this, use wait_for_completion_io_timeout instead so that we
don't have to deal with gracefully shutting down the transfer and
disabling the interrupts.

Signed-off-by: Simon Lindgren <simon@aqwary.com>
Acked-by: Ludovic Desroches <ludovic.desroches@atmel.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Cc: stable@kernel.org
2014-09-02 14:29:20 +02:00
..
2014-08-24 11:28:30 -07:00
2014-08-08 11:14:29 -07:00
2014-08-06 20:06:14 -07:00
2014-08-05 21:16:46 -07:00
2014-08-15 17:06:40 -04:00
2014-08-04 18:36:12 -07:00
2014-08-08 11:34:32 -07:00
2014-08-08 15:57:28 -07:00
2014-08-19 09:45:31 -05:00
2014-08-08 11:34:32 -07:00
2014-07-30 00:23:09 +02:00
2014-08-08 11:14:29 -07:00
2014-08-29 12:10:03 -07:00
2014-08-06 20:10:32 -07:00
2014-08-29 11:59:46 -07:00
2014-08-04 18:34:04 -07:00