From: Greg Kroah-Hartman Date: Sun, 14 Nov 2021 12:25:44 +0000 (+0100) Subject: 4.9-stable patches X-Git-Tag: v5.4.160~111 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0b30f862f9e7bffe081a22e1f96ba3eae93e3f5e;p=thirdparty%2Fkernel%2Fstable-queue.git 4.9-stable patches added patches: powerpc-85xx-fix-oops-when-mpc85xx_smp_guts_ids-node-cannot-be-found.patch serial-core-fix-initializing-and-restoring-termios-speed.patch --- diff --git a/queue-4.9/powerpc-85xx-fix-oops-when-mpc85xx_smp_guts_ids-node-cannot-be-found.patch b/queue-4.9/powerpc-85xx-fix-oops-when-mpc85xx_smp_guts_ids-node-cannot-be-found.patch new file mode 100644 index 00000000000..378dfa5d1d4 --- /dev/null +++ b/queue-4.9/powerpc-85xx-fix-oops-when-mpc85xx_smp_guts_ids-node-cannot-be-found.patch @@ -0,0 +1,37 @@ +From 3c2172c1c47b4079c29f0e6637d764a99355ebcd Mon Sep 17 00:00:00 2001 +From: Xiaoming Ni +Date: Wed, 29 Sep 2021 11:36:45 +0800 +Subject: powerpc/85xx: Fix oops when mpc85xx_smp_guts_ids node cannot be found + +From: Xiaoming Ni + +commit 3c2172c1c47b4079c29f0e6637d764a99355ebcd upstream. + +When the field described in mpc85xx_smp_guts_ids[] is not configured in +dtb, the mpc85xx_setup_pmc() does not assign a value to the "guts" +variable. As a result, the oops is triggered when +mpc85xx_freeze_time_base() is executed. + +Fixes: 56f1ba280719 ("powerpc/mpc85xx: refactor the PM operations") +Cc: stable@vger.kernel.org # v4.6+ +Signed-off-by: Xiaoming Ni +Signed-off-by: Michael Ellerman +Link: https://lore.kernel.org/r/20210929033646.39630-2-nixiaoming@huawei.com +Signed-off-by: Greg Kroah-Hartman +--- + arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c ++++ b/arch/powerpc/platforms/85xx/mpc85xx_pm_ops.c +@@ -98,9 +98,8 @@ int __init mpc85xx_setup_pmc(void) + pr_err("Could not map guts node address\n"); + return -ENOMEM; + } ++ qoriq_pm_ops = &mpc85xx_pm_ops; + } + +- qoriq_pm_ops = &mpc85xx_pm_ops; +- + return 0; + } diff --git a/queue-4.9/serial-core-fix-initializing-and-restoring-termios-speed.patch b/queue-4.9/serial-core-fix-initializing-and-restoring-termios-speed.patch new file mode 100644 index 00000000000..177e2a417e4 --- /dev/null +++ b/queue-4.9/serial-core-fix-initializing-and-restoring-termios-speed.patch @@ -0,0 +1,111 @@ +From 027b57170bf8bb6999a28e4a5f3d78bf1db0f90c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pali=20Roh=C3=A1r?= +Date: Sat, 2 Oct 2021 15:09:00 +0200 +Subject: serial: core: Fix initializing and restoring termios speed +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Pali Rohár + +commit 027b57170bf8bb6999a28e4a5f3d78bf1db0f90c upstream. + +Since commit edc6afc54968 ("tty: switch to ktermios and new framework") +termios speed is no longer stored only in c_cflag member but also in new +additional c_ispeed and c_ospeed members. If BOTHER flag is set in c_cflag +then termios speed is stored only in these new members. + +Therefore to correctly restore termios speed it is required to store also +ispeed and ospeed members, not only cflag member. + +In case only cflag member with BOTHER flag is restored then functions +tty_termios_baud_rate() and tty_termios_input_baud_rate() returns baudrate +stored in c_ospeed / c_ispeed member, which is zero as it was not restored +too. If reported baudrate is invalid (e.g. zero) then serial core functions +report fallback baudrate value 9600. So it means that in this case original +baudrate is lost and kernel changes it to value 9600. + +Simple reproducer of this issue is to boot kernel with following command +line argument: "console=ttyXXX,86400" (where ttyXXX is the device name). +For speed 86400 there is no Bnnn constant and therefore kernel has to +represent this speed via BOTHER c_cflag. Which means that speed is stored +only in c_ospeed and c_ispeed members, not in c_cflag anymore. + +If bootloader correctly configures serial device to speed 86400 then kernel +prints boot log to early console at speed speed 86400 without any issue. +But after kernel starts initializing real console device ttyXXX then speed +is changed to fallback value 9600 because information about speed was lost. + +This patch fixes above issue by storing and restoring also ispeed and +ospeed members, which are required for BOTHER flag. + +Fixes: edc6afc54968 ("[PATCH] tty: switch to ktermios and new framework") +Cc: stable@vger.kernel.org +Signed-off-by: Pali Rohár +Link: https://lore.kernel.org/r/20211002130900.9518-1-pali@kernel.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/tty/serial/serial_core.c | 16 ++++++++++++++-- + include/linux/console.h | 2 ++ + 2 files changed, 16 insertions(+), 2 deletions(-) + +--- a/drivers/tty/serial/serial_core.c ++++ b/drivers/tty/serial/serial_core.c +@@ -209,7 +209,11 @@ static int uart_port_startup(struct tty_ + if (retval == 0) { + if (uart_console(uport) && uport->cons->cflag) { + tty->termios.c_cflag = uport->cons->cflag; ++ tty->termios.c_ispeed = uport->cons->ispeed; ++ tty->termios.c_ospeed = uport->cons->ospeed; + uport->cons->cflag = 0; ++ uport->cons->ispeed = 0; ++ uport->cons->ospeed = 0; + } + /* + * Initialise the hardware port settings. +@@ -277,8 +281,11 @@ static void uart_shutdown(struct tty_str + /* + * Turn off DTR and RTS early. + */ +- if (uport && uart_console(uport) && tty) ++ if (uport && uart_console(uport) && tty) { + uport->cons->cflag = tty->termios.c_cflag; ++ uport->cons->ispeed = tty->termios.c_ispeed; ++ uport->cons->ospeed = tty->termios.c_ospeed; ++ } + + if (!tty || C_HUPCL(tty)) + uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS); +@@ -2059,8 +2066,11 @@ uart_set_options(struct uart_port *port, + * Allow the setting of the UART parameters with a NULL console + * too: + */ +- if (co) ++ if (co) { + co->cflag = termios.c_cflag; ++ co->ispeed = termios.c_ispeed; ++ co->ospeed = termios.c_ospeed; ++ } + + return 0; + } +@@ -2198,6 +2208,8 @@ int uart_resume_port(struct uart_driver + */ + memset(&termios, 0, sizeof(struct ktermios)); + termios.c_cflag = uport->cons->cflag; ++ termios.c_ispeed = uport->cons->ispeed; ++ termios.c_ospeed = uport->cons->ospeed; + + /* + * If that's unset, use the tty termios setting. +--- a/include/linux/console.h ++++ b/include/linux/console.h +@@ -135,6 +135,8 @@ struct console { + short flags; + short index; + int cflag; ++ uint ispeed; ++ uint ospeed; + void *data; + struct console *next; + }; diff --git a/queue-4.9/series b/queue-4.9/series index 6123e6d7cac..1ffc9698f4e 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -44,3 +44,5 @@ signal-remove-the-bogus-sigkill_pending-in-ptrace_stop.patch signal-mips-update-_save-_restore-_fp_context-to-fail-with-efault.patch power-supply-max17042_battery-prevent-int-underflow-in-set_soc_threshold.patch power-supply-max17042_battery-use-vfsoc-for-capacity-when-no-rsns.patch +powerpc-85xx-fix-oops-when-mpc85xx_smp_guts_ids-node-cannot-be-found.patch +serial-core-fix-initializing-and-restoring-termios-speed.patch