Skip to content

Commit

Permalink
serial: avoid stalling suspend if serial port won't drain
Browse files Browse the repository at this point in the history
Some ports seem to be unable to drain their transmitters on shut down.  Such a
problem can occur if the port is programmed for hardware imposed flow control,
characters are in the FIFO but the CTS signal is inactive.

Normally, this isn't a problem because most places where we wait for the
transmitter to drain have a time-out.  However, there is no timeout in the
suspend path.

Give a port 30ms to drain; this is an arbitary value chosen to avoid long
delays if there are many such ports in the system, while giving a reasonable
chance for a single port to drain.  Should a port not drain within this
timeout, issue a warning.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Acked-by: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Russell King authored and Linus Torvalds committed Feb 5, 2008
1 parent 9d778a6 commit c8c6bfa
Showing 1 changed file with 7 additions and 1 deletion.
8 changes: 7 additions & 1 deletion drivers/serial/serial_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1977,6 +1977,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *port)

if (state->info && state->info->flags & UIF_INITIALIZED) {
const struct uart_ops *ops = port->ops;
int tries;

state->info->flags = (state->info->flags & ~UIF_INITIALIZED)
| UIF_SUSPENDED;
Expand All @@ -1990,9 +1991,14 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *port)
/*
* Wait for the transmitter to empty.
*/
while (!ops->tx_empty(port)) {
for (tries = 3; !ops->tx_empty(port) && tries; tries--) {
msleep(10);
}
if (!tries)
printk(KERN_ERR "%s%s%s%d: Unable to drain transmitter\n",
port->dev ? port->dev->bus_id : "",
port->dev ? ": " : "",
drv->dev_name, port->line);

ops->shutdown(port);
}
Expand Down

0 comments on commit c8c6bfa

Please sign in to comment.