1
linux/drivers/serial
Mauro Carvalho Chehab b6adea334c 8250: fix boot hang with serial console when using with Serial Over Lan port
Intel 8257x Ethernet boards have a feature called Serial Over Lan.

This feature works by emulating a serial port, and it is detected by
kernel as a normal 8250 port.  However, this emulation is not perfect, as
also noticed on changeset 7500b1f602.

Before this patch, the kernel were trying to check if the serial TX is
capable of work using IRQ's.

This were done with a code similar this:

        serial_outp(up, UART_IER, UART_IER_THRI);
        lsr = serial_in(up, UART_LSR);
        iir = serial_in(up, UART_IIR);
        serial_outp(up, UART_IER, 0);

        if (lsr & UART_LSR_TEMT && iir & UART_IIR_NO_INT)
		up->bugs |= UART_BUG_TXEN;

This works fine for other 8250 ports, but, on 8250-emulated SoL port, the
chip is a little lazy to down UART_IIR_NO_INT at UART_IIR register.

Due to that, UART_BUG_TXEN is sometimes enabled.  However, as TX IRQ keeps
working, and the TX polling is now enabled, the driver miss-interprets the
IRQ received later, hanging up the machine until a key is pressed at the
serial console.

This is the 6 version of this patch.  Previous versions were trying to
introduce a large enough delay between serial_outp and serial_in(up,
UART_IIR), but not taking forever.  However, the needed delay couldn't be
safely determined.

At the experimental tests, a delay of 1us solves most of the cases, but
still hangs sometimes.  Increasing the delay to 5us was better, but still
doesn't solve.  A very high delay of 50 ms seemed to work every time.

However, poking around with delays and pray for it to be enough doesn't
seem to be a good approach, even for a quirk.

So, instead of playing with random large arbitrary delays, let's just
disable UART_BUG_TXEN for all SoL ports.

[akpm@linux-foundation.org: fix warnings]
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: <stable@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2009-02-20 17:57:50 -08:00
..
cpm_uart Merge branch 'genirq-v28-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-10-20 13:23:01 -07:00
jsm jsm: additional device support 2009-02-18 15:37:55 -08:00
8250_accent.c
8250_acorn.c
8250_boca.c
8250_early.c
8250_exar_st16c554.c
8250_fourport.c
8250_gsc.c make probe_serial_gsc() static 2008-10-20 08:52:36 -07:00
8250_hp300.c
8250_hub6.c
8250_mca.c
8250_pci.c 8250: fix boot hang with serial console when using with Serial Over Lan port 2009-02-20 17:57:50 -08:00
8250_pnp.c serial: Add SupraExpress 336i PnP Voice Modem 2009-01-15 12:48:36 -08:00
8250.c 8250: fix boot hang with serial console when using with Serial Over Lan port 2009-02-20 17:57:50 -08:00
8250.h
21285.c
68328serial.c
68328serial.h
68360serial.c
amba-pl010.c [ARM] amba drivers: don't pass a consumer clock name for devices with unique clocks 2008-11-30 17:38:14 +00:00
amba-pl011.c [ARM] amba drivers: don't pass a consumer clock name for devices with unique clocks 2008-11-30 17:38:14 +00:00
atmel_serial.c atmel_serial might lose modem status change 2009-02-18 15:37:55 -08:00
bfin_5xx.c Blackfin Serial Driver: Remove BI status for known_good_char 2009-01-02 10:19:35 -08:00
bfin_sport_uart.c __FUNCTION__ is gcc-specific, use __func__ 2009-01-02 10:19:42 -08:00
bfin_sport_uart.h
clps711x.c
crisv10.c trivial: fix then -> than typos in comments and documentation 2009-01-06 11:28:06 +01:00
crisv10.h [CRIS] Move header files from include to arch/cris/include. 2008-10-29 17:29:44 +01:00
dz.c
dz.h
icom.c
icom.h
imx.c [ARM] MXC: remove dependency to other include files from irqs.h 2008-12-18 16:40:11 +01:00
ioc3_serial.c [IA64] Fix section mismatch ioc3uart_init()/ioc3uart_submodule 2008-12-09 10:08:51 -08:00
ioc4_serial.c
ip22zilog.c
ip22zilog.h
Kconfig MIPS: enable serial UART support on PNX833X devices. 2009-01-27 07:37:15 -08:00
kgdboc.c
m32r_sio_reg.h
m32r_sio.c
m32r_sio.h
Makefile serial: Add driver for the Cell Network Processor serial port NWP device 2009-01-08 16:25:18 +11:00
mcf.c m68knommu: fix ColdFire 5272 serial baud rates in mcf.c 2009-01-27 16:42:00 +10:00
mpc52xx_uart.c powerpc/mpc5200: fix error paths in PSC UART probe function 2008-12-21 02:54:32 -07:00
mpsc.c
mux.c
netx-serial.c [ARM] build fixes for netX serial driver 2008-10-30 09:41:59 +01:00
nwpserial.c serial: Add driver for the Cell Network Processor serial port NWP device 2009-01-08 16:25:18 +11:00
of_serial.c serial: Add 16850 uart type support to OF uart driver 2009-01-16 16:15:17 +11:00
pmac_zilog.c serial/pmac_zilog: Add console polling support 2008-11-19 16:04:23 +11:00
pmac_zilog.h
pnx8xxx_uart.c When a break signal is detected, the next character should be ignored. 2009-01-15 12:48:36 -08:00
pxa.c Merge branch 'for-rmk' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 into devel 2008-12-02 22:07:40 +00:00
s3c24a0.c [ARM] S3C24A0: Serial port definitions and driver support. 2008-12-15 21:46:36 +00:00
s3c2400.c
s3c2410.c
s3c2412.c
s3c2440.c drivers/serial/s3c2440.c: fix typo in MODULE_LICENSE 2008-12-10 08:01:53 -08:00
s3c6400.c [ARM] S3C6400: serial support for S3C6400 and S3C6410 SoCs 2008-12-15 21:58:11 +00:00
sa1100.c
samsung.c [ARM] S3C: Remove cpufreq warnings for unset serial information 2008-12-18 16:35:56 +00:00
samsung.h [ARM] S3C: Update serial driver IRQ handling 2008-12-15 23:02:39 +00:00
sb1250-duart.c
sc26xx.c
serial_core.c serial: struct device - replace bus_id with dev_name(), dev_set_name() 2009-01-06 10:44:37 -08:00
serial_cs.c
serial_ks8695.c
serial_lh7a40x.c [ARM] lh7a40x: avoid polluting the kernel's namespace 2008-11-28 16:39:04 +00:00
serial_txx9.c serial_txx9: use %lx for iobase 2008-10-20 08:50:24 -07:00
sh-sci.c serial: sh-sci: Fix up port pinmux for SH7366. 2008-12-22 18:44:49 +09:00
sh-sci.h sh: fix sh-sci / early printk build on sh7723 2009-01-21 17:44:32 +09:00
sn_console.c Altix serial: fix 2008-10-20 08:52:36 -07:00
suncore.c
suncore.h
sunhv.c
sunsab.c
sunsab.h
sunsu.c
sunzilog.c
sunzilog.h
uartlite.c powerpc/virtex: fix various format/casting printk mismatches 2008-11-14 09:59:48 -07:00
ucc_uart.c Merge branch 'genirq-v28-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip 2008-10-20 13:23:01 -07:00
vr41xx_siu.c
zs.c
zs.h