diff options
author | puneet saxena <puneets@nvidia.com> | 2011-02-21 18:02:19 +0530 |
---|---|---|
committer | Niket Sirsi <nsirsi@nvidia.com> | 2011-05-27 15:41:40 -0700 |
commit | ecff184b5594382c89798f6ffe8fb6dd1917f77c (patch) | |
tree | cb80cee1b06d96107794001071b6b8f1ab2f6abf /drivers/serial | |
parent | 8763ac9215a8779c382839e68c4063ce4b8334a9 (diff) |
serial: core: restore termios settings when resume console ports
The commit 4547be7 rewrites suspend and resume functions. According
to this rewrite, when a serial port is a printk console device and
can suspend(without set no_console_suspend flag), it will definitely
call set_termios function during its resume, but parameter termios
isn't initialized, this will pass an unpredictable config to the
serial port. If this serial port is not a userspace opened tty device
, a suspend and resume action will make this serial port unusable.
I.E. ttyS0 is a printk console device, ttyS1 or keyboard+display is
userspace tty device, a suspend/resume action will make ttyS0
unusable.
If a serial port is both a printk console device and an opened tty
device, this issue can be overcome because it will call set_termios
again with the correct parameter in the uart_change_speed function.
Refer to the deleted content of commit 4547be7, revert parts relate
to restore settings into parameter termios. It is safe because if
a serial port is a printk console only device, the only meaningful
field in termios is c_cflag and its old config is saved in
uport->cons->cflag, if this port is also an opened tty device,
it will clear uport->cons->cflag in the uart_open and the old config
is saved in tty->termios.
refer http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.37.y.git;
a=commit;h=891b9dd10764352926e1e107756aa229dfa2c210
cherry-pick the changes from the kernel 2.6.37 commit id
:891b9dd10764352926e1e107756aa229dfa2c210
Bug 758845
Change-Id: I0420321598514524bf21fa90c269c1493cf66488
Reviewed-on: http://git-master/r/20302
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Tested-by: Bharat Nihalani <bnihalani@nvidia.com>
Reviewed-by: Alex Courbot <acourbot@nvidia.com>
Tested-by: Alex Courbot <acourbot@nvidia.com>
Reviewed-by: Puneet Saxena <puneets@nvidia.com>
Tested-by: Puneet Saxena <puneets@nvidia.com>
Diffstat (limited to 'drivers/serial')
-rw-r--r-- | drivers/serial/serial_core.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c index dbbd4347a8a6..bed21368495e 100644 --- a/drivers/serial/serial_core.c +++ b/drivers/serial/serial_core.c @@ -2067,6 +2067,18 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) * Re-enable the console device after suspending. */ if (console_suspend_enabled && uart_console(uport)) { + /* + * First try to use the console cflag setting. + */ + memset(&termios, 0, sizeof(struct ktermios)); + termios.c_cflag = uport->cons->cflag; + + /* + * If that's unset, use the tty termios setting. + */ + if (port->tty && port->tty->termios && termios.c_cflag == 0) + termios = *(port->tty->termios); + uart_change_pm(state, 0); uport->ops->set_termios(uport, &termios, NULL); console_start(uport->cons); |