Revert "serial: 8250: Fix reporting real baudrate value in c_ospeed field"
PATCH 1/1 Revert "serial: 8250: Fix reporting real baudrate value in c_ospeed field"
This reverts commit 32262e2e429cdb31f9e957e997d53458762931b7.
The commit in question claims to determine the inverse of serial8250_get_divisor() but failed to notice that some drivers override the default implementation using a get_divisor() callback.
This means that the computed line-speed values can be completely wrong and results in regular TCSETS requests failing (the incorrect values would also be passed to any overridden set_divisor() callback).
Similarly, it also failed to honour the old (deprecated) ASYNC_SPD_FLAGS and would break applications relying on those when re-encoding the actual line speed.
There are also at least two quirks, UART_BUG_QUOT and an OMAP1510 workaround, which were happily ignored and that are now broken.
Finally, even if the offending commit were to be implemented correctly, this is a new feature and not something which should be backported to stable.
--- drivers/tty/serial/8250/8250_port.c | 17 ----------------- 1 file changed, 17 deletions(-)
drivers/tty/serial/8250/8250_port.c +0 -17
@@ -2584,19 +2584,6 @@ static unsigned int serial8250_get_divisor(struct uart_port *port,return serial8250_do_get_divisor (port, baud, frac); } -static unsigned int serial8250_compute_baud_rate (struct uart_port *port, -unsigned int quot) -{ -if ((port->flags &UPF_MAGIC_MULTIPLIER ) && quot ==0x8001 ) -return port->uartclk /4 ; -else if ((port->flags &UPF_MAGIC_MULTIPLIER ) && quot ==0x8002 ) -return port->uartclk /8 ; -else if (port->type ==PORT_NPCM ) -return DIV_ROUND_CLOSEST (port->uartclk -2 * (quot +2 ),16 * (quot +2 )); -else -return DIV_ROUND_CLOSEST (port->uartclk,16 * quot); -} -static unsigned char serial8250_compute_lcr (struct uart_8250_port *up,tcflag_t c_cflag) {
@@ -2727,14 +2714,11 @@ void serial8250_update_uartclk(struct uart_port *port, unsigned int uartclk) baud =serial8250_get_baud_rate (port, termios,NULL ); quot =serial8250_get_divisor (port, baud, &frac); - baud =serial8250_compute_baud_rate (port, quot);serial8250_rpm_get (up);spin_lock_irqsave (&port->lock, flags);uart_update_timeout (port, termios->c_cflag, baud); -if (tty_termios_baud_rate (termios)) -tty_termios_encode_baud_rate (termios, baud, baud);serial8250_set_divisor (port, baud, quot, frac);serial_port_out (port,UART_LCR , up->lcr);
@@ -2766,7 +2750,6 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, baud =serial8250_get_baud_rate (port, termios, old); quot =serial8250_get_divisor (port, baud, &frac); - baud =serial8250_compute_baud_rate (port, quot);/* * Ok, we're now changing the port state. Do it with
Signature · 1 line
2.32.0
Greg Kroah-Hartman
maintainerQuoted 21 lines · Johan Hovold
This reverts commit
32262e2e429cdb31f9e957e997d53458762931b7.The commit in question claims to determine the inverse of
serial8250_get_divisor()but failed to notice that some drivers override the default implementation using aget_divisor()callback.This means that the computed line-speed values can be completely wrong and results in regular TCSETS requests failing (the incorrect values would also be passed to any overridden
set_divisor()callback).Similarly, it also failed to honour the old (deprecated)
ASYNC_SPD_FLAGSand would break applications relying on those when re-encoding the actual line speed.There are also at least two quirks,
UART_BUG_QUOTand an OMAP1510 workaround, which were happily ignored and that are now broken.Finally, even if the offending commit were to be implemented correctly, this is a new feature and not something which should be backported to stable.
Quoted 5 lines
Cc Pali Rohár <[email protected]>Signed-off-by Johan Hovold <[email protected]>--- drivers/tty/serial/8250/8250_port.c | 17 ----------------- 1 file changed, 17 deletions(-)
Argh, sorry I missed this, good catch. I'll go queue this up now, thanks.
greg k-h
Quoted 28 lines · On Thursday 07 October 2021 16:21:30 Greg Kroah-Hartman wrote:
Quoted 21 lines · Johan Hovold
This reverts commit
32262e2e429cdb31f9e957e997d53458762931b7.The commit in question claims to determine the inverse of
serial8250_get_divisor()but failed to notice that some drivers override the default implementation using aget_divisor()callback.This means that the computed line-speed values can be completely wrong and results in regular TCSETS requests failing (the incorrect values would also be passed to any overridden
set_divisor()callback).Similarly, it also failed to honour the old (deprecated)
ASYNC_SPD_FLAGSand would break applications relying on those when re-encoding the actual line speed.There are also at least two quirks,
UART_BUG_QUOTand an OMAP1510 workaround, which were happily ignored and that are now broken.Finally, even if the offending commit were to be implemented correctly, this is a new feature and not something which should be backported to stable.
Quoted 5 lines
Cc Pali Rohár <[email protected]>Signed-off-by Johan Hovold <[email protected]>--- drivers/tty/serial/8250/8250_port.c | 17 ----------------- 1 file changed, 17 deletions(-)
Quoted 4 lines
Argh, sorry I missed this, good catch. I'll go queue this up now, thanks.
greg k-h
I was waiting for a reply in discussion for this patch...
https://lore.kernel.org/linux-serial/[email protected]/t/#u
There was no reply, so I was surprised it was taken without any reaction. I was really in impression that patch is waiting.
So sorry for that.
Johan, could you write comments below original patch, so discussion is not on two places? I would really like to fix this issue because c_ospeed contains incorrect value.