mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-28 16:56:26 +00:00
Serial driver fixes for 6.13-rc3
Here are two small serial driver fixes for 6.13-rc3. They are: - ioport build fallout fix for the 8250 port driver that should resolve Guenter's runtime problems - sh-sci driver bugfix for a reported problem Both of these have been in linux-next for a while with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCZ12XXg8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ymGXACfezq1bc3UAJeZqZcDhAQrhZKiLHsAoMx76hi1 Ol6uRsbGrVi5bITDnuhl =wF8l -----END PGP SIGNATURE----- Merge tag 'tty-6.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty Pull serial driver fixes from Greg KH: "Here are two small serial driver fixes for 6.13-rc3. They are: - ioport build fallout fix for the 8250 port driver that should resolve Guenter's runtime problems - sh-sci driver bugfix for a reported problem Both of these have been in linux-next for a while with no reported issues" * tag 'tty-6.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: tty: serial: Work around warning backtrace in serial8250_set_defaults serial: sh-sci: Check if TX data was written to device in .tx_empty()
This commit is contained in:
commit
636110be62
@ -467,7 +467,8 @@ static void set_io_from_upio(struct uart_port *p)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
WARN(1, "Unsupported UART type %x\n", p->iotype);
|
WARN(p->iotype != UPIO_PORT || p->iobase,
|
||||||
|
"Unsupported UART type %x\n", p->iotype);
|
||||||
p->serial_in = no_serial_in;
|
p->serial_in = no_serial_in;
|
||||||
p->serial_out = no_serial_out;
|
p->serial_out = no_serial_out;
|
||||||
}
|
}
|
||||||
|
@ -157,6 +157,7 @@ struct sci_port {
|
|||||||
|
|
||||||
bool has_rtscts;
|
bool has_rtscts;
|
||||||
bool autorts;
|
bool autorts;
|
||||||
|
bool tx_occurred;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SCI_NPORTS CONFIG_SERIAL_SH_SCI_NR_UARTS
|
#define SCI_NPORTS CONFIG_SERIAL_SH_SCI_NR_UARTS
|
||||||
@ -850,6 +851,7 @@ static void sci_transmit_chars(struct uart_port *port)
|
|||||||
{
|
{
|
||||||
struct tty_port *tport = &port->state->port;
|
struct tty_port *tport = &port->state->port;
|
||||||
unsigned int stopped = uart_tx_stopped(port);
|
unsigned int stopped = uart_tx_stopped(port);
|
||||||
|
struct sci_port *s = to_sci_port(port);
|
||||||
unsigned short status;
|
unsigned short status;
|
||||||
unsigned short ctrl;
|
unsigned short ctrl;
|
||||||
int count;
|
int count;
|
||||||
@ -885,6 +887,7 @@ static void sci_transmit_chars(struct uart_port *port)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sci_serial_out(port, SCxTDR, c);
|
sci_serial_out(port, SCxTDR, c);
|
||||||
|
s->tx_occurred = true;
|
||||||
|
|
||||||
port->icount.tx++;
|
port->icount.tx++;
|
||||||
} while (--count > 0);
|
} while (--count > 0);
|
||||||
@ -1241,6 +1244,8 @@ static void sci_dma_tx_complete(void *arg)
|
|||||||
if (kfifo_len(&tport->xmit_fifo) < WAKEUP_CHARS)
|
if (kfifo_len(&tport->xmit_fifo) < WAKEUP_CHARS)
|
||||||
uart_write_wakeup(port);
|
uart_write_wakeup(port);
|
||||||
|
|
||||||
|
s->tx_occurred = true;
|
||||||
|
|
||||||
if (!kfifo_is_empty(&tport->xmit_fifo)) {
|
if (!kfifo_is_empty(&tport->xmit_fifo)) {
|
||||||
s->cookie_tx = 0;
|
s->cookie_tx = 0;
|
||||||
schedule_work(&s->work_tx);
|
schedule_work(&s->work_tx);
|
||||||
@ -1731,6 +1736,19 @@ static void sci_flush_buffer(struct uart_port *port)
|
|||||||
s->cookie_tx = -EINVAL;
|
s->cookie_tx = -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sci_dma_check_tx_occurred(struct sci_port *s)
|
||||||
|
{
|
||||||
|
struct dma_tx_state state;
|
||||||
|
enum dma_status status;
|
||||||
|
|
||||||
|
if (!s->chan_tx)
|
||||||
|
return;
|
||||||
|
|
||||||
|
status = dmaengine_tx_status(s->chan_tx, s->cookie_tx, &state);
|
||||||
|
if (status == DMA_COMPLETE || status == DMA_IN_PROGRESS)
|
||||||
|
s->tx_occurred = true;
|
||||||
|
}
|
||||||
#else /* !CONFIG_SERIAL_SH_SCI_DMA */
|
#else /* !CONFIG_SERIAL_SH_SCI_DMA */
|
||||||
static inline void sci_request_dma(struct uart_port *port)
|
static inline void sci_request_dma(struct uart_port *port)
|
||||||
{
|
{
|
||||||
@ -1740,6 +1758,10 @@ static inline void sci_free_dma(struct uart_port *port)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sci_dma_check_tx_occurred(struct sci_port *s)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
#define sci_flush_buffer NULL
|
#define sci_flush_buffer NULL
|
||||||
#endif /* !CONFIG_SERIAL_SH_SCI_DMA */
|
#endif /* !CONFIG_SERIAL_SH_SCI_DMA */
|
||||||
|
|
||||||
@ -2076,6 +2098,12 @@ static unsigned int sci_tx_empty(struct uart_port *port)
|
|||||||
{
|
{
|
||||||
unsigned short status = sci_serial_in(port, SCxSR);
|
unsigned short status = sci_serial_in(port, SCxSR);
|
||||||
unsigned short in_tx_fifo = sci_txfill(port);
|
unsigned short in_tx_fifo = sci_txfill(port);
|
||||||
|
struct sci_port *s = to_sci_port(port);
|
||||||
|
|
||||||
|
sci_dma_check_tx_occurred(s);
|
||||||
|
|
||||||
|
if (!s->tx_occurred)
|
||||||
|
return TIOCSER_TEMT;
|
||||||
|
|
||||||
return (status & SCxSR_TEND(port)) && !in_tx_fifo ? TIOCSER_TEMT : 0;
|
return (status & SCxSR_TEND(port)) && !in_tx_fifo ? TIOCSER_TEMT : 0;
|
||||||
}
|
}
|
||||||
@ -2247,6 +2275,7 @@ static int sci_startup(struct uart_port *port)
|
|||||||
|
|
||||||
dev_dbg(port->dev, "%s(%d)\n", __func__, port->line);
|
dev_dbg(port->dev, "%s(%d)\n", __func__, port->line);
|
||||||
|
|
||||||
|
s->tx_occurred = false;
|
||||||
sci_request_dma(port);
|
sci_request_dma(port);
|
||||||
|
|
||||||
ret = sci_request_irq(s);
|
ret = sci_request_irq(s);
|
||||||
|
Loading…
Reference in New Issue
Block a user