summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVandana Salve <vsalve@nvidia.com>2011-05-06 12:21:01 +0530
committerNiket Sirsi <nsirsi@nvidia.com>2011-05-09 18:00:22 -0700
commit952e0e908ab4dcd61eaab0ad8fef3e42fe5f8fce (patch)
treef723e71a4b159b9bf169c7bfbc8cf51542542534
parent6d750e0fafe6833b7d59abf576e5a9c536919e02 (diff)
serial: core: Restore termios settings on 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 Cherry-picked http://git-master/r/#change,20302 Bug 819016 Change-Id: Ic7ce0a6d595c0e1f65285d7978db93be12158f0f Reviewed-on: http://git-master/r/30680 Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> Tested-by: Bharat Nihalani <bnihalani@nvidia.com>
-rw-r--r--drivers/serial/serial_core.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
index dbbd4347a8a6..4c008f08a987 100644
--- a/drivers/serial/serial_core.c
+++ b/drivers/serial/serial_core.c
@@ -2067,6 +2067,17 @@ 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);