• Ryan Bradetich's avatar
    [PARISC] Define port->timeout to fix a long msleep in mux.c · a137ce85
    Ryan Bradetich authored
    This commit is in response to a bug reported by Vesa on the irc channel
    a couple of weeks ago.
    
    The bug was that the console would apparently hang (not return) while
    using the mux console.
    
    The root cause of this bug is that bash (with readline support) makes a
    call to the tcsetattr() glibc function with the argument TCSADRAIN.  This
    causes the serial core in the kernel use the uart_wait_until_sent() to be
    called. This function verifies the mux transmit queue is empty or calls the
    msleep_interruptable() with a calculated timeout value that is dependant
    upon the port->timeout variable.
    
    The real problem here is that the port->timeout was not defined so it
    was defaulted to 0 and the timeout calculation performs the following
    calculation:
    
    char_time = (port->timeout - HZ/50) / port->fifosize;
    
    where char_time is an unsigned long. Since the serial Mux does not use
    interrupts, the msleep_interruptable() function waits until the timeout
    has been reached ... and when the port->timeout < HZ/50 this timeout will
    be a long time. (I have validated that the console will eventually
    return ... but it takes quite a while for this to happen).
    
    This patch simply sets the port->timeout on the Mux to HZ/50 to avoid
    this long timeout period.
    Signed-off-by: default avatarRyan Bradetich <rbrad@parisc-linux.org>
    Signed-off-by: default avatarKyle McMartin <kyle@parisc-linux.org>
    a137ce85
mux.c 12.3 KB