• Sebastian Andrzej Siewior's avatar
    tty: serial: 8250_core: read only RX if there is something in the FIFO · 0aa525d1
    Sebastian Andrzej Siewior authored
    The serial8250_do_startup() function unconditionally clears the
    interrupts and for that it reads from the RX-FIFO without checking if
    there is a byte in the FIFO or not. This works fine on OMAP4+ HW like
    AM335x or DRA7.
    OMAP3630 ES1.1 (which means probably all OMAP3 and earlier) does not like
    this:
    
    |Unhandled fault: external abort on non-linefetch (0x1028) at 0xfb020000
    |Internal error: : 1028 [#1] ARM
    |Modules linked in:
    |CPU: 0 PID: 1 Comm: swapper Not tainted 3.16.0-00022-g7edcb57-dirty #1213
    |task: de0572c0 ti: de058000 task.ti: de058000
    |PC is at mem32_serial_in+0xc/0x1c
    |LR is at serial8250_do_startup+0x220/0x85c
    |Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
    |Control: 10c5387d  Table: 80004019  DAC: 00000015
    |[<c03051d4>] (mem32_serial_in) from [<c0307fe8>] (serial8250_do_startup+0x220/0x85c)
    |[<c0307fe8>] (serial8250_do_startup) from [<c0309e00>] (omap_8250_startup+0x5c/0xe0)
    |[<c0309e00>] (omap_8250_startup) from [<c030863c>] (serial8250_startup+0x18/0x2c)
    |[<c030863c>] (serial8250_startup) from [<c030394c>] (uart_startup+0x78/0x1d8)
    |[<c030394c>] (uart_startup) from [<c0304678>] (uart_open+0xe8/0x114)
    |[<c0304678>] (uart_open) from [<c02e9e10>] (tty_open+0x1a8/0x5a4)
    Reviewed-by: default avatarTony Lindgren <tony@atomide.com>
    Tested-by: default avatarTony Lindgren <tony@atomide.com>
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    0aa525d1
8250_core.c 94.8 KB