Skip to content

Commit

Permalink
[PATCH] serial: make sure UART is powered up when dumping MCTRL status
Browse files Browse the repository at this point in the history
Since serial devices are powered down when not in use and some of those
devices cannot be accessed when powered down, we need to enable power
around calls to get_mcrtl() when dumping port state via uart_line_info().
This resolves hangs observed on some machines while reading serial device
registers when a port is powered off.

Signed-off-by: George G. Davis <[email protected]>
Cc: Russell King <[email protected]>
Cc: Alan Cox <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
George G. Davis authored and Linus Torvalds committed Feb 14, 2007
1 parent 9b22271 commit 3689a0e
Showing 1 changed file with 11 additions and 0 deletions.
11 changes: 11 additions & 0 deletions drivers/serial/serial_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1660,6 +1660,7 @@ static const char *uart_type(struct uart_port *port)
static int uart_line_info(char *buf, struct uart_driver *drv, int i)
{
struct uart_state *state = drv->state + i;
int pm_state;
struct uart_port *port = state->port;
char stat_buf[32];
unsigned int status;
Expand All @@ -1682,9 +1683,16 @@ static int uart_line_info(char *buf, struct uart_driver *drv, int i)

if(capable(CAP_SYS_ADMIN))
{
mutex_lock(&state->mutex);
pm_state = state->pm_state;
if (pm_state)
uart_change_pm(state, 0);
spin_lock_irq(&port->lock);
status = port->ops->get_mctrl(port);
spin_unlock_irq(&port->lock);
if (pm_state)
uart_change_pm(state, pm_state);
mutex_unlock(&state->mutex);

ret += sprintf(buf + ret, " tx:%d rx:%d",
port->icount.tx, port->icount.rx);
Expand Down Expand Up @@ -2100,6 +2108,9 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state,

uart_report_port(drv, port);

/* Power up port for set_mctrl() */
uart_change_pm(state, 0);

/*
* Ensure that the modem control lines are de-activated.
* We probably don't need a spinlock around this, but
Expand Down

0 comments on commit 3689a0e

Please sign in to comment.