• Mauro Carvalho Chehab's avatar
    8250: fix boot hang with serial console when using with Serial Over Lan port · b6adea33
    Mauro Carvalho Chehab authored
    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 7500b1f6.
    
    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: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
    Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
    Cc: <stable@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    b6adea33
8250.c 80.5 KB