TTY/Serial driver fixes for 5.19-rc3
Here are some small tty and serial driver fixes for 5.19-rc3 to resolve some reported problems: - 8250 lsr read bugfix - n_gsm line discipline allocation fix - qcom serial driver fix for reported lockups that happened in -rc1 - goldfish tty driver fix All have been in linux-next for a while now with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCYqw29w8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ylqwQCeOMgta9/JxaK4WDeinHB9uxP4iJ0AoNjFo4VD zfVZ094HuzuFG+R8Otyo =d5Ms -----END PGP SIGNATURE----- Merge tag 'tty-5.19-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty Pull tty/serial driver fixes from Greg KH: "Here are some small tty and serial driver fixes for 5.19-rc3 to resolve some reported problems: - 8250 lsr read bugfix - n_gsm line discipline allocation fix - qcom serial driver fix for reported lockups that happened in -rc1 - goldfish tty driver fix All have been in linux-next for a while now with no reported issues" * tag 'tty-5.19-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: serial: 8250: Store to lsr_save_flags after lsr read tty: goldfish: Fix free_irq() on remove tty: serial: qcom-geni-serial: Implement start_rx callback serial: core: Introduce callback for start_rx and do stop_rx in suspend only if this callback implementation is present. tty: n_gsm: Debug output allocation must use GFP_ATOMIC
This commit is contained in:
Коммит
62dcd5e198
|
@ -426,7 +426,7 @@ static int goldfish_tty_remove(struct platform_device *pdev)
|
|||
tty_unregister_device(goldfish_tty_driver, qtty->console.index);
|
||||
iounmap(qtty->base);
|
||||
qtty->base = NULL;
|
||||
free_irq(qtty->irq, pdev);
|
||||
free_irq(qtty->irq, qtty);
|
||||
tty_port_destroy(&qtty->port);
|
||||
goldfish_tty_current_line_count--;
|
||||
if (goldfish_tty_current_line_count == 0)
|
||||
|
|
|
@ -455,7 +455,7 @@ static void gsm_hex_dump_bytes(const char *fname, const u8 *data,
|
|||
return;
|
||||
}
|
||||
|
||||
prefix = kasprintf(GFP_KERNEL, "%s: ", fname);
|
||||
prefix = kasprintf(GFP_ATOMIC, "%s: ", fname);
|
||||
if (!prefix)
|
||||
return;
|
||||
print_hex_dump(KERN_INFO, prefix, DUMP_PREFIX_OFFSET, 16, 1, data, len,
|
||||
|
|
|
@ -1517,6 +1517,8 @@ static inline void __stop_tx(struct uart_8250_port *p)
|
|||
unsigned char lsr = serial_in(p, UART_LSR);
|
||||
u64 stop_delay = 0;
|
||||
|
||||
p->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
|
||||
|
||||
if (!(lsr & UART_LSR_THRE))
|
||||
return;
|
||||
/*
|
||||
|
|
|
@ -1306,6 +1306,7 @@ static const struct uart_ops qcom_geni_console_pops = {
|
|||
.stop_tx = qcom_geni_serial_stop_tx,
|
||||
.start_tx = qcom_geni_serial_start_tx,
|
||||
.stop_rx = qcom_geni_serial_stop_rx,
|
||||
.start_rx = qcom_geni_serial_start_rx,
|
||||
.set_termios = qcom_geni_serial_set_termios,
|
||||
.startup = qcom_geni_serial_startup,
|
||||
.request_port = qcom_geni_serial_request_port,
|
||||
|
|
|
@ -2214,11 +2214,12 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport)
|
|||
/*
|
||||
* Nothing to do if the console is not suspending
|
||||
* except stop_rx to prevent any asynchronous data
|
||||
* over RX line. Re-start_rx, when required, is
|
||||
* done by set_termios in resume sequence
|
||||
* over RX line. However ensure that we will be
|
||||
* able to Re-start_rx later.
|
||||
*/
|
||||
if (!console_suspend_enabled && uart_console(uport)) {
|
||||
uport->ops->stop_rx(uport);
|
||||
if (uport->ops->start_rx)
|
||||
uport->ops->stop_rx(uport);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
|
@ -2310,6 +2311,8 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
|
|||
if (console_suspend_enabled)
|
||||
uart_change_pm(state, UART_PM_STATE_ON);
|
||||
uport->ops->set_termios(uport, &termios, NULL);
|
||||
if (!console_suspend_enabled && uport->ops->start_rx)
|
||||
uport->ops->start_rx(uport);
|
||||
if (console_suspend_enabled)
|
||||
console_start(uport->cons);
|
||||
}
|
||||
|
|
|
@ -45,6 +45,7 @@ struct uart_ops {
|
|||
void (*unthrottle)(struct uart_port *);
|
||||
void (*send_xchar)(struct uart_port *, char ch);
|
||||
void (*stop_rx)(struct uart_port *);
|
||||
void (*start_rx)(struct uart_port *);
|
||||
void (*enable_ms)(struct uart_port *);
|
||||
void (*break_ctl)(struct uart_port *, int ctl);
|
||||
int (*startup)(struct uart_port *);
|
||||
|
|
Загрузка…
Ссылка в новой задаче