With 2.6.30-rc1 on SMDK6410 I experience a soft lockup on bootup when
the Samsung serial driver attempts to disable the transmit interrupt
from within the transmit interrupt handler: it calls disable_irq()
which locks up due to attempting to synchronise with the running handler.
Fix this by using disable_irq_nosync().
Also make the same change in the recieve path.
Backtrace:
[<
c002a914>] (__irq_svc+0x34/0x80) from [<
c00696c0>] (synchr)
[<
c00696c0>] (synchronize_irq+0xc/0xcc) from [<
c018d434>] (s)
[<
c018d434>] (s3c24xx_serial_stop_tx+0x1c/0x3c) from [<c018d)
[<
c018d54c>] (s3c24xx_serial_tx_chars+0xf8/0x104) from [<c00)
[<
c0068bcc>] (handle_IRQ_event+0x74/0x118) from [<
c006ab04>])
[<
c006ab04>] (handle_level_irq+0x100/0x118) from [<
c00349c4>)
[<
c00349c4>] (s3c_irq_demux_uart+0x94/0xc4) from [<
c002a050>)
[<
c002a050>] (_text+0x50/0x6c) from [<
c002a914>] (__irq_svc+)
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Ben Dooks <ben-linux@fluff.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
struct s3c24xx_uart_port *ourport = to_ourport(port);
if (tx_enabled(port)) {
- disable_irq(ourport->tx_irq);
+ disable_irq_nosync(ourport->tx_irq);
tx_enabled(port) = 0;
if (port->flags & UPF_CONS_FLOW)
s3c24xx_serial_rx_enable(port);
if (rx_enabled(port)) {
dbg("s3c24xx_serial_stop_rx: port=%p\n", port);
- disable_irq(ourport->rx_irq);
+ disable_irq_nosync(ourport->rx_irq);
rx_enabled(port) = 0;
}
}