linux/arch/mn10300/kernel
Akira Takeuchi a8893fb3e6 MN10300: Discard low-priority Tx interrupts when closing an on-chip serial port
Discard low-prioriy Tx interrupts when closing an MN10300 on-chip serial port.

The MN10300 on-chip serial port uses three interrupts to manage its serial
ports:

 (1) A very high priority interrupt that drives virtual DMA for Rx.

 (2) A very high priority interrupt that drives virtual DMA for Tx.

 (3) A normal priority virtual interrupt that does the normal UART interrupt
     stuff and is shared between Rx and Tx.

mn10300_serial_stop_tx() only disables the high priority Tx interrupt.  It
doesn't also disable the normal priority one because it is shared with Rx.

However, the high priority interrupt may interrupt local_irq_disabled()
sections, and so may have queued up a low priority virtual interrupt whilst the
UART driver is asking for the Tx interrupt to be disabled.

The result of this can be an oops when we try to process the interrupt in
mn10300_serial_transmit_interrupt() as port->uart.info and port->uart.info->tty
may have gone away.

To deal with this, if either of those pointers is NULL, we make sure the
high-priority Tx interrupt is disabled and discard the interrupt.  The low
priority interrupt is disabled by the mn10300_serial_pic irq_chip table.

Signed-off-by: Akira Takeuchi <takeuchi.akr@jp.panasonic.com>
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-12-10 13:34:33 -08:00
..
Makefile Generic semaphore implementation 2008-04-17 10:42:34 -04:00
asm-offsets.c mn10300: use kbuild.h instead of defining macros in asm-offsets.c 2008-04-29 08:06:30 -07:00
entry.S MN10300: Wire up new system calls 2008-08-01 13:03:48 -07:00
fpu-low.S
fpu.c
gdb-cache.S
gdb-io-serial-low.S
gdb-io-serial.c MN10300: Introduce barriers to replace removed volatiles in gdbstub 16550 driver 2008-12-03 16:47:40 -08:00
gdb-io-ttysm-low.S
gdb-io-ttysm.c MN10300: Introduce barriers to replace removed volatiles in gdbstub 2008-02-19 15:51:36 -08:00
gdb-low.S
gdb-stub.c MN10300: Tighten up the code using case ranges 2008-11-30 11:21:18 -08:00
head.S
init_task.c [PATCH] take init_files to fs/file.c 2008-05-16 17:22:20 -04:00
internal.h
io.c
irq.c MN10300: Fix IRQ handling 2008-10-01 09:40:43 -07:00
kernel_execve.S
kprobes.c
kthread.S
mn10300-debug.c
mn10300-serial-low.S
mn10300-serial.c MN10300: Discard low-priority Tx interrupts when closing an on-chip serial port 2008-12-10 13:34:33 -08:00
mn10300-serial.h
mn10300-watchdog-low.S
mn10300-watchdog.c
mn10300_ksyms.c mn10300: provide __ucmpdi2() for MN10300 2008-07-04 10:40:07 -07:00
module.c MN10300: Fix application of kernel module relocations 2008-12-02 15:52:07 -08:00
process.c mn10300: export certain arch symbols required to build allmodconfig 2008-07-04 10:40:07 -07:00
profile-low.S
profile.c
ptrace.c
rtc.c mn10300: use bcd2bin/bin2bcd 2008-10-20 08:52:41 -07:00
setup.c MN10300: Kill linux/a.out.h inclusions 2008-06-16 10:20:57 -07:00
sigframe.h
signal.c
switch_to.S
sys_mn10300.c unified (weak) sys_pipe implementation 2008-05-03 13:50:33 -07:00
time.c MN10300: Make sched_clock() report time since boot 2008-09-24 16:38:17 -07:00
traps.c MN10300: Make the kernel jump into gdbstub on a BUG 2008-02-19 15:51:36 -08:00
vmlinux.lds.S MN10300: vmlinux.lds.S cleanup - use PAGE_SIZE, PERCPU macros 2008-12-10 13:34:33 -08:00